一.存储过程

1、存储过程定义
所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

2、存储过程的创建
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

1)无参存储过程语法:

create or replace procedure NoParPro  
  as  //声明  
  ;  
  begin // 执行  
  ;  
  exception//存储过程异常  
  ;  
  end;

2)带参存储过程实例

create or replace procedure queryempname(sfindno emp.empno%type)   
 as  
    sName emp.ename%type;  
    sjob emp.job%type;  
 begin  
        ....  
 exception  
        ....  
 end;

3)带参数存储过程含赋值方式

create or replace procedure runbyparmeters    
     (isal in emp.sal%type,   
      sname out varchar,  
      sjob in out varchar)  
  as   
     icount number;  
  begin  
       select count(*) into icount from emp where sal>isal and job=sjob;  
       if icount=1 then  
         ....  
       else  
        ....  
      end if;  
 exception  
      when too_many_rows then  
      DBMS_OUTPUT.PUT_LINE('返回值多于1行');  
      when others then  
      DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');  
 end;

详解:

其中参数IN表示输入参数,是参数的默认模式。
OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。
OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。

二.游标

1.游标概念

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。 

2.游标作用

概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针。游标提供了在逐行的基础上操作表中数据的方法。 游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。 大部分程序数据设计语言都能使用游标来检索SQL数据库中的数据,在程序中嵌入游标和在程序中嵌入SQL语句相同 。

1)存储过程游标定义使用:

as //定义(游标一个可以遍历的结果集)   
 CURSOR cur_1 IS   
   SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,  
          SUM(usd_amt)/10000 usd_amt_sn   
   FROM BGD_AREA_CM_M_BASE_T   
   WHERE ym >= vs_ym_sn_beg   
        AND ym <= vs_ym_sn_end   
   GROUP BY area_code,CMCODE;   
       
 begin //执行(常用For语句遍历游标)       
 FOR rec IN cur_1 LOOP   
   UPDATE xxxxxxxxxxx_T   
    SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn   
    WHERE area_code = rec.area_code   
    AND CMCODE = rec.CMCODE   
    AND ym = is_ym;   
 END LOOP;

2)游标定义

--显示cursor的处理
 declare  
 ---声明cursor,创建和命名一个sql工作区
 cursor cursor_name is  
     select real_name from account_hcz;
     v_realname varchar2(20);
 begin 
     open cursor_name;---打开cursor,执行sql语句产生的结果集
     fetch cursor_name into v_realname;--提取cursor,提取结果集中的记录
     dbms_output.put_line(v_realname);
     close cursor_name;--关闭cursor
 end;

三.在Oracle中对存储过程的调用使用

1)调用 方式1

declare  
       realsal emp.sal%type;  
       realname varchar(40);  
       realjob varchar(40);  
 begin   //过程调用开始  
       realsal:=1100;  
       realname:='';  
       realjob:='CLERK';  
       runbyparmeters(realsal,realname,realjob);--必须按顺序  
       DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB);  
 END;  //过程调用结束

2) 调用方式2

declare  
      realsal emp.sal%type;  
      realname varchar(40);  
      realjob varchar(40);  
 begin    //过程调用开始  
      realsal:=1100;  
      realname:='';  
      realjob:='CLERK';  
      --指定值对应变量顺序可变  
      runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob);           
     DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB);  
 END;  //过程调用结束

3)调用方式3(SQL命令行下)

1、SQL>exec  proc_emp('参数1','参数2');//无返回值过程调用  
2、SQL>var vsal number  
     SQL> exec proc_emp ('参数1',:vsal);// 有返回值过程调用  
      或者:call proc_emp ('参数1',:vsal);// 有返回值过程调用