看完这篇文章你会学习到以下内容:
- 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(
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。