存儲過程 游標使用實例


  使用游標對記錄集循環進行處理的時候一般操作如以下幾個步驟:1、把記錄集傳給游標; 2、打開游標;3、開始循環;4、從游標中取值;5、檢查那一行被返回;6、數據處理;7、關閉循環;8、關閉游標。

如下示例:

DECLARE
 CURSOR FirstCursor IS --聲明顯示游標,並指定結果集
  SELECT T.ACC_NUM ACC_NUM,t.ext_prod_id EXT_PROD_ID, COUNT(1) COUNT,SYSDATE AUDI_TIME
  FROM (SELECT DISTINCT T3.PAY_ACCT_ID,T2.ACCT_ID, T1.ACC_NUM,t1.ext_prod_id
          FROM CRM2_XX.PROD_INST@DB_GROUP_XX     T1,
               CRM2_XX.Serv_Acct_Rel@DB_GROUP_XX T2,
               CRM2_XX.PAYMENT_PLAN@DB_GROUP_XX T3,
               CRM2_XX.COMMON_REGION@DB_GROUP_XX CR
         WHERE T1.REGION_ID = CR.COMMON_REGION_ID
           AND T1.PROD_INST_ID = T2.PROD_INST_ID
     AND T3.SERV_ACCT_REL_ID=T2.SERV_ACCT_REL_ID
           AND T1.STATUS_CD <> '110000'
           AND T2.STATUS_CD = '1') T
 GROUP BY T.ACC_NUM,t.ext_prod_id
HAVING COUNT(1) > 1;
 BEGIN--語法
  FOR REC IN FirstCursor LOOP--開始循環遍歷,rec相當java語法中的i,數組的下標
   INSERT INTO NUMCOUNT_MHR_GD_COUSOR
    (acc_num,
    ext_prod_id,
    count,
    audi_time)
   VALUES(
    REC.ACC_NUM,
    REC.EXT_PROD_ID,
    REC.COUNT,
    REC.AUDI_TIME);
   COMMIT;--從游標中取值,並插入目標表
   EXIT WHEN FirstCursor%NOTFOUND;--當游標中再無更多記錄時退出
  COMMIT;
 END LOOP;--遍歷結束,關閉循環
END;--結束

同下:

create table CS_COUNT_LOG
(
  it          VARCHAR2(30),
  idate       DATE,
  irecore_num NUMBER
)

declare
  iStep  number;
  iCount number;
begin
 
iStep  := 0;
 
iCount := 0;
  for rec in (SELECT T1.*
                FROM CRM2_XX.V_OFFER_INST_INFO T1, AUDI_SAMPLE_JSNJ T2
               where t1.PROD_INST_ID = t2.prod_inst_id) loop
    INSERT INTO ASA_OFFER_INFO_PROV_JSNJ_BK(
      PROV_CODE,
      PROD_INST_ID,
      OFFER_INST_ID,
          OFFER_ID,
          EXT_OFFER_ID,
          OWNER_CUST_ID,
          CHANNEL_ID,
          EFF_DATE,
          EXP_DATE,
          AUDI_DATE,
          AUDI_BATCH
  )
    values
      ('JSNJ',
       rec.PROD_INST_ID,
       rec.OFFER_INST_ID,
       rec.OFFER_ID,
       rec.EXT_OFFER_ID,
       rec.OWNER_CUST_ID,
       rec.CHANNEL_ID,
       rec.EFF_DATE,
       rec.EXP_DATE,
     sysdate,
       '2017-08');
    iStep  := iStep + 1;
    iCount := iCount + 1;
    if iStep = 2000 then
      iStep := 0;
      insert into CS_COUNT_LOG values ('CP',sysdate, iCount);--iStep到2000則置為0,且插入iCount
      commit;
    end if;
  end loop;
  insert into CS_COUNT_LOG values ('CP',sysdate, iCount);--iStep不到2000,則在循環結束后插入iCount
 

end;
/

示例:

 

CREATE OR REPLACE PROCEDURE sp_sync_plan IS
  CURSOR C_EMP IS --聲明顯式游標 
    SELECT * FROM dc_check_todo; 
  C_ROW C_EMP%ROWTYPE; --定義游標變量,該變量的類型為基於游標C_EMP的記錄 
BEGIN
  --For 循環 
  FOR C_ROW IN C_EMP LOOP 
    DBMS_OUTPUT.PUT_LINE(C_ROW.todo_id || '--' ); 
  END LOOP; 

  --Fetch 循環 
  OPEN C_EMP;--必須要明確的打開和關閉游標 
  LOOP 
    FETCH C_EMP 
      INTO C_ROW; 
    EXIT WHEN C_EMP%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(C_ROW.todo_id || '++' ); 
  END LOOP; 
  CLOSE C_EMP; 

  --While 循環 
  OPEN C_EMP;--必須要明確的打開和關閉游標 
    FETCH C_EMP INTO C_ROW; 
    WHILE C_EMP%FOUND LOOP DBMS_OUTPUT.PUT_LINE(C_ROW.todo_id || '**' ); 
      FETCH C_EMP INTO C_ROW; 
    END LOOP; 
  CLOSE C_EMP; 
END sp_sync_plan;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM