1. 程式人生 > >Oracle動態遊標實現動態SQL迴圈遍歷

Oracle動態遊標實現動態SQL迴圈遍歷

動態遊標可以遍歷動態的表,

格式:

TYPE 遊標型別 IS REF CURSOR;  --定義一個動態遊標
遊標名  遊標型別;

如果查詢的表的資料不同的,動態變化的,這時候可以用動態遊標。

需要注意的是,動態遊標的定義,

在普通儲存過程中:需要放在 is 後面的第一行

動態遊標通過:open 遊標 for 字串,形式使用,遍歷。

create or replace procedure P_TEST_SQL 
is    
TYPE ref_cursor_type IS REF CURSOR;  --定義一個動態遊標     
tablename varchar2(200) default 'ess_client';    
v_sql varchar2(1000);    
mobile varchar2(15);    
usrs ref_cursor_type;    
begin    
  --使用連線符拼接成一條完整SQL     
  v_sql := 'select usrmsisdn from '||tablename||' where rownum < 11';    
  --開啟遊標     
  open usrs for v_sql ;    
  loop    
      fetch usrs into mobile;     
      exit when usrs%notfound;    
      insert into tmp(usrmsisdn) values(mobile);    
  end loop;    
  close usrs;    
  commit;    
end P_TEST_SQL;

下面是一個例項

create or replace procedure DDGZ1--訂單跟蹤
(     
       P_flag varchar,--訂單型別
       P_operate varchar,--操作型別
       P_BH varchar --傳入的編號ID
)
is
      TYPE ref_cursor_type IS REF CURSOR;
       v_cur_CKD  ref_cursor_type;
        
begin
   open v_cur_CKD for 'select v_ERP,v_DRP,v_jxsmc,v_jxs,v_DWMC,v_czr,v_jlsj from tmp_DDGZ1'; 
   fetch v_cur_CKD into v_ERP,v_DRP,v_jxsmc,v_jxs,v_DWMC,v_czr,v_jzsj;
   while v_cur_CKD%found
     loop        
     insert into DRPDDGZJL2 (JLID,DRP,ERP,JXS,JXSMC,JLSJ,GZJL,CZR,BHID) values(SYS_GUID(),v_drp,v_erp,v_jxs,v_jxsmc,v_jzsj,v_DWMC||'受託代銷成品庫接收訂單,組織發貨',v_CZR,'出庫單'||P_BH); 
     fetch v_cur_CKD into v_ERP,v_DRP,v_jxsmc,v_jxs,v_DWMC,v_czr,v_jzsj;
     end loop;
     close v_cur_CKD;
 end;