-->创建测试用表
CREATE TABLE tb_job
(
job_name VARCHAR2 (5),
update_dt VARCHAR2 (20)
);
-->添加多个Oracle job来并发执行
DECLARE
job_name VARCHAR2 (20);
BEGIN
DBMS_OUTPUT.put_line ('Current sysdate is ' || TO_CHAR (SYSDATE, 'yyyymmdd hh24:mi:ss'));
FOR i IN 1 .. 5
LOOP
job_name := 'JOB_' || TO_CHAR (i);
sys.DBMS_SCHEDULER.create_job (
job_name => job_name,
start_date => sysdate+1/1440,
repeat_interval => 'freq = minutely; interval=1',
end_date => NULL,
job_class => 'DEFAULT_JOB_CLASS',
job_type => 'PLSQL_BLOCK',
job_action => '
begin
INSERT INTO tb_job
SELECT '''
|| job_name
|| ''', TO_CHAR (SYSDATE, ''yyyymmdd hh24:mi:ss'') FROM DUAL;
dbms_lock.sleep(60);
commit;
end;
',
enabled => true,
comments => 'my test job');
END LOOP;
END;
-->job执行的情况,可以看到5个job被逐一执行
-->尽管我们定义时的NEXT_RUN_DATE相差1秒,而此时job的执行后则每一个相差1分钟
-->job_1与job_5相差4分多钟,这是由于我们定义了dbms_lock.sleep(60)为1分钟
-->其次可以看出由于只有一个job进程,因此每一个job是一个一个被执行
SQL> select * from tb_job;
JOB_N UPDATE_DT
----- --------------------
JOB_1 20130319 12:21:33
JOB_2 20130319 12:22:35
JOB_3 20130319 12:23:37
JOB_4 20130319 12:24:39
JOB_5 20130319 12:25:41
-->移除job
DECLARE
job_name VARCHAR2 (10);
BEGIN
FOR i IN 1 .. 5
LOOP
job_name := 'JOB_' || TO_CHAR (i);
sys.DBMS_SCHEDULER.drop_job (job_name, force => TRUE);
END LOOP;
END;
-->移除测试表
SQL> drop table tb_job purge;
a、job_queue_processes参数决定了job作业能够使用的总进程数。
b、当该参数为0值,任何job都不会被执行,建议合理设置该值且至少大于1。
c、对于job运行时间也应该尽量合理的设置间隔以及启动时间。
d、如果同一时间内运行的Job数很多,过小的参数值导致job不得不进行等待。而过大的参数值则消耗更多的系统资源。
f、对于存在依赖关系的job,尽可能将其进行合并到一个job中,如使用chain等。
Oracle定时任务Job
最新推荐文章于 2023-06-01 14:03:37 发布