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;
我的要求是我有一个 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;