如何解决Oracle在特定条件下触发执行
我的要求是我有一个表,其中有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 Date列存储时间戳记,因此,除非您插入的值与sysdate匹配至第二个,否则不会获得预期的结果。
您需要“截断”日期,以便将两个值的时间戳都设置为午夜。然后它将基于日期进行评估。
此外,评估应在触发器的开始/结束块内完成。
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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。