0%

Oracle定时任务

最近遇到一个很头疼的需求,需要每天间隔更新数据的打印状态,最开始实在是想不到什么办法,只能想着用程序实现定时更新了,后来才发现使用oracle自带的job能够实现oracle定制定时执行任务,真的挺方便的,一下子就解决了我的问题,希望能分享出来给大家,也许以后说不定用的上呢。

思路

首先我们先把需要执行的更新语句放到存储过程中,然后在固定的时间去执行这个存储过程就OK了。

注意:以下的操作是使用PL/SQL客户端实现的。

Step 1

新建一个存储过程,我们暂时命名为test_proc,存储过程的语句如下:

1
2
3
4
5
6
7
8
9
create or replace procedure test_proc IS
BEGIN
UPDATE ORDERS SET DRUG_INDICATOR='0' WHERE STOP_DATE_TIME IS NULL;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception happened,data was rollback');
ROLLBACK;
END;

在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
2
3
4
5
SQL>var job_numb number;
SQL>begin
2 dbms_job.submit(:job_num,'test_proc;',sysdate,'trunc(sysdate+1)');
3 end;
4 /

执行成功后,记得点击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
2
3
4
5
6
PROCEDURE Submit ( job OUT binary_ineger, 
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。

前面有一个双引号,在SQL windwo中没有显示,拷贝到command窗口就可以显示出来了;

what参数是将被执行的PL/SQL代码块。这里是存储过程的名称,后面有一个英文状态下的分号不能掉了;

next_date参数指识何时将运行这个工作。

interval参数何时这个工作将被重执行。

这里加号、括号都必须在英文状态下输入;

no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE 指示此PL/SQL代码在它第一次执行时应进行语法分析, 而FALSE指示本PL/SQL代码应立即进行语法分析。