乐趣区

PLSQLDBMSJOB-定时执行

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

  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(

退出移动版