有个需求,就是每天从一个表中提取出特定数据,保存到另一个表中。才疏学浅,最初想用Oracle的触发器可以实现,翻开课本之后才发现触发器不是用来干这个的。于是用Java的Quartz框架编写代码实现了这个需求。完成之后又想用数据库实现,翻了下课本,找了些教程,发现网上都是用PL/SQL DEV工具编写脚本实现的。我的电脑上只有Oracle SQL Developer工具,经过一阵折腾,最终也实现了。
个人感觉用SQL Developer的图形化工具可以很方便的实现创建存储过程,定时作业的任务。相比较于PL/SQL,这个的学习成本更低一些,不需要知道那么多的脚本命令。
记录下步骤。
1.获取昨天一天的所有数据
select pk_information,problemno,problemname,productid,partno,createUser,createTime,dutygroup,dutyuser,batch,problemtype,emergencydegree from brsj_kms_problem where createtime between to_char(sysdate-1,'yyyy-mm-dd') and to_char(sysdate,'yyyy-mm-dd');
2.将查询到的数据插入到对应的表中
insert into brsj_kms_distributeproblem ( pk_information ,problemno ,problemname ,productid ,partno ,createUser ,createTime ,dutygroup ,dutyuser ,batch ,problemtype ,emergencydegree ) select pk_information,problemno,problemname,productid,partno,createUser,createTime,dutygroup,dutyuser,batch,problemtype,emergencydegree from brsj_kms_problem where createtime between to_char(sysdate-1,'yyyy-mm-dd') and to_char(sysdate,'yyyy-mm-dd');
这里特别说明一下,第一个括号后面没有values关键字,加上values关键字执行就会报错,错误的表达式。
3.测试上面的SQL语句无误后,开始创建存储过程
create procedure ScheduledTasks is begin insert into brsj_kms_distributeproblem ( pk_information ,problemno ,problemname ,productid ,partno ,createUser ,createTime ,dutygroup ,dutyuser ,batch ,problemtype ,emergencydegree ) select pk_information,problemno,problemname,productid,partno,createUser,createTime,dutygroup,dutyuser,batch,problemtype,emergencydegree from brsj_kms_problem where createtime between to_char(sysdate-1,'yyyy-mm-dd') and to_char(sysdate,'yyyy-mm-dd'); COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Exception happened,data was rollback'); ROLLBACK; END;
创建好了之后,刷新一下,在左侧的过程文件夹中就可以看到对应的过程名称,检查图标上是否有红叉,如果有,说明语句错误,重新检查哪里出错。如果没有错误,直接右击,选择运行,运行成功后,可以查看对应的表中是否成功插入了数据,需要注意的是要确保执行过程的SQL语句逻辑上是能产生数据的,例如查询昨日的所有记录,如果昨日没有数据产生,即便SQL语句无误也不会产生结果,所以需要提前添加一些测试数据,确保能看到结果。
运行到这里,能看到新产生的数据,说明创建的过程是没有问题的,接下来就是如何每天让它运行一次的问题了。
4.定时执行存储过程
打开项目列表-->调度程序-->作业,右击新建作业。
打开编辑作业窗口后,就可以在这里设定参数了。
作业名随便起一个,已启用可以先不打勾,创建好后选择启用也可以的。
说明里可以加汉字做一些介绍。
作业类用默认的。
作业类型里面选择存储过程,方案选择默认,打开过程下拉框,就可以看到我们之前创建好的存储过程,把它选上。
右边何时执行作业就是选择频率了,可以根据自己的需求选择执行一次还是每天执行,重复时间间隔里面可以详细选择每年、每月、每天、每时等详细参数。选好之后会自动生成代码。
开始时间和结束时间也可以按自己的需求进行选择。
选好之后点击应用,作业就创建好了,如果刚才选择了已启用,这时候作业已经开始运行了。如果刚才没选启用,在创建好的作业上右击,选择启用,也会开始运行。
设置一个合理的运行频率和运行时间进行测试是否运行正确,无误之后再修改频率和时间为真正运行的频率和时间。至此,所有过程全部完成了。
网上用的都是PL/SQL里面创建Job,需要写一大堆命令,这个比较简单,图形化工具创建定时任务,不容易出错。个人感觉Oracle的这个SQL Developer工具还是很强大的,功能很丰富,很多东西都可以用图形界面创建出来。