1. 程式人生 > >Oracle儲存過程以及遊標

Oracle儲存過程以及遊標

一.儲存過程

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);// 有返回值過程呼叫