`

PL/SQL 编程入门

 
阅读更多

PL/SQL 是基于SQL 语言的一种扩展,是运行在Oracle服务器端的一种语句,以下给出PL/SQL 的基本使用方式

基本语法:

--数据类型
declare 
    type table_datatype is table of varchar2(50) index by binary_integer; --表类型
    v_table table_datatype;
    i_provider_id  int ;
    v_provider_name varchar(20);
    v_provider_address varchar(20);
    type record_datatype is record (
         id int ,
         name varchar(20),
         address varchar(20)
    );
    v_record record_datatype ;
begin 
    v_table(0) := '张三';
    v_table(1) := '李四';
    v_table(2) := '王五';
    dbms_output.put_line(v_table(0)||','||v_table(1)||','||v_table(2));
    --select into 的 语法必须返回单行,否则会出现错误
    select provider_id,provider_name,provider_address into i_provider_id,v_provider_name,v_provider_address from  t_provider_info where provider_id=1;
    dbms_output.put_line(i_provider_id||','||v_provider_name||','||v_provider_address);
    --select into 给table类型的变量赋值
    select provider_id,provider_name,provider_address into v_table(0),v_table(1),v_table(2) from  t_provider_info where provider_id=1;
    dbms_output.put_line('table:'||v_table(0)||','||v_table(1)||','||v_table(2));
    v_record.id :=1;
    v_record.name :='赵六';
    v_record.address :='广州';
    dbms_output.put_line(v_record.id||','|| v_record.name||','||v_record.address);
    select provider_id,provider_name,provider_address  into  v_record from  t_provider_info where provider_id=2;
    dbms_output.put_line(v_record.id||','|| v_record.name||','||v_record.address);
    --循环的语法 loop ,end loop exit when 
    declare 
      v_count int :=0 ;
    begin
    loop 
       v_count := v_count+1 ;
       exit  when v_count=5;
       dbms_output.put_line('v_count:'||v_count);                       
    end loop ;
    end ;
    --循环语法 when ,loop end loop;
    declare 
       v_count int :=0;
    begin
       while  v_count<>5 loop
       dbms_output.put_line('while 循环:v_count:'||v_count);  
       v_count := v_count+1;                     
       end loop ;
    end ;
    --循环语法 for loop end loop;
    declare 
       v_count int :=0;
    begin
       for v_ount in 2..5 loop 
       dbms_output.put_line('for 循环:v_count:'||v_count); 
       v_count :=v_count+1 ; 
       end loop ; 
    end ;
    
    -- if的语法
    declare 
       v_count int := 6 ;
    begin
       if  v_count=5 then 
       dbms_output.put_line('满足条件5:v_count:'||v_count);
       elsif  v_count=3 then
       dbms_output.put_line('满足条件3:v_count:'||v_count);
       else 
       dbms_output.put_line('不满足条件3、5:v_count:'||v_count);
       end if ;
    end ;
    --case when 的语法
    declare 
        v_count int :=2 ;
     begin 
        case v_count
        when 1 then 
        dbms_output.put_line('满足条件1:v_count:'||v_count);
        when 2 then 
        dbms_output.put_line('满足条件2:v_count:'||v_count);
        else 
        dbms_output.put_line('不满足条件1、2:v_count:'||v_count);
        end case ;
     end ;
     
     --游标的使用 ,使用fetch的方式遍历游标,必须显示打开和关闭游标
     declare 
        cursor c_cursor is select provider_id,provider_name,provider_address from t_provider_info ; --定义游标
        i_provider_id  int ;
        v_provider_name varchar(20);
        v_provider_address varchar(20);
     begin
         open c_cursor;--打开游标
         loop 
              fetch c_cursor  into i_provider_id,v_provider_name,v_provider_address;
              dbms_output.put_line('游标的使用:'||i_provider_id||','||v_provider_name||','||v_provider_address);
              exit  when  c_cursor%notfound ;
         end loop ;
         close c_cursor;
     end ;
     
     --使用for  循环的方式遍历游标 不需要显示打开后者关闭游标
     declare 
      cursor c_cursor is select provider_id,provider_name,provider_address from t_provider_info ; --定义游标
      c_row c_cursor%rowtype ; --定义一个游标变量
      begin
       for c_row in c_cursor loop 
           dbms_output.put_line('隐式游标的使用:v_provider_name'||c_row.provider_id);
       end loop;
      end ;
      
      --调用有返回值的存储过程
      declare 
        v_name varchar(20) ;
        v_id int ;
      begin 
        pro_provider_info(1,v_name,v_id);
        dbms_output.put_line('v_name:'||v_name||',v_id:'||v_id);
      end ;
end ;
/

 过程、触发器 函数的语法:

存储过程:

create or replace procedure pro_provider_info(id in int,name out varchar2,r_id out int)
as
  v_provider_name  varchar(50) := '广州发展中心';
  cursor c_cursor is select provider_id,provider_name,provider_address from t_provider_info where provider_id=id ; 
  --定义一个游标行的变量 
  c_row c_cursor%rowtype ;
  provider_id t_provider_info.provider_id%type ; --type 用来避免硬编码的错失
begin
   --隐式调用  
   for c_row in c_cursor loop
       provider_id := c_row.provider_id ;
       --更新对应的ID 的值
       if provider_id=id then 
       update t_provider_info set provider_name=v_provider_name where provider_id=id;
       name := v_provider_name;
       r_id := id;
       commit ;   
       end if ;
   end loop ;   
end ;

 触发器:

--触发器
create or replace trigger tri_provider_info
after insert or update or delete  on t_provider_info for each row
begin
      declare 
           v_insert varchar(20) :='插入操作' ;
           v_update varchar(20) :='更新操作' ;
           v_delete varchar(20) :='删除操作' ;
      begin
            if inserting then 
              insert into t_log(oper_id,oper_name) values(t_global_seq.nextval,v_insert);
              dbms_output.put_line('插入操作');
            elsif updating then
            --,:old.provider_id,:new.provider_id
              insert into t_log(oper_id,oper_name) values(t_global_seq.nextval,v_update);
              dbms_output.put_line('更新操作');    
            elsif deleting then
              insert into t_log(oper_id,oper_name) values(t_global_seq.nextval,v_delete);
              dbms_output.put_line('删除操作');
            else 
              dbms_output.put_line('无法明确的操作');   
            end if ;
            --commit ;  在触发器中不需要手动提交
      end ;
end ;
/

 

不断完善中

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics