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;
歡迎關注本站公眾號,獲取更多信息