业务背景:有俩个数据库,第一个数据库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 表就可以监控到每天新增、注销、更新的数据量了!
记录下每天的一点点小经验,以后可以翻着看看!