Oracle存储过程以及游标
一.存儲(chǔ)過(guò)程
1、存儲(chǔ)過(guò)程定義
所謂存儲(chǔ)過(guò)程(Stored Procedure),就是一組用于完成特定數(shù)據(jù)庫(kù)功能的SQL語(yǔ)句集,該SQL語(yǔ)句集經(jīng)過(guò)
編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)系統(tǒng)中。在使用時(shí)候,用戶(hù)通過(guò)指定已經(jīng)定義的存儲(chǔ)過(guò)程名字并給出相應(yīng)的存儲(chǔ)過(guò)程參數(shù)
來(lái)調(diào)用并執(zhí)行它,從而完成一個(gè)或一系列的數(shù)據(jù)庫(kù)操作。
2、存儲(chǔ)過(guò)程的創(chuàng)建
Oracle存儲(chǔ)過(guò)程包含三部分:過(guò)程聲明,執(zhí)行過(guò)程部分,存儲(chǔ)過(guò)程異常。
1)無(wú)參存儲(chǔ)過(guò)程語(yǔ)法:
create or replace procedure NoParPro ?
?as ?//聲明 ?
?; ?
?begin // 執(zhí)行 ?
?; ?
?exception//存儲(chǔ)過(guò)程異常 ?
?; ?
?end;
2)帶參存儲(chǔ)過(guò)程實(shí)例
create or replace procedure queryempname(sfindno emp.empno%type) ??
as ?
? ?sName emp.ename%type; ?
? ?sjob emp.job%type; ?
begin ?
? ? ? ?.... ?
exception ?
? ? ? ?.... ?
end;
3)帶參數(shù)存儲(chǔ)過(guò)程含賦值方式
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過(guò)程中出錯(cuò)!'); ?
end;
詳解:
其中參數(shù)IN表示輸入?yún)?shù),是參數(shù)的默認(rèn)模式。
OUT表示返回值參數(shù),類(lèi)型可以使用任意Oracle中的合法類(lèi)型。
OUT模式定義的參數(shù)只能在過(guò)程體內(nèi)部賦值,表示該參數(shù)可以將某個(gè)值傳遞回調(diào)用他的過(guò)程
IN OUT表示該參數(shù)可以向該過(guò)程中傳遞值,也可以將某個(gè)值傳出去。
二.游標(biāo)
1.游標(biāo)概念
游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)充當(dāng)指針的作用。盡管游標(biāo)能遍歷結(jié)果中的所有行,但他一次只指向一行。?
2.游標(biāo)作用
概括來(lái)講,SQL的游標(biāo)是一種臨時(shí)的數(shù)據(jù)庫(kù)對(duì)象,即可以用來(lái)存放在數(shù)據(jù)庫(kù)表中的數(shù)據(jù)行副本,也可以指向存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)行的指針。游標(biāo)提供了在逐行的基礎(chǔ)上操作表中數(shù)據(jù)的方法。 游標(biāo)的一個(gè)常見(jiàn)用途就是保存查詢(xún)結(jié)果,以便以后使用。游標(biāo)的結(jié)果集是由SELECT語(yǔ)句產(chǎn)生,如果處理過(guò)程需要重復(fù)使用一個(gè)記錄集,那么創(chuàng)建一次游標(biāo)而重復(fù)使用若干次,比重復(fù)查詢(xún)數(shù)據(jù)庫(kù)要快的多。 大部分程序數(shù)據(jù)設(shè)計(jì)語(yǔ)言都能使用游標(biāo)來(lái)檢索SQL數(shù)據(jù)庫(kù)中的數(shù)據(jù),在程序中嵌入游標(biāo)和在程序中嵌入SQL語(yǔ)句相同 。
1)存儲(chǔ)過(guò)程游標(biāo)定義使用:
as //定義(游標(biāo)一個(gè)可以遍歷的結(jié)果集) ??
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 //執(zhí)行(常用For語(yǔ)句遍歷游標(biāo)) ? ? ??
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)游標(biāo)定義
--顯示cursor的處理
declare ?
---聲明cursor,創(chuàng)建和命名一個(gè)sql工作區(qū)
cursor cursor_name is ?
? ? select real_name from account_hcz;
? ? v_realname varchar2(20);
begin?
? ? open cursor_name;---打開(kāi)cursor,執(zhí)行sql語(yǔ)句產(chǎn)生的結(jié)果集
? ? fetch cursor_name into v_realname;--提取cursor,提取結(jié)果集中的記錄
? ? dbms_output.put_line(v_realname);
? ? close cursor_name;--關(guān)閉cursor
end;
三.在Oracle中對(duì)存儲(chǔ)過(guò)程的調(diào)用使用
1)調(diào)用?方式1
declare ?
? ? ? realsal emp.sal%type; ?
? ? ? realname varchar(40); ?
? ? ? realjob varchar(40); ?
begin ? //過(guò)程調(diào)用開(kāi)始 ?
? ? ? realsal:=1100; ?
? ? ? realname:=''; ?
? ? ? realjob:='CLERK'; ?
? ? ? runbyparmeters(realsal,realname,realjob);--必須按順序 ?
? ? ? DBMS_OUTPUT.PUT_LINE(REALNAME||' ? '||REALJOB); ?
END; ?//過(guò)程調(diào)用結(jié)束
2)?調(diào)用方式2
declare ?
? ? ?realsal emp.sal%type; ?
? ? ?realname varchar(40); ?
? ? ?realjob varchar(40); ?
begin ? ?//過(guò)程調(diào)用開(kāi)始 ?
? ? ?realsal:=1100; ?
? ? ?realname:=''; ?
? ? ?realjob:='CLERK'; ?
? ? ?--指定值對(duì)應(yīng)變量順序可變 ?
? ? ?runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); ? ? ? ? ??
? ? DBMS_OUTPUT.PUT_LINE(REALNAME||' ? '||REALJOB); ?
END; ?//過(guò)程調(diào)用結(jié)束
3)調(diào)用方式3(SQL命令行下)
1、SQL>exec proc_emp('參數(shù)1','參數(shù)2');//無(wú)返回值過(guò)程調(diào)用 2、SQL>var vsal number SQL> exec proc_emp ('參數(shù)1',:vsal);// 有返回值過(guò)程調(diào)用 或者:call proc_emp ('參數(shù)1',:vsal);// 有返回值過(guò)程調(diào)用?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Oracle存储过程以及游标的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle的job(定时执行存储过程)
- 下一篇: 在pe怎么调分辨率 Pe如何修改分辨率