oracle触发器中定时执行sql

2024-11-29 13:47:49
推荐回答(5个)
回答1:

  1. 关于Oracle 触发器中定时执行SQL 的问题, Oracle触 发器只是在表中数据被更新 如Insert,update,delete 等情况下才会触发,不能做到定时,只是能是有变化时才会执行!

  2. 要做到定时执行可使用Job 来完成

  3. 数据已经完成插入,建议插入数据时,直接使用触发器

  4. 例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;

回答2:

oracle本身并没有直接的这个功能,可以变通的做法有2个,1)在插入时同步写一个标志表,dbms_job以非常快的速度检查标志表,发现有插入则执行procedure;2)新建插入后触发的Trigger,然后dbms_jobs检查。
你先说我这2个方案是否可行,考虑下1是服务器负载是否能支持高频率的触发dbms_job,然后延时是否必须非常精确,dbms_job能不能满足精度需求。如果都能满足,我再做sql给你.

回答3:

定时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;

回答4:

为什么要触发器执行,何不建job定时执行存储过程

回答5:

定时器,貌似不用了吧