关于Oracle 触发器中定时执行SQL 的问题, Oracle触 发器只是在表中数据被更新 如Insert,update,delete 等情况下才会触发,不能做到定时,只是能是有变化时才会执行!
要做到定时执行可使用Job 来完成
数据已经完成插入,建议插入数据时,直接使用触发器
例2:限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。
CREATE OR REPLACE TRIGGER tr_dept_time
BEFORE INSERT OR DELETE OR UPDATE
ON departments
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改departments表');
END IF;
END;
oracle本身并没有直接的这个功能,可以变通的做法有2个,1)在插入时同步写一个标志表,dbms_job以非常快的速度检查标志表,发现有插入则执行procedure;2)新建插入后触发的Trigger,然后dbms_jobs检查。
你先说我这2个方案是否可行,考虑下1是服务器负载是否能支持高频率的触发dbms_job,然后延时是否必须非常精确,dbms_job能不能满足精度需求。如果都能满足,我再做sql给你.
定时plsql代码如下
此代码已计算定时(目前定时20分)
DECLARE
l_datediff NUMBER; --时间差
l_bein DATE; --程序执行时间
l_time NUMBER := 20; --定时
BEGIN
dbms_output.put_line(to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));
l_bein := SYSDATE;
LOOP
SELECT SYSDATE - l_bein
INTO l_datediff
FROM dual;
EXIT WHEN l_datediff >= l_time/(24*60); --计算时分秒
END LOOP;
END;
为什么要触发器执行,何不建job定时执行存储过程
定时器,貌似不用了吧