最近遇到一个很头疼的需求,需要每天间隔更新数据的打印状态,最开始实在是想不到什么办法,只能想着用程序实现定时更新了,后来才发现使用oracle自带的job能够实现oracle定制定时执行任务,真的挺方便的,一下子就解决了我的问题,希望能分享出来给大家,也许以后说不定用的上呢。
思路
首先我们先把需要执行的更新语句放到存储过程中,然后在固定的时间去执行这个存储过程就OK了。
注意:以下的操作是使用PL/SQL客户端实现的。
Step 1
新建一个存储过程,我们暂时命名为test_proc,存储过程的语句如下:
1 | create or replace procedure test_proc IS |
在SQL Window窗体执行存储过程创建语句后,查看Object下的Prodecures菜单,可以看到新建的存储过程,检查存储过程创建是否有红色的标记,如无,则表示存储过程正常。
Step 2
检查Oracle的JOB运行环境,打开PL/SQL的命令窗口,执行以下语句查看数据库的进程数量。
1 | SHOW PARAMETER job_queue_processes; |
如果进程数为0的话,则按照以下语句修改,不为就根据需要决定是否要修改。
在PL/SQL的command窗口输入以下命令
1 | alter system set job_queue_processes=10 scope=both; |
Step 3
下面我们开始定时定制执行任务。
在PL/SQL的command窗口输入以下命令:
1 | SQL>var job_numb number; |
执行成功后,记得点击PL/SQL的提交按钮。
trunc(sysdate+1)是指定数据库每天0点执行我们设定的存储过程,后面再详细讲解submit的参数。
Step 4
任务已经开始执行了,我们可以用以下语句找到我们刚才创建的任务。
1 | select * from dba_jobs; |
Step 5
其他说明:
(1)如何删除一个JOB呢?
在PL/sql的command window 执行以下语句
1 | exec dbms_job.remove(81); |
这里的‘81’对应的是我们刚才查找的表dba_jobs当中要删除对应行记录的JOB值。
submit的各个参数
submit实际上是一个存储过程,有五个参数:job、what、next_date、interval与no_parse。
1 | PROCEDURE Submit ( job OUT binary_ineger, |
job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。
前面有一个双引号,在SQL windwo中没有显示,拷贝到command窗口就可以显示出来了;
what参数是将被执行的PL/SQL代码块。这里是存储过程的名称,后面有一个英文状态下的分号不能掉了;
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
这里加号、括号都必须在英文状态下输入;
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE 指示此PL/SQL代码在它第一次执行时应进行语法分析, 而FALSE指示本PL/SQL代码应立即进行语法分析。