轉載:http://blog.csdn.net/u013057786/article/details/17165623sql
一、定義
所謂存儲過程(Stored Procedure),就是一組用於完成特定數據庫功能的SQL語句集,該SQL語句集通過
編譯後存儲在數據庫系統中。在使用時候,用戶經過指定已經定義的存儲過程名字並給出相應的存儲過程參數
來調用並執行它,從而完成一個或一系列的數據庫操做。數據庫
二、存儲過程的建立
Oracle存儲過程包含三部分:過程聲明,執行過程部分,存儲過程異常。fetch
(1)無參存儲過程語法spa
create or replace procedure NoParPro as //聲明 ; begin // 執行 ; exception//存儲過程異常 ; end;
(2)帶參存儲過程實例.net
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表示該參數能夠向該過程當中傳遞值,也能夠將某個值傳出去。code
(4)存儲過程當中遊標定義使用blog
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;
(5)遊標的定義io
--顯示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)過程調用方式一
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)過程調用方式二
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)過程調用方式三(SQL命令行方式下)
1、SQL>exec proc_emp('參數1','參數2');//無返回值過程調用 2、SQL>var vsal number SQL> exec proc_emp ('參數1',:vsal);// 有返回值過程調用 或者:call proc_emp ('參數1',:vsal);// 有返回值過程調用