1、Oracle与Job有关的操作都是通过DBMS_JOB来完成的;
2、后台进程CJQ0(Coordinate Job Queue)定期查询dba_views,并将这些job按时间进行排序。当发现一个Job可以运行了,就自动产生一个Job Queue进程(Jnnn)来执行这个Job.
3、通过数据库的参数JOB_QUEUE_PROCESSES来控制:1)是否启动CJQ0 2)Job Queue进程的个数(即可同事执行的Job的最大个数)。JOB_QUEUE_PROCESSES为0,则CJQ0不启动,所有Job均不会如期执行。 JOB_QUEUE_PROCESSES为为20,表明最大20个Job可以同时运行. JOB_QUEUE_PROCESSES参数是dynamic的,可动态修改:ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;
4、创建一个JOB:
VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno,
'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
''HR'', ''EMPLOYEES'',
''ESTIMATE'', NULL, 50);',
SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
PRINT jobno
DBMS_JOB.SUBMIT 的格式为:
SUBMIT(JOBNO,WHAT,NEXT_DATE,INTERVAL,NO_PARSE),其中:
jobno是 一个OUT参数。当SUBMIT执行完毕,jobno会带出ORACLE分配的job号码。这个job号码作为这个JOB的标识
WHAT是这 个JOB要做的事情。用''引起来的任何PL/SQL语句
NEXT_DATE是下次要执行这个JOB的时间。默认为SYSDATE
INTERVAL 是间隔,决定了这个任务下次运行的时间。每次JOB运行时,都会计算这个INTERVAL字段,并在执行完毕后将这个值放到NEXT_DATE字段中去, 作为下次执行的时间;
NO_PARSE:决定WHAT部分的东西实在SUBMIT的时候进行解析(FALSE)还是第一次执行的时候解析 (TRUE)。
5、常见的WHAT:
'myproc(''10-JAN-99'', next_date, broken);'
'scott.emppackage.give_raise(''JFEE'', 3000.00);'
'dbms_job.remove(job);'
6、常见的INTERVAL:
'SYSDATE + 7' 每七天
'SYSDATE + 1/48' 每半小时
'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'') + 15/24' 每周一的下午三点
'NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, ''Q''), 3), ''THURSDAY'')' 每季度的第1个星期四
7、删除一个JOB
BEGIN
DBMS_JOB.REMOVE(14144);
END;
/
8、Altering JOB
1)
BEGIN
DBMS_JOB.CHANGE(14144, NULL, NULL, 'SYSDATE + 3');
END;
/
2)
BEGIN
DBMS_JOB.WHAT(14144,'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
''HR'', ''DEPARTMENTS'',
''ESTIMATE'', NULL, 50);');
END;
/
3)
BEGIN
DBMS_JOB.NEXT_DATE(14144, SYSDATE + 4);
END;
/
4)
BEGIN
DBMS_JOB.INTERVAL(14144, 'NULL');
END;
/
9、broken job
一个JOB处于broken状态,这个JOB就不会再被执行。可以手工置这个状态,也可以再JQ尝试执行一个JOB失败16次后自动置;
10、 强迫执行JOB
BEGIN
DBMS_JOB.RUN(14144);
END;
/
11、停止JOB
找到JOB对应得SESSION,然后用ALTER SYSTEM KILL SESSION来KILL
12、相关VIEW
USER_JOBS
ALL_JOBS
DBA_JOBS
这些VIEW里边是COMMIT的JOB
DBA_JOBS_RUNNING里是正在RUN的JOB。停止JOB的时候,可以从这个里边找SESSION的ID。
--------------------------------------------------------------------------------------------------------------------------------------
job_queue_process 表示oracle能够并发的job的数量,可以通过语句
show parameter job_queue_process;
来查看oracle中job_queue_process的值。当job_queue_process值为0时表示全部停止oracle的 job。可以通过语句
ALTER SYSTEM SET job_queue_processes = 10;
来修改oracle中job_queue_process的值(这里改为10,job_queue_process的值该设为多少是另外的问 题),不过这种修改是动态的,当oracle重新启动后job_queue_process的值将仍然从/%ORACLE_HOME%/admin /mydb/pfile/init.ora文件中读取。