业务背景:有俩个数据库,第一个数据库A主要是采集信息、变更信息等业务操作;

第二个数据库,汇总库,抽取各个地市数据库中的数据到汇总库;

注:抽取数据由转递线程实时运行抽取

现,应领导要求需要将每天某个地市抽取的数据量做个统计,观察每日数据量是否平缓

思考很久,决定建一张每日数据量

统计表(dataCount),字段有:

(主键)id、(创建时间)creatDate、(新增数据数)newData、(更新数据数)updateData、

(注销数据数)cancelData、(总数)totalData、(最后更新时间)lastUpdataTime

构想是:dataCount表的维护由存储过程来维护

下面开始创建存储过程,由于存储过程用的不够熟练,今天来来回回好多次才把这个存储过程折腾好。

网上查了好多资料,现将学习到的东西分享如下,存储过程的格式为:

CREATEPROCEDURE 存储过程名([参数名|in|out|in out...])--in表示传入参数,out表示返回参数(特别提醒:传入传出参数的类型不需要定义大小,如字符串类型。直接写varchar2,不需要定义长度,不然编译后会报错,还看不懂那错误信息)

AS

变量1 变量类型;--这里和建表时字段定义一样

变量2  变量类型;

BEGIN

  -- 变量赋值。。。

  -- 逻辑判断

   IF 条件1 THEN

       --执行语句1.。。

    ELSIF 条件2 THEN 【这里也要注意:不要写成elseif或者else if  Oracle的if。。。else 跟java中的大不一样

       --执行语句2.。。

     。。。

     ELSE

          其它情况执行语句。。。

   END IF;  

 EXCEPTION--异常处理

   WHEN OTHERS THEN

    dbms_output.put_line(sqlcode || sqlerrm(sqlcode));

END;

下面就是我针对遇到的这个业务写的具体的存储过程

CREATE OR REPLACE PROCEDURE updateZJGTJ(currentTime IN date, flag IN char) AS

 currentDate varchar2(10);--当前日期

 count   NUMBER(2);--记录数

BEGIN

   SELECT to_char(trunc(currentTime), 'YYYY-MM-DD') INTO currentDate FROM DUAL;--获取当前日期的年月日

   SELECT COUNT(Z.creatDate) INTO count   FROM ZJG_TJ_SJ Z WHERE Z.creatDate = currentDate ;

   --当天是否统计

  IF count   > 0 THEN--有记录,当天已有统计记录,更新统计数

        IF flag = 'newData' THEN          --新增统计

           UPDATE dataCount SET newData =(SELECT S.newData + 1 FROM dataCount S

                    WHERE S.creatDate = currentDate ),lastUpdataTime=currentTime WHERE creatDate = currentDate;

    ELSIF flag = 'updateDta' THEN   --更新统计    

            UPDATE dataCount SET updateData=(SELECT S.updateData+ 1 FROM dataCount S

                    WHERE S.creatDate = currentDate ),lastUpdataTime=currentTime WHERE creatDate = currentDate;

         ELSIF flag = 'cancelData' THEN   --注销统计            

             UPDATE dataCount SET cancelData=(SELECT S.cancelData+ 1 FROM dataCount S

                    WHERE S.creatDate = currentDate ),lastUpdataTime=currentTime WHERE creatDate = currentDate;        

           ELSE

                 Dbms_output.Put_line('更新记录有误');

          END IF;

     ELSIF count   = 0 THEN--当天没有统计记录,插入统计记录      

           IF flag = 'newData' THEN          --新增统计

              INSERT INTO dataCount (creatDate,newData,lastUpdataTime) VALUES(currentDate ,1,sysdate);

           ELSIF flag = 'updateDta' THEN   --更新统计

            INSERT INTO dataCount (creatDate,updateDta,lastUpdataTime) VALUES(currentDate ,1,sysdate);

         ELSIF flag = 'cancelData' THEN   --注销统计            

             INSERT INTO dataCount (creatDate,cancelData,lastUpdataTime) VALUES(currentDate ,1,sysdate);

           ELSE

                 Dbms_output.Put_line('新增记录有误');

          END IF;

   ELSE

           Dbms_output.Put_line('flag参数有误');

  END IF;

  COMMIT;

EXCEPTION

 WHEN OTHERS THEN

   dbms_output.put_line(sqlcode || sqlerrm(sqlcode));

END;

调用存储过程:call 存储过程名字(参数列表)

如果存储过程在远程服务器的话,也可以使用dblink调用,格式为:call 存储过程名@linkeName(参数列表)

最后在程序中每新增、更新记录时调用此存储过程更新dataCount 表,然后再写个计算总数的存储过程,再创建个job定时运行计算总数的存储过程,以后查询dataCount 表就可以监控到每天新增、注销、更新的数据量了!

记录下每天的一点点小经验,以后可以翻着看看!