Oracle的Job

第一篇:介绍
job_queue_processes的参数不能为0才能用JOB
job_queue_processes 执行job的最大进程数,为0则所有JOB与scheduler都不会跑,一般设为10。
属于每个用户的job,只能由自己管理,DBA也没权管理别的用户的JOB。
第二篇:实验
实验:
--创建表T
drop table t;
create table t (d date,s varchar2(50));
--创建过程p
create or replace procedure p as
begin
insert into t values(sysdate,'aaa');
commit;
--exception
--when others then
--dbms_output.put_line('异常编码: ' || SQLCODE || ' 异常信息:'|| SQLERRM);
end;
/
--提交job
var job1 number;
exec DBMS_JOB.SUBMIT(:JOB1, what=>'p;',next_date=>SYSDATE, interval=>'sysdate+1/(60*24),no_parse => false');
commit;

第三篇:管理 
 
提交job,如果有多个过程执行,以;分隔。 
var job1 number;
exec DBMS_JOB.SUBMIT(:JOB1, what=>'p;',next_date=>SYSDATE, interval=>'sysdate+1/(60*24),no_parse => false');
commit;
no_parse的false(默认)表示提交job时就对执行的过程立刻语法分析,而true表示第一次执行时才进行语法分析。
提交job是一种事务行为,需要commit才能生效,没commit的话,从别的会话查DBA_JOBS视图查不到这个job,JOB也不会跑起来。如果rollback后这个job就没了。

手工运行一下这个job 
exec DBMS_JOB.RUN(:job1);
首先运行一下这个job中what定义的过程,然后会按常规间隔跑起来,如果本来是broken的话,也会转为未破。不是事务行为,只要一RUN,就算没commit,其他会话也能从dba_jobs查到最新的视图。
--将一个已破job转为未破job
exec DBMS_JOB.BROKEN(<JOB_ID>,FALSE);
commit;
是事务行为,转为未破job后,job也不会立刻运行,而是要等commit;
exec dbms_job.broken(102,false,sysdate+1/24),最后一个参数next_date指定什么时候转。
--删除这个job
exec DBMS_JOB.REMOVE(:JOB1);
commit;
如果job正在跑的话,会坚持跑完的。事务行为,需要commit;
--修改下次执行时间
exec dbms_job.next_date (:job1,SYSDATE + 10/(24*60));
commit;
--修改执行间隔
exec dbms_job.interval(:job1,'sysdate+30/1440');
commit;
--TRUNC(SYSDATE+1)+10/24 每天上午10点执行一次
--TRUNC(next_day(sysdate,2))+1/24 每周二的凌晨1点执行
--TRUNC(LAST_DAY(SYSDATE))+1+1/24 每月1号凌晨1点执行
--重新提交job的内容
exec dbms_job.what(:job1,'p2;');
exec dbms_job.what(:job1,'update t set d=sysdate;commit;');
commit;
--更改JOB参数
输入job号是必须的,其余三项可以改变,为Null的话表示不变。
事务行为,如果更改了JOB的参数而未commit,job将暂时停止执行,此时JOB的broken标记并不会改变,并且只有自己会话看到当前JOB参数已变动。本会话未commit,是对job$这个表相关行加了锁,其他会话对这个JOB不能做任何变动,也不能RUN。
--下面的过程只更改interval
exec  dbms_job.change(job=>5869,what=>null,next_date=>null,interval=>'sysdate+5/24/60'); 
commit;
关于job诊断
用户报上来的Job问题,首先检查job_queue_processes参数。
代码(例如过程p)运行过程中,假如Insert的列字段类型不对,执行过程中出错了,FAILURES值会加1,有异常捕获的话就算有错,程序也能正常跑下去,此时failure就不会加1。如果语法有错,例如values写成value,编译过程时就已经会报错,编译出来的对象也会是INVALID,此时job跑一次failure也会加1。
failure16次后,还未能成功执行,将被标记为broken,此时oracle将不再尝试执行这个job。



第四篇:查视图
查看部署了的JOB。
select * from dba_jobs;
查看正在运行的JOB
select * from dba_jobs_running;
查看OS上,运行JOB的进程。
select * from v$process where program like '%(J%';
program是诸如oracle@cnsh281004 (J000)这样的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值