Oracle创建定时任务——-job

授权 

说明:

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;

授权成功。

任务job

创建定时任务job

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;

查看创建的job 

   select job,broken,what,interval,t.* from user_jobs t;

执行job

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;

 移除定时任务job

1
2
3
begin    
        dbms_job.remove(31); --  /*删除自动执行的job,参数是 job的id*/
end;

停止定时任务job

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. dbms_jos的各字段含义:

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 没有受限

2. INTERVAL 部分参数值示例:

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

你可能感兴趣的:(数据库,#,oracle,oracle,数据库)