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);// 有返回值過程調用?
?
?
?
總結
以上是生活随笔為你收集整理的Oracle存储过程以及游标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle的job(定时执行存储过程)
- 下一篇: 在pe怎么调分辨率 Pe如何修改分辨率