Oracle Job学习--两种不同Job使用区别
1.两种不同的Job
Oracle中有两种建立Job的方式:
1)建立user_job定时任务
declare job number; BEGIN DBMS_JOB.SUBMIT( JOB => job, /*自动生成JOB_ID*/ WHAT => 'proc_add_test;', /*需要执行的存储过程名称或SQL语句*/ NEXT_DATE => sysdate+3/(24*60), /*初次执行时间-下一个3分钟*/ INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/ ); commit; end;
执行之后可以通过:
select * from user_jobs;
2)通过调度器建立定时任务
begin
sys.dbms_scheduler.create_job(job_name => 'job_name',
job_type => 'PLSQL_BLOCK',
job_action => 'declare
PRM_ERRCODE number;
PRM_ERRMSG varchar2(200);
begin
proc_add_test(PRM_ERRCODE,PRM_ERRMSG);
end;',
start_date => to_date('01-04-2021 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
repeat_interval => 'Freq=Monthly;Interval=1',
end_date => to_date(null),
job_class => 'DEFAULT_JOB_CLASS',
enabled => true,
auto_drop => true,
comments => '测试job');
end;
2.两种Job定时任务的不同之处
1)两种Job都可以调用已有的存储过程进行定时执行。
2)删除方法不同
a) user_job
begin /*删除自动执行的job*/ dbms_job.remove(40); end;
b) 调度器job
begin
sys.dbms_scheduler.drop_job('job_name'); ---job名称
end;
3)重点 如果存储过程中用到了游标CURSOR只能用调度器Job进行执行,经过尝试user_job无法执行含有游标的存储过程
亲测,一开始用user_job执行存储过程,执行都是成功的,但是数据并没有落地。最后换了调度器Job才好使。