oracle pl/sql儲存過程內外層遊標cursor巢狀引數化示例
oracle pl/sql儲存過程內外層遊標cursor巢狀引數化示例
轉自:
http://blog.itpub.net/9240380/viewspace-719557/
另外幾個不錯的網址:
oracle儲存過程常用技巧 基礎知識介紹,非常有用
http://www.cnblogs.com/chinafine/archive/2010/07/12/1776102.html
oracle 儲存過程 動態sql語句
http://www.cnblogs.com/zmlctt/p/3750198.html
Oracle 儲存過程 動態sql執行
http://blog.csdn.net/pioayang/article/details/23853477
SQL> select * from acctinactprocess;
MEDIUMID ACCTNBR VOUCHNBR
--------------------------------------- --------------------------------------- ---------------------------------------
1 123 12
2 222 34
SQL> select * from vouchinfo;
VOUCHNBR VOUCHNAME
--------------------------------------- ----------
12 VCHE
create or replace procedure proc_nest_cursor
as
cursor cur_acctinactprocess is select mediumid,acctnbr,vouchnbr from acctinactprocess;
v_mediumid ACCTINACTPROCESS.MEDIUMID%type;
v_acctnbr ACCTINACTPROCESS.Acctnbr%type;
v_vouchnbr ACCTINACTPROCESS.Vouchnbr%type;
v_vouchname vouchinfo.vouchname%type;
cursor cur_vouchinfo(lvsvouchnbr vouchinfo.vouchnbr%type) is select vouchnbr,vouchname from vouchinfo where vouchnbr=lvsvouchnbr;
begin
open cur_acctinactprocess;
loop
fetch cur_acctinactprocess
into
v_mediumid,
v_acctnbr,
v_vouchnbr;
exit when cur_acctinactprocess%notfound;
dbms_output.put_line('外層迴圈開始: '||'介質號:'||v_mediumid||' 賬號:'||v_acctnbr||' 憑證號:'||v_vouchnbr);
dbms_output.put_line('內層迴圈開始');
--內層遊標以外層遊標的資料為基礎,如果匹配外層遊標,就進入內層遊標進行處理,如果匹配不上外層遊標,不進入內層遊標(這個工作,由內層遊標的exit when cur_vouchinfo%notfound)
--以前我理解這種判斷機制要用if else來作,看來是多此一舉了.
open cur_vouchinfo(v_vouchnbr);
loop
fetch cur_vouchinfo
into
v_vouchnbr,
v_vouchname;
exit when cur_vouchinfo%notfound;
dbms_output.put_line('內層迴圈的值: '||' 憑證號:'||v_vouchnbr||' 憑證名稱'||v_vouchname);
end loop;
close cur_vouchinfo;
end loop;
close cur_acctinactprocess;
end;
SQL>
外層迴圈開始: 介質號:1 賬號:123 憑證號:12
內層迴圈開始
內層迴圈的值: 憑證號:12 憑證名稱VCHE
外層迴圈開始: 介質號:2 賬號:222 憑證號:34
內層迴圈開始
PL/SQL procedure successfully completed
小結:
業務邏輯的處理流程一定要清晰理解,具體就是多個遊標間的邏輯關係:是平行或是父子級別的關係;如果採用平行關係;會導致重複資料的多次開啟,減慢效率
遊標的引數化一定要好好理解,具體就是遊標的引數究竟要幾個,以什麼為準.這個要和業務理解關聯起來.引數化可以讓遊標的結果是動態化的.遊標引數相當
於where條件,不同的where條件每次輸入不同的值,顯示結果當然不同了.不就動態了
實戰實戰太重要,僅看是遠遠不夠的.先模仿優秀的寫法,然後變成自己的,當然這個過程要一些時間了.
轉自:
http://blog.itpub.net/9240380/viewspace-719557/
另外幾個不錯的網址:
oracle儲存過程常用技巧 基礎知識介紹,非常有用
http://www.cnblogs.com/chinafine/archive/2010/07/12/1776102.html
oracle 儲存過程 動態sql語句
http://www.cnblogs.com/zmlctt/p/3750198.html
Oracle 儲存過程 動態sql執行
http://blog.csdn.net/pioayang/article/details/23853477
SQL> select * from acctinactprocess;
MEDIUMID ACCTNBR VOUCHNBR
--------------------------------------- --------------------------------------- ---------------------------------------
1 123 12
2 222 34
SQL> select * from vouchinfo;
VOUCHNBR VOUCHNAME
--------------------------------------- ----------
12 VCHE
create or replace procedure proc_nest_cursor
as
cursor cur_acctinactprocess is select mediumid,acctnbr,vouchnbr from acctinactprocess;
v_mediumid ACCTINACTPROCESS.MEDIUMID%type;
v_acctnbr ACCTINACTPROCESS.Acctnbr%type;
v_vouchnbr ACCTINACTPROCESS.Vouchnbr%type;
v_vouchname vouchinfo.vouchname%type;
cursor cur_vouchinfo(lvsvouchnbr vouchinfo.vouchnbr%type) is select vouchnbr,vouchname from vouchinfo where vouchnbr=lvsvouchnbr;
begin
open cur_acctinactprocess;
loop
fetch cur_acctinactprocess
into
v_mediumid,
v_acctnbr,
v_vouchnbr;
exit when cur_acctinactprocess%notfound;
dbms_output.put_line('外層迴圈開始: '||'介質號:'||v_mediumid||' 賬號:'||v_acctnbr||' 憑證號:'||v_vouchnbr);
dbms_output.put_line('內層迴圈開始');
--內層遊標以外層遊標的資料為基礎,如果匹配外層遊標,就進入內層遊標進行處理,如果匹配不上外層遊標,不進入內層遊標(這個工作,由內層遊標的exit when cur_vouchinfo%notfound)
--以前我理解這種判斷機制要用if else來作,看來是多此一舉了.
open cur_vouchinfo(v_vouchnbr);
loop
fetch cur_vouchinfo
into
v_vouchnbr,
v_vouchname;
exit when cur_vouchinfo%notfound;
dbms_output.put_line('內層迴圈的值: '||' 憑證號:'||v_vouchnbr||' 憑證名稱'||v_vouchname);
end loop;
close cur_vouchinfo;
end loop;
close cur_acctinactprocess;
end;
SQL>
外層迴圈開始: 介質號:1 賬號:123 憑證號:12
內層迴圈開始
內層迴圈的值: 憑證號:12 憑證名稱VCHE
外層迴圈開始: 介質號:2 賬號:222 憑證號:34
內層迴圈開始
PL/SQL procedure successfully completed
小結:
業務邏輯的處理流程一定要清晰理解,具體就是多個遊標間的邏輯關係:是平行或是父子級別的關係;如果採用平行關係;會導致重複資料的多次開啟,減慢效率
遊標的引數化一定要好好理解,具體就是遊標的引數究竟要幾個,以什麼為準.這個要和業務理解關聯起來.引數化可以讓遊標的結果是動態化的.遊標引數相當
於where條件,不同的where條件每次輸入不同的值,顯示結果當然不同了.不就動態了
實戰實戰太重要,僅看是遠遠不夠的.先模仿優秀的寫法,然後變成自己的,當然這個過程要一些時間了.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-2136806/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle procedure儲存過程(pl/sql)_使用declare cursor_begin end巢狀Oracle儲存過程SQL巢狀
- MYsql-儲存過程-遊標的巢狀MySql儲存過程巢狀
- Oracle Pl/SQL 之 儲存過程OracleSQL儲存過程
- PL/SQL 04 遊標 cursorSQL
- SQL Server系統儲存過程和引數示例SQLServer儲存過程
- 儲存過程中巢狀儲存過程的變數執行方式儲存過程巢狀變數
- SQLSERVER儲存過程如何寫帶引數的遊標SQLServer儲存過程
- 儲存過程——遊標儲存過程
- oracle儲存過程將引數字串分割sqlOracle儲存過程字串SQL
- oracle動態sql儲存過程示例OracleSQL儲存過程
- SQL儲存過程示例SQL儲存過程
- 兩種SQL分頁方法儲存過程和遊標儲存過程SQL儲存過程
- ORACLE 儲存過程示例Oracle儲存過程
- pl/sql儲存過程優化一例SQL儲存過程優化
- 儲存過程中巢狀事務儲存過程巢狀
- PL/SQL 05 儲存過程 procedureSQL儲存過程
- Oracle儲存過程中定義多個遊標Oracle儲存過程
- MySQL 儲存過程/遊標/事務MySql儲存過程
- MySQL儲存過程in、out、inout引數示例與總結MySql儲存過程
- oracle父儲存過程呼叫子儲存過程procedure與輸出引數Oracle儲存過程
- oracle 儲存過程遊標的使用Oracle儲存過程
- 儲存過程中使用cursor儲存過程
- SQL 遊標cursorSQL
- Mysql儲存過程中使用多遊標MySql儲存過程
- PL/SQL中動態掉用儲存過程SQL儲存過程
- PL/SQL 中的儲存過程與函式SQL儲存過程函式
- SQL Server-儲存過程(Procedure),帶入引數和出引數SQLServer儲存過程
- mysql儲存過程的引數MySql儲存過程
- SQL Server系統儲存過程和引數總結SQLServer儲存過程
- MyBatis 呼叫Oracle儲存過程,傳參、返回遊標的值獲取--示例MyBatisOracle儲存過程
- PL/SQL 遊標SQL
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- PL/SQL-遊標和遊標變數的使用SQL變數
- oracle 儲存過程遊標中處理並記錄異常Oracle儲存過程
- oracle儲存過程詳解--遊標 實現增、刪、改、查Oracle儲存過程
- sqlserver 臨時表 遊標 儲存過程拼sql 日期函式等SQLServer儲存過程函式
- oracle中取得儲存過程、函式等pl sql原始碼的方法Oracle儲存過程函式SQL原始碼
- Oracle帶輸入輸出引數的儲存過程Oracle儲存過程