DBMS_JOB
功能描述
用于执行定时任务功能。
说明:
- 执行DBMS_JOB接口后需要运行commit,否则将不会生效。
- 普通用户可以创建、暂停、运行、删除自己的job,不支持操作其他用户的job。
- SYS用户可以创建自己的job,可以暂停、运行、删除所有用户的job。
- JOB_THREADS可以用于控制并发执行的job数量,缺省值是100,取值范围为[0,200]。
- job如果运行出错,会在第一次出错时写alarm日志,如果连续出错,只在第一次出错时写alarm日志。
- 失败的job,后台每隔一分钟尝试重新处理一次该job,直到成功运行该job。
- 如果job执行的PLSQL语句块内部没有commit,系统在该job执行结束后,如果执行成功将进行commit,执行失败进行rollback。
- 目前还不支持修改一个已经创建的job的参数,如果需要修改,请先删除原有的job,再重新创建。
- JOB的唯一标识是通过全局序列JOBSEQ实现,在新submit一个JOB任务时,得到一个唯一标识。在其他的接口中,可以通过该标识对相应的JOB任务做对应的操作。该值最小1000,每次递增1。
- 具体的job任务以job提交用户进行执行,其session受SESSIONS_PER_USER总量的控制,会占用其中的会话数。
接口介绍
- BROKEN
描述:修改job状态,将job设为阻塞状态。
接口:
DBMS_JOB.BROKEN ( job IN BINARY_BIGINT, broken IN BOOLEAN, next_date IN DATE DEFAULT SYSDATE);
参数:
job:待修改的job标识。
broken:阻塞标识,true阻塞,false运行。
next_date:下次刷新时间。
- REMOVE
描述:删除指定job。
接口:
DBMS_JOB.REMOVE ( job IN BINARY_BIGINT );
参数:
job:待删除的任务标识。
说明:可以通过remove接口移除一个已经存在的job。如果该任务正在执行则不影响本次执行,但下次将不再执行。
- RUN
描述:运行指定job。
接口:
DBMS_JOB.RUN ( job IN BINARY_BIGINT, force IN BOOLEAN DEFAULT FALSE);
参数:
job:待运行的任务标识。
force :兼容语法,暂不生效。
- SUBMIT
描述:创建一个job。
接口:
DBMS_JOB.SUBMIT ( job OUT BINARY_BIGINT, what IN VARCHAR2, next_date IN DATE DEFAULT sysdate, interval IN VARCHAR2 DEFAULT 'null', no_parse IN BOOLEAN DEFAULT FALSE, instance IN BINARY_INTEGER DEFAULT 0, force IN BOOLEAN DEFAULT FALSE);
参数:
- job:创建的任务标识。
- what:job执行的PLSQL块。
- next_date:下次执行时间。
- interval:执行间隔表达式。
- no_parse:false创建时进行what和interval解析,true创建时不解析。
- instance:兼容语法,暂不生效。
- force:兼容语法,暂不生效。
示例1
create table test_job( id varchar2(30), dt varchar2(30) ); create or replace procedure job_proce_t is begin insert into test_job(id, dt) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')); commit; end job_proce_t; / declare jobno number; begin dbms_job.submit(jobno,'job_proce_t();', sysdate, 'sysdate+1/24/60'); commit; end; / declare jobno int; begin select job into jobno from user_jobs where what='job_proce_t();'; dbms_job.broken(jobno, true, sysdate); commit; end; / declare jobno int; begin select job into jobno from user_jobs where what='job_proce_t();'; dbms_job.run(jobno); commit; end; / declare jobno int; begin select job into jobno from user_jobs where what='job_proce_t();'; dbms_job.remove(jobno); commit; end; /
示例2
系统在启动时将默认创建进行全量统计信息收集和变化数据统计信息收集job。
CREATE OR REPLACE PROCEDURE GATHER_DB_STATS( estimate_percent NUMBER DEFAULT 30, force BOOLEAN DEFAULT TRUE ) --force false: don't gather when cbo is disable IS cbo_enable VARCHAR(3); BEGIN --check cbo flag IF force = FALSE THEN SELECT VALUE INTO cbo_enable FROM SYS.DV_PARAMETERS WHERE NAME='CBO'; IF UPPER(cbo_enable) = 'OFF' THEN RETURN; END IF; END IF; --flush modification to table DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO(); --only gather heap table FOR ITEM IN (SELECT A.OWNER, A.TABLE_NAME FROM DBA_TABLES A, DBA_TAB_MODIFICATIONS B WHERE A.PARTITIONED = 0 AND A.TABLE_TYPE ='HEAP' AND A.OWNER = B.TABLE_OWNER AND A.TABLE_NAME=B.TABLE_NAME AND (NVL(B.INSERTS, 0) + NVL(B.UPDATES, 0) + NVL(B.DELETES, 0))>0) LOOP BEGIN DBMS_STATS.GATHER_TABLE_STATS(ITEM.OWNER, ITEM.TABLE_NAME, null, estimate_percent); EXCEPTION WHEN OTHERS THEN NULL; END; END LOOP; END; / CREATE OR REPLACE PROCEDURE GATHER_CHANGE_STATS( estimate_percent NUMBER DEFAULT 30, change_percent NUMBER DEFAULT 10, force BOOLEAN DEFAULT TRUE ) --force false: don't gather when cbo is disable IS cbo_enable VARCHAR(3); BEGIN --check cbo flag IF force = FALSE THEN SELECT VALUE INTO cbo_enable FROM SYS.DV_PARAMETERS WHERE NAME='CBO'; IF UPPER(cbo_enable) = 'OFF' THEN RETURN; END IF; END IF; --flush modification to table DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO(); --gather the table changed FOR ITEM IN (SELECT A.OWNER, A.TABLE_NAME FROM DBA_TABLES A, DBA_TAB_MODIFICATIONS B WHERE A.PARTITIONED = 0 AND A.OWNER = B.TABLE_OWNER AND A.TABLE_NAME=B.TABLE_NAME AND( A.NUM_ROWS is null or ((NVL(B.INSERTS, 0) + NVL(B.UPDATES, 0) + NVL(B.DELETES, 0))>= (CHANGE_PERCENT * A.NUM_ROWS/100)))) LOOP BEGIN DBMS_STATS.GATHER_TABLE_STATS(ITEM.OWNER, ITEM.TABLE_NAME, NULL, estimate_percent); EXCEPTION WHEN OTHERS THEN NULL; END; END LOOP; --temp table without statistic will gather at the first time FOR ITEM IN (SELECT OWNER, TABLE_NAME FROM DBA_TABLES WHERE PARTITIONED = 0 AND TABLE_TYPE <> 'HEAP' AND LAST_ANALYZED IS NULL) LOOP BEGIN DBMS_STATS.GATHER_TABLE_STATS(ITEM.OWNER, ITEM.TABLE_NAME, null, estimate_percent); EXCEPTION WHEN OTHERS THEN NULL; END; END LOOP; END; / DECLARE JOBNO NUMBER; BEGIN DBMS_JOB.SUBMIT(JOBNO,'GATHER_DB_STATS(estimate_percent=>30, force=>FALSE);', TRUNC(SYSDATE+1) + 1/24, 'TRUNC(sysdate+1) +1/24'); COMMIT; END; / DECLARE JOBNO NUMBER; BEGIN DBMS_JOB.SUBMIT(JOBNO,'GATHER_CHANGE_STATS(estimate_percent=>30, change_percent=>10, force=>FALSE);', SYSDATE, 'SYSDATE+15/24/60'); COMMIT; END; /
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- REMOVE