看完这篇文章你会学习到以下内容:
- DBMS_JOB 的语法。
- 如何创建,如何查询,如何移除?
- 常见的间隔时间,如何书写?
- 在写代码时,可能会出现的问题有哪些?
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(