看完这篇文章你会学习到以下内容:

  1. DBMS_JOB 的语法。
  2. 如何创建,如何查询,如何移除?
  3. 常见的间隔时间,如何书写?
  4. 在写代码时,可能会出现的问题有哪些?

DBMS包下的JOB对象,语法如下:

DECLARE jobno number:=1;            -- 随便定义一个初始数字
BEGIN
dbms_job.submit(:jobno,—-job号 ,
                            'your_procedure;',—-执行的存储过程, ';'不能省略 
                             next_date, —-下次执行时间  
                             'interval' —-每次间隔时间,interval以天为单位
                             ); 
END;

以下简单举个例子:

1.建立一场临时表
2.写一个存储过程,将数据写入临时表
3.建立一个定时JOB,并设置相隔1分钟时间
4.查看结果
5.停止定时JOB
6.删除定时JOB

CREATE OR REPLACE PROCEDURE SP_EMP_GAN_INSERT  -- 创建一个存储过程,插入数据到临时表里
IS
BEGIN
 INSERT INTO /*+ append */ EMP_GAN(EMPNO,ENAME,HIREDATE) VALUES(10,'GANZEXIN',SYSDATE);
END;

CREATE TABLE EMP_GAN AS SELECT * FROM EMP WHERE 1 =2; -- 创建临时表
SELECT * FROM EMP_GAN;  -- 查看临时表


DECLARE jobno NUMBER:=1;    -- 定义编号并赋值,作为第一个定时执行
BEGIN
  DBMS_JOB.SUBMIT(:JOBNO,'SP_EMP_GAN_INSERT;', SYSDATE, 'sysdate+1/24/60');  -- 每隔一分钟
COMMIT;   -- 提交
END;


SELECT * FROM USER_JOBS; --- 查看当前用户所有的JOB

BEGIN
 DBMS_JOB.BROKEN(49, TRUE, SYSDATE);   -- 用上面的语句得知这个JOB的编号是49,当日执行。
 COMMIT;
END;

SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM USER_JOBS; -- 如果NEXT_SEC 变成00;00:00 则表示已经停止任务;

BEGIN
DBMS_JOB.REMOVE(49);   --- 移除定时JOB
END;

常见的间隔时间

+1表示加一日,代表是明日的0时0分。

**1:每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/(24*60)

2:每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/(24)

第一个加一: 相当于加1日;
第二个加一: 相当于24小时分之1,亦即1小时。

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


每次写JOB的时候容易出错的地方:
1) 调用SP 存储过程的后面不要缺少";"分号
2) 间隔时间Interval,不能直接时间函数,在外面两边要加上' '


素材:
1.使用PL/SQL developer 创建DBMS_JOB定时任务
2.【Oracle学习笔记】定时任务(dbms_job) - yscit - 博客园
3.Oracle中DBMS_JOB创建定时任务_张普的专栏-CSDN博客_oracledbms_job
4.Oracle定时任务(2)-DBMS_JOB_NowOrNever-CSDN博客_begin dbms_job.instance(


蜗牛
27 声望13 粉丝