本文根据自己在项目中实际使用的情况,对Oracle定时器实例进行介绍:
创建测试数据库表
-- ----------------------------
-- Table structure for JOBTEST
-- ----------------------------
DROP TABLE "SCOTT"."JOBTEST";
CREATE TABLE "SCOTT"."JOBTEST" (
"LOCK_STATUS" VARCHAR2(2 BYTE) DEFAULT 'N' NULL ,
"LOCK_DATE" TIMESTAMP(6) NULL ,
"UN_LOCK_DATE" TIMESTAMP(6) NULL
);
COMMENT ON COLUMN "SCOTT"."JOBTEST"."LOCK_STATUS" IS 'Y 锁定 N 解锁';
COMMENT ON COLUMN "SCOTT"."JOBTEST"."LOCK_DATE" IS '加锁时间';
COMMENT ON COLUMN "SCOTT"."JOBTEST"."UN_LOCK_DATE" IS '解锁时间';
插入几条测试数据
-- ----------------------------
-- Records of JOBTEST
-- ----------------------------
INSERT INTO "SCOTT"."JOBTEST" VALUES ('Y', TO_TIMESTAMP(' 2018-10-28 14:44:41:000000', 'YYYY-MM-DD HH24:MI:SS:FF6'), null);
INSERT INTO "SCOTT"."JOBTEST" VALUES ('Y', TO_TIMESTAMP(' 2018-10-28 14:44:52:000000', 'YYYY-MM-DD HH24:MI:SS:FF6'), null);
INSERT INTO "SCOTT"."JOBTEST" VALUES ('N', TO_TIMESTAMP(' 2018-10-28 14:45:01:000000', 'YYYY-MM-DD HH24:MI:SS:FF6'), null);
此时数据库中数据如下:
Oracle定时器一般包括4步:
- 创建一个存储过程
-- 创建存储过程
CREATE OR REPLACE PROCEDURE unlockTest IS
BEGIN
UPDATE JOBTEST
SET LOCK_STATUS = 'N',
UN_LOCK_DATE = SYSDATE
WHERE LOCK_STATUS = 'Y'
AND SYSDATE > (LOCK_DATE + 10 /(24 * 60));
COMMIT ;
END ;
-- unlockTest为存储过程的名称
-- BEGIN后面跟着的SQL就是要定时执行的SQL语句
-- 一定要记得在END之前添加COMMIT;(注意有分号)
如果使用的是Navicat,可以先关闭数据库连接,再打开,在对应库中的“函数”部分就可以看到刚才创建的存储过程:
- 定义执行时间
-- 定义执行时间
DECLARE
unlockTest_timer number;
BEGIN
SYS.DBMS_JOB.SUBMIT(
job => unlockTest_timer,
what => 'unlockTest;',
next_date => SYSDATE,
interval => 'sysdate+10/(24*60)');
Commit;
End;
-- DECLARE 用来定义unlockTest_timer 的定时器编号
-- SYS.DBMS_JOB.SUBMIT中的job 指的是定时器编号,在DECLARE 中已经声明
-- SYS.DBMS_JOB.SUBMIT中的what 指的是要执行的存储过程,也就是SQL语句
-- SYS.DBMS_JOB.SUBMIT中的next_date 指的是下次执行时间
-- SYS.DBMS_JOB.SUBMIT中的interval 指的是每次执行时间的间隔时间
执行间隔interval 的运行时间可以参考:https://www.cnblogs.com/lcword/p/5622966.html
- 查看定时器
--查看在执行的定时器
SELECT job, next_date, next_sec, failures, broken FROM user_jobs;
执行结果如图:JOB对应的是定时器编号,NEXT_DATE是指下次执行时间;所以等到时间到了,我们可以查看数据库是否被操作
由图可知,定时器在指定时间已经运行了
为了进一步验证定时器是否正常运行,手动修改最后一条数据的LOCK_STATUS为Y,并等到下一次执行时间进行检验:
- 删除定时器
--删除定时器
Begin
dbms_job.remove(24); -- 24就是上面查出来的定时器编号
Commit;
End;
到此为止,ORACLE中定时器的基础用法介绍结束。仅供参考,边学边进步!
参考链接:http://blog.51cto.com/viphyy/1600264