oracle pl/sql儲存過程內外層遊標cursor巢狀引數化示例

studywell發表於2017-04-07
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條件每次輸入不同的值,顯示結果當然不同了.不就動態了

        實戰實戰太重要,僅看是遠遠不夠的.先模仿優秀的寫法,然後變成自己的,當然這個過程要一些時間了.
    



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-2136806/,如需轉載,請註明出處,否則將追究法律責任。

相關文章