Oracle 在特定条件下触发执行

Oracle trigger execution on a particular condition

我的要求是我有一个 table 其中有 4 列(val1,val1_date,new_val1,new_val1_date)。

问题是当 new_val1 与 new_val1_date 一起更新时,我需要相应地更新列 val1,val1_date。

为此我创建了一个函数。

现在,当 new_val1_date 等于 sysdate 时,我想执行触发器。 我的触发器没有给我正确的结果。

任何人都可以帮助我。

create or replace TRIGGER MY_Trigger
     AFTER INSERT  OR UPDATE ON my_table 
FOR EACH ROW
WHEN (TO_DATE(NEW.new_val1_date,'dd/mon/yyyy')<=TO_DATE(sysdate,'dd/mon/yyyy'))
declare
    V_CD_ERROR NUMBER; 
    V_DS_ERROR VARCHAR2(500);

begin
    My_UpdateProc(V_CD_ERROR,V_DS_ERROR);
    DBMS_OUTPUT.PUT_LINE('V_CD_ERROR: ' || V_CD_ERROR || ' V_DS_ERROR ' || V_DS_ERROR);
end;

Oracle 日期列存储时间戳,因此除非您插入的值与 sysdate 精确到秒相匹配,否则它不会有预期的结果。

您需要“截断”日期,以便将两个值的时间戳设置为午夜。然后它将根据日期进行评估。

此外,评估应该在触发器的 begin/end 块内完成。

create or replace TRIGGER MY_Trigger
     AFTER INSERT  OR UPDATE ON my_table 
FOR EACH ROW
declare
    V_CD_ERROR NUMBER; 
    V_DS_ERROR VARCHAR2(500);

begin
  if (trunc(NEW.new_val1_date) = trunc(sysdate)) then
    My_UpdateProc(V_CD_ERROR,V_DS_ERROR);
    DBMS_OUTPUT.PUT_LINE('V_CD_ERROR: ' || V_CD_ERROR || ' V_DS_ERROR ' || V_DS_ERROR);
  end if;
end;