天天看點

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; 

TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE) + 1, -2), ‘YYYYMMDD‘) 

      INTO V_FIRST_DAY_MONTH 

TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE), -1), ‘YYYYMMDD‘) 

      INTO V_END_DAY_MONTH 

    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) >=

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: ‘

|| 

  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 :=

‘運作成功!‘; 

  ELSE 

    RET_MSG := ‘運作失敗!‘ || RET_MSG; 

    ROLLBACK; 

  END IF; 

  DBMS_OUTPUT.PUT_LINE(RET_MSG); 

  DBMS_OUTPUT.PUT_LINE(‘END TIME : ‘ || 

END PRC_WAP_ACTIVEUSERS;