oracle 遊標例子

  • CREATE OR REPLACE PROCEDURE PRC_WAP_ACTIVEUSERS(RETCODE OUT VARCHAR2) 
  • /*********************************************************** 
  •   * 功能:WAP指標--活躍用戶統計(分批提交)                      
  •   * 參數:RETCODE(返回編碼:0000成功)                         
  •   * 做者: 
  •   * 建立時間:2013-01-16                                      
  •   * 版本:1.0                                                  
  •   * 修改人:                                                   
  •   * 修改時間:                                                 
  •   **********************************************************/ 
  • IS 
  •   RET_CODE VARCHAR2(6);                 --錯誤信息代碼 
  •   RET_MSG  VARCHAR2(200);               --錯誤信息 
  •   V_LAST_MONTH      VARCHAR2(8);        --上個月份 
  •   V_FIRST_DAY_MONTH VARCHAR2(10);       --上個月第一天 
  •   V_END_DAY_MONTH   VARCHAR2(10);       --上個月次日 
  •   V_COUNT           NUMBER;             --計數變量 
  •   V_COMMITNUM CONSTANT NUMBER :=1000000;--一次提交記錄數(默認一百萬) 
  •  
  • BEGIN 
  •   --程序開始 
  •   DBMS_OUTPUT.PUT_LINE('PRC_WAP_ACTIVEUSERS BEGIN : ' || 
  •                        TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')); 
  •                         
  •   RET_CODE := '0000';                   --返回編碼初始化 
  •   V_COUNT  := 0;                        --計數器初始化 
  •   --申明遊標 
  •   DECLARE 
  •     TYPE CUR_DATA_TYPE IS RECORD        --定義動態遊標數據類型 
  •     ( 
  •       PHONE_NUM   VARCHAR2(20),         --電話號碼 
  •       LOGIN_TIMES VARCHAR2(2000));      --訪問次數 
  •    
  •     VRECORD CUR_DATA_TYPE;              --定義數據類型 
  •   BEGIN 
  •    
  •     SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE), -1), 'YYYYMM') 
  •       INTO V_LAST_MONTH 
  •       FROM DUAL; 
  •    
  •     SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE) + 1, -2), 'YYYYMMDD') 
  •       INTO V_FIRST_DAY_MONTH 
  •       FROM DUAL; 
  •    
  •     SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE), -1), 'YYYYMMDD') 
  •       INTO V_END_DAY_MONTH 
  •       FROM DUAL; 
  •    
  •     FOR VRECORD IN (SELECT TEL AS PHONE_NUM, COUNT(T.TEL) AS LOGIN_TIMES 
  •                       FROM TEMP_BOSS_BIP1A021 T 
  •                      WHERE T.DAY_ID BETWEEN V_FIRST_DAY_MONTH AND 
  •                            V_END_DAY_MONTH HAVING COUNT(T.TEL) >= 2 
  •                      GROUP BY T.TEL) LOOP 
  •      
  •       INSERT INTO T_BIP1A021 
  •         (PHONE_NUM, LOGIN_TIMES, LOGIN_MONTH) 
  •       VALUES 
  •         (VRECORD.PHONE_NUM, VRECORD.LOGIN_TIMES, V_LAST_MONTH); 
  •      
  •       IF ((MOD(V_COUNT, V_COMMITNUM)) = 0) THEN  
  •         COMMIT;                         --求餘:一百萬提交一次 
  •       END IF; 
  •        
  •       V_COUNT := V_COUNT + 1; 
  •      
  •     END LOOP; 
  •    
  •     COMMIT; 
  •    
  •     DBMS_OUTPUT.PUT_LINE('PRC_WAP_ACTIVEUSERS END: ' || 
  •                          TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')); 
  •   EXCEPTION 
  •     WHEN OTHERS THEN 
  •       BEGIN 
  •         ROLLBACK; 
  •         RET_CODE := '0001'
  •         RET_MSG  := '存儲過程 PRC_WAP_ACTIVEUSERS 執行錯誤!' || CHR(10) || 
  •                     '錯誤代碼:' || SQLCODE || CHR(10) || '錯誤信息:' || 
  •                     SUBSTR(SQLERRM, 1, 128); 
  •         GOTO TOEND; 
  •       END; 
  •   END; 
  •  
  •   --返回程序運做結果 
  •   <<TOEND>> 
  •   RETCODE := RET_CODE
  •   IF (RET_CODE = '0000') THEN 
  •     RET_MSG := '運行成功!'
  •     COMMIT; 
  •   ELSE 
  •     RET_MSG := '運行失敗!' || RET_MSG; 
  •     ROLLBACK; 
  •   END IF; 
  •  
  •   DBMS_OUTPUT.PUT_LINE(RET_MSG); 
  •  
  •   DBMS_OUTPUT.PUT_LINE('END TIME : ' || 
  •                        TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')); 
  •  
  • END PRC_WAP_ACTIVEUSERS; 
相關文章
相關標籤/搜索