说明:
grant create job to xxx;
grant manage scheduler to?xxx;
必须授这两个用户权限
SQL> grant create job to zxin_jzfp;
授权成功。
SQL> grant manage scheduler to zxin_jzfp;
授权成功。
SQL> grant update any table to zxin_jzfp;
授权成功。
SQL> grant select any table to zxin_jzfp;
授权成功。
SQL> grant create any table to zxin_jzfp;
授权成功。
SQL> grant create any procedure to zxin_jzfp;
授权成功。
DECLARE
job_id number;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => job_id
,what => 'poverty_sum_procedure' --执行的存储过程
,next_date => sysdate
,interval =>'TRUNC(sysdate,''mi'') + 1/ (24*60)' --每分钟执行 (mi 两遍的 单引号 ' 需要再加一个 单引号' 进行转义)
,no_parse => TRUE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(job_id)); --输出创建的jobjd
COMMIT;
END;
? ?select job,broken,what,interval,t.* from user_jobs t;
declarebegin? ?
DBMS_JOB.RUN(32);? ?
commit;
end;
存储过程测试过是没有问题的。
查看?F:\oracle11g\app\Administrator\diag\rdbms\hnapp\hnapp\trace\alert_hnapp.log
发现如下报错:
1 2 3 4 5 6 7 |
Wed Nov 11 09:37:04 2020 Errors in file f:\oracle11g\app\administrator\diag\rdbms\hnapp\hnapp\trace\hnapp_ora_11092.trc: ORA-12012: 自动执行作业 30 出错 ORA-06550: 第 1 行, 第 118 列: PLS-00103: 出现符号 ""在需要下列之一时: ?:= . ( @ % ; 符号 ";" 被替换为 "" 后继续。 |
看来是job中的语法错误导致
检查后发现,submit时的?what参数值应该以分号结尾,修改为:
DECLARE ?
job_id ?number; ?
BEGIN ?
SYS.DBMS_JOB.SUBMIT(
job => job_id ?
,what => 'poverty_sum_procedure;' ?--执行的存储过程(以;号结尾)
,next_date => sysdate ?
,interval =>'TRUNC(sysdate,''mi'') + 1/ (24*60)' --每分钟执行 ?(mi 两遍的 单引号 ' 需要再加一个 单引号' 进行转义)
,no_parse => TRUE ?
); ?
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(job_id)); ?--输出创建的jobjd
COMMIT; ?
END;
1 2 3 |
begin ? ? ? ? ? ? dbms_job.remove(31); -- ?/*删除自动执行的job,参数是 job的id*/ end; |
1 2 3 4 5 6 |
declare
begin ? ? dbms_job.broken(24,true,sysdate); ? ? ?
?/*停止一个job,jobId, job的ID,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。 ? */ commit; end; |
1 2 3 4 5 |
declare
begin ? dbms_job.interval(24,interval => 'TRUNC(SYSDATE)+1'); ?
???/*第一个参数为job的ID,第二个参数interval: 计算下一次任务执行的时间表达式*/ ? commit; end; |
1 2 3 4 5 6 |
declare begin ? ?dbms_job.next_date(24,to_date('2020-11-9 12:08:00','yyyy-mm-dd hh24:mi:ss')); ? ?/*第一个参数:job的ID;第二个参数:要修改后的计算下一次执行的时间表达式*/ ? ?commit; end; |
1 2 3 4 5 6 |
declare begin ? ? dbms_job.what(24,'testJob2();'); ? ? ? ?/* 第一个参数:job的ID;第二个参数:要更改的新操作名称(操作名必须存在)*/ commit; end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
JOB ? ? ? ? ? ? ?任务的唯一标识码 LOG_USER ? ? ? ? 提交任务的用户 PRIV_USER ? ? ? ? 赋予任务权限的用户 SCHEMA_USER ? ? ? ? ? 对用户作语法分析的用户模式 LAST_DATE ? ? ? ? 最后一次成功执行任务的时间 LAST_SEC ? ? ? ? 最后一次成功执行任务的时间的时分秒 THIS_DATE ? ? ? ? 正在执行的任务的开始时间,若没有则为空 THIS_SEC ? ?? ? 正在执行的任务的开始时间的时分秒,若没有则为空 NEXT_DATE ? ? ? 下一次执行定时任务的时间 NEXT_SEC ? ?? ? 下一次执行定时任务的时间的时分秒 TOTAL_TIME ?? ? 执行当前任务所需要的时间,单位:秒 BROKEN ? ? ? ? 标志参数,Y表示任务中断,以后不会再运行 INTERTAL ? ?计算下一次执行定时任务的时间表达式 FAILURES ? ?当前定时任务执行失败的总次数 WHAT ? ?? ? 执行任务的PL/SQL代码块 NLS_ENV ? ? 任务执行的NLS会话设置 MISC_ENV? ? ?定时任务运行的其他一些参数设置 INSTANCE? ? ?标识当前任务运行是否受限,0 没有受限 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
每天午夜12点: 'TRUNC(SYSDATE + 1)' ? 每天早上8点30分: 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)' ? 每星期二中午12点: 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' ? 每个月第一天的午夜12点: 'TRUNC(LAST_DAY(SYSDATE ) + 1)' ? 每个季度最后一天的晚上11点: 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' ? 每星期六和日早上6点10分: 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)' ? 每月25号00:00执行: 'TRUNC(LAST_DAY(SYSDATE ) + 25)' ? -------------------------- ? 1:每分钟执行 Interval => TRUNC(sysdate,'mi') + 1/ (24*60) 或 Interval => sysdate+1/1440 ? 2:每天定时执行 例如:每天的凌晨1点执行 Interval => TRUNC(sysdate) + 1 +1/ (24) ? ? 3:每周定时执行 例如:每周一凌晨1点执行 Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 ? 4:每月定时执行 例如:每月1日凌晨1点执行 Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 ? 5:每季度定时执行 例如每季度的第一天凌晨1点执行 Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24 ? 6:每半年定时执行 例如:每年7月1日和1月1日凌晨1点 Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 ? 7:每年定时执行 例如:每年1月1日凌晨1点执行 Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 |