`

oracle统计money存储过程

阅读更多

 

-- oracle统计money存储过程

 

 

CREATE OR REPLACE PROCEDURE P_TJ_MONEY (YYYYMM IN VARCHAR2,COUNTS IN NUMBER,OUT_FLAG OUT VARCHAR2) IS

  I NUMBER;

  V_BEGIN NUMBER;  

  V_COUNTS NUMBER;

  V_DAYS NUMBER;  

  V_YYYYMM VARCHAR2(60); 

  V_YYYYMMDD VARCHAR2(60);

  V_FLAGS VARCHAR(30);

  V_SQL VARCHAR2(3000);

BEGIN

  --- 初始化年月

  V_YYYYMM := YYYYMM;

  IF COUNTS <= 0 THEN

     V_COUNTS := 1;

    ELSE

     V_COUNTS := COUNTS;

  END IF;

  WHILE V_COUNTS>=1 LOOP           

  --------------------------------------------------------------------------------------------------------------   

      --- 计算当月多少天

      V_SQL := 'SELECT TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('''||V_YYYYMM||''',''YYYYMM'')),''DD'')) TS FROM DUAL';

      EXECUTE IMMEDIATE V_SQL INTO V_DAYS;

      /* 

       * 当天外呼超过 10分钟的坐席量

       * 插入统计表 TJ_MONEY

       */

      V_BEGIN := 1;

      /*退出循环*/

      <<LABEL_OUT>>  

      FOR I IN V_BEGIN .. V_DAYS LOOP        

        IF I <= 9 THEN

             V_YYYYMMDD := V_YYYYMM||'0'||I;

           ELSE

             V_YYYYMMDD := V_YYYYMM||I;

        END IF;

        --- 计算当天是否存在坐席

        V_SQL := 'SELECT COUNT(1) AGENTNUM FROM (

                         SELECT SUM(DURATION) CALLTIME

                                FROM CTI_CALLSTAT_'||V_YYYYMM||'

                                WHERE SUBSTR(ENDTIME,0,8) = '''||V_YYYYMMDD||'''

                                GROUP BY ORIGCALLING

                  ) WHERE CALLTIME>=''600'' ';

        EXECUTE IMMEDIATE V_SQL INTO V_FLAGS;

        COMMIT;

        --- 统计循环

        V_BEGIN := V_BEGIN + 1 ;

        --- 跳出 FOR 循环

        IF V_FLAGS<=0 THEN                    

          GOTO LABEL_OUT;

        END IF;

        --- 删除已经统计数据

        V_SQL := 'DELETE FROM TJ_MONEY WHERE CTIME='''||V_YYYYMMDD||''' AND FLAG=''0'' ';

        EXECUTE IMMEDIATE V_SQL;

        COMMIT;

        V_SQL := 'INSERT INTO TJ_MONEY SELECT COUNT(1) AGENTNUM,'''||V_YYYYMMDD

                 ||''' CTIME,''0'' FLAG FROM (

                         SELECT SUM(DURATION) CALLTIME

                                FROM CTI_CALLSTAT_'||V_YYYYMM||'

                                WHERE SUBSTR(ENDTIME,0,8) = '''||V_YYYYMMDD||'''

                                GROUP BY ORIGCALLING

                  ) WHERE CALLTIME>=''600'' ';

        EXECUTE IMMEDIATE V_SQL;

        COMMIT; 

      END LOOP;    

  --------------------------------------------------------------------------------------------------------------    

      --- 删除已经统计数据

      V_SQL := 'DELETE FROM TJ_MONEY WHERE CTIME='''||V_YYYYMM||''' AND FLAG=''1'' ';

      EXECUTE IMMEDIATE V_SQL;

      COMMIT;

      --- 统计当月的平均量

      V_SQL :=' INSERT INTO TJ_MONEY

                SELECT ROUND(((SELECT ROUND(SUM(AGENTNUM)/A,0) SL_A FROM ( SELECT * FROM TJ_MONEY WHERE FLAG = ''0'' AND CTIME LIKE '''||V_YYYYMM||'__'' ORDER BY AGENTNUM DESC) WHERE ROWNUM <= A) +

                      (SELECT ROUND(SUM(AGENTNUM)/B,0) SL_B FROM ( SELECT * FROM TJ_MONEY WHERE FLAG = ''0'' AND CTIME LIKE '''||V_YYYYMM||'__'' ORDER BY AGENTNUM DESC) WHERE ROWNUM <= B) +

                      (SELECT ROUND(SUM(AGENTNUM)/C,0) SL_C FROM ( SELECT * FROM TJ_MONEY WHERE FLAG = ''0'' AND CTIME LIKE '''||V_YYYYMM||'__'' ORDER BY AGENTNUM DESC) WHERE ROWNUM <= C) +

                      (SELECT ROUND(SUM(AGENTNUM)/D,0) SL_D FROM ( SELECT * FROM TJ_MONEY WHERE FLAG = ''0'' AND CTIME LIKE '''||V_YYYYMM||'__'' ORDER BY AGENTNUM DESC) WHERE ROWNUM <= D) )/4,0) AGENTNUM,

                      '''||V_YYYYMM||''' CTIME,

                      ''1'' FLAG

                FROM (SELECT ROUND(TS * 0.7,0) A, ROUND(TS * 0.75) B, ROUND(TS * 0.8) C, ROUND(TS * 0.85) D

                FROM (SELECT COUNT(1) TS FROM TJ_MONEY WHERE FLAG=''0'' AND CTIME LIKE '''||V_YYYYMM||'__'')) ';

      EXECUTE IMMEDIATE V_SQL;

      COMMIT;     

      --- 标记循环

      V_COUNTS := V_COUNTS - 1;

      IF V_COUNTS>=1 THEN 

         --- 获取下一个月

         V_SQL := 'SELECT TO_CHAR(ADD_MONTHS(TO_DATE('''||V_YYYYMM||''',''YYYYMM''),1),''YYYYMM'') YM FROM DUAL';

         EXECUTE IMMEDIATE V_SQL INTO V_YYYYMM;

      END IF;

  END LOOP;

  OUT_FLAG := '成功..!';

  --- 异常

  EXCEPTION

   when others then

         rollback; -- 回滚

             DBMS_OUTPUT.PUT_LINE(SQLERRM);

             OUT_FLAG := '失败..!';

         return;

END P_TJ_MONEY;


 

---------------------------------------------------------------------------------------------------------------------------------

 

 

-- Create table

 

create table TJ_MONEY

(

  AGENTNUM NUMBER,

  CTIME    VARCHAR2(30),

  FLAG     VARCHAR2(2)

)

 

 

分享到:
评论
1 楼 fengweiyou 2011-07-26  
写的很好

相关推荐

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    oracle 事务 回滚 存储过程

    ### Oracle存储过程 存储过程是在数据库中预编译的一组SQL语句,用于执行复杂的业务逻辑或数据操作。它们可以接受输入参数,执行一系列数据库操作,并返回结果。在Oracle中,存储过程使用PL/SQL编写,可以在数据库...

    oracle存储过程学习经典入门

    本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...

    Oracle定时执行存储过程

    Oracle 定时执行存储过程 Oracle 定时执行存储过程是一种高效的方式来执行存储过程,通过使用 Oracle 提供的 job 机制来实现。Job 机制允许开发者创建、计划和执行存储过程,实现自动化和批量处理。 Broken() ...

    oracle存储过程解锁

    以下是对“oracle存储过程解锁”这一主题的深入解析。 ### 标题:“oracle存储过程解锁” #### 解析: 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL代码块,用于执行复杂的业务逻辑或数据处理...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    《Oracle触发器与存储过程高级编程》第3版是一本深入探讨Oracle数据库中触发器和存储过程技术的专业书籍。在Oracle数据库系统中,触发器和存储过程是数据库管理员和开发人员进行复杂业务逻辑处理和数据管理的重要...

    jdbc连接oracle,执行存储过程,带数据库存储过程

    执行Oracle存储过程主要涉及以下几个关键点: 1. 创建CallableStatement对象:使用Connection对象的`prepareCall()`方法创建CallableStatement实例,例如`CallableStatement cs = conn.prepareCall("{call procedure...

    oracle 批量插入存储过程

    oracle 批量插入存储过程,性能非常高!

    oracle定时器调用存储过程

    oracle定时器调用存储过程

    oracle 存储过程导出excel

    oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel

    oracle 存储过程 函数 dblink

    ### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...

    Oracle存储过程返回结果集

    在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...

    帆软报表Oracle存储过程解决storeParameter1参数试用插件

    总结起来,"帆软报表Oracle存储过程解决storeParameter1参数试用插件"主要是针对在调用无参数Oracle存储过程时出现的异常问题提供的一种解决方案。通过安装并配置这个插件,用户可以顺利地在帆软报表中调用不包含...

    oracle存储过程unwrap解密工具.zip

    Oracle存储过程unwrap解密工具主要用于处理Oracle数据库中的加密存储过程。在Oracle数据库系统中,为了保护敏感代码或数据,开发人员有时会选择对存储过程进行加密。然而,当需要查看、调试或恢复这些加密的存储过程...

    springboot整合mybatis调用oracle存储过程

    本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...

    oracle 批量插入数据存储过程

    oracle 批量插入数据存储过程。亲测好用。支持 plsql ,toad,等数据库分析软件。主要包括变量的定义,循环及游标的使用等, 亲测好用

Global site tag (gtag.js) - Google Analytics