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; 

 

 

 

 

posted @ 2014-05-19 08:34  sayou  阅读(300)  评论(0编辑  收藏  举报