[英]Trigger for insert, delete, update returning old & new value in Oracle Database
因此,我有一个名为parts的表,其中包含 PartID、PartName、PartColor、PartPrice、PartCity列,我想创建一个触发器,在插入和更新时通过.put_line返回旧值和新值,并在删除时返回旧值。
我想用一个触发器来完成这一切。
我写了这个触发器,它不起作用:
(PL/SQL:语句被忽略 PLS-00306:错误编号或类型的 arguments 在调用“DELETING” PL/SQL:语句被忽略 PLS-00306:错误编号或类型的 arguments 在调用“插入”)
create or replace trigger parts_aft_upd_ins_del
after update or insert or delete
on parts
for each row
begin
if updating then
dbms_output.put_line('Triggered by UPDATE');
if updating('PartID') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartID) || ' NEW: ' ||
trim(:new.PartID));
elsif updating('PartName') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartName) || ' NEW: ' ||
trim(:new.PartName));
elsif updating('PartColor') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartColor) || ' NEW: ' ||
trim(:new.PartColor));
elsif updating('PartPrice') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartPrice) || ' NEW: ' ||
trim(:new.PartPrice));
elsif updating('PartCity') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartCity) || ' NEW: ' ||
trim(:new.PartCity));
else
dbms_output.put_line('Old & New values unknown.');
end if;
elsif deleting then
dbms_output.put_line('Triggered by DELETE');
if deleting('PartID') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartID) ||);
elsif deleting('PartName') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartName));
elsif deleting('PartColor') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartColor));
elsif deleting('PartPrice') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartPrice));
elsif deleting('PartCity') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartCity));
else
dbms_output.put_line('Old values unknown.');
end if;
elsif inserting then
dbms_output.put_line('Triggered by INSERT');
if inserting('PartID') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartID) || ' NEW: ' ||
trim(:new.PartID));
elsif inserting('PartName') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartName) || ' NEW: ' ||
trim(:new.PartName));
elsif inserting('PartColor') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartColor) || ' NEW: ' ||
trim(:new.PartColor));
elsif inserting('PartPrice') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartPrice) || ' NEW: ' ||
trim(:new.PartPrice));
elsif inserting('PartCity') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartCity) || ' NEW: ' ||
trim(:new.PartCity));
else
dbms_output.put_line('Old & New values unknown.');
end if;
else
dbms_output.put_line('Trigger "parts_aft_upd_ins_del" unknown error.');
end if;
end;
/
show errors
你知道我如何解决这个问题吗?
您正在删除整行,因此例如deleting('PartID')
没有意义。 仅使用deleting
。
您的触发器中有多个错误。
deleting
/ inserting
不带任何参数。 它们是布尔值。:old
值始终为 null,而删除时:new
值始终为 null。使用以下代码解决上述两个问题。
create or replace trigger parts_aft_upd_ins_del
after update or insert or delete
on parts
for each row
begin
if updating then
dbms_output.put_line('Triggered by UPDATE');
dbms_output.put_line('OLD: ' || trim(:old.PartID) || ' NEW: ' || trim(:new.PartID));
dbms_output.put_line('OLD: ' || trim(:old.PartName) || ' NEW: ' || trim(:new.PartName));
dbms_output.put_line('OLD: ' || trim(:old.PartColor) || ' NEW: ' || trim(:new.PartColor));
dbms_output.put_line('OLD: ' || trim(:old.PartPrice) || ' NEW: ' || trim(:new.PartPrice));
dbms_output.put_line('OLD: ' || trim(:old.PartCity) || ' NEW: ' || trim(:new.PartCity));
elsif deleting then
dbms_output.put_line('Triggered by DELETE');
dbms_output.put_line('OLD: ' || trim(:old.PartID) ||);
dbms_output.put_line('OLD: ' || trim(:old.PartName));
dbms_output.put_line('OLD: ' || trim(:old.PartColor));
dbms_output.put_line('OLD: ' || trim(:old.PartPrice));
dbms_output.put_line('OLD: ' || trim(:old.PartCity));
elsif inserting then
dbms_output.put_line('Triggered by INSERT');
dbms_output.put_line(' NEW: ' || trim(:new.PartID));
dbms_output.put_line( ' NEW: ' || trim(:new.PartName));
dbms_output.put_line( ' NEW: ' || trim(:new.PartColor));
dbms_output.put_line(' NEW: ' || trim(:new.PartPrice));
dbms_output.put_line(' NEW: ' || trim(:new.PartCity));
end if;
end;
/
感谢@Littlefoot 指出我的逻辑错误。
代码现在工作得很好:
create or replace trigger parts_aft_upd_ins_del
after update or insert or delete
on parts
for each row
begin
if updating then
dbms_output.put_line('Triggered by UPDATE');
if updating('PartID') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartID) || ' NEW: ' ||
trim(:new.PartID));
elsif updating('PartName') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartName) || ' NEW: ' ||
trim(:new.PartName));
elsif updating('PartColor') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartColor) || ' NEW: ' ||
trim(:new.PartColor));
elsif updating('PartPrice') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartPrice) || ' NEW: ' ||
trim(:new.PartPrice));
elsif updating('PartCity') then
dbms_output.put_line('OLD: ' ||
trim(:old.PartCity) || ' NEW: ' ||
trim(:new.PartCity));
else
dbms_output.put_line('Old & New values unknown.');
end if;
elsif deleting then
dbms_output.put_line('Triggered by DELETE');
if deleting() then
dbms_output.put_line('OLD PartID: ' || trim(:old.PartID) ||
' OLD PartName: ' || trim(:old.PartName) ||
' OLD PartColor: ' || trim(:old.PartColor) ||
' OLD PartPrice: ' || trim(:old.PartPrice) ||
' OLD PartCity: ' || trim(:old.PartCity)
);
else
dbms_output.put_line('Old values unknown.');
end if;
elsif inserting then
dbms_output.put_line('Triggered by INSERT');
if inserting() then
dbms_output.put_line('NEW PartID: ' || trim(:new.PartID) ||
' NEW PartName: ' || trim(:new.PartName) ||
' NEW PartColor: ' || trim(:new.PartColor) ||
' NEW PartPrice: ' || trim(:new.PartPrice) ||
' NEW PartCity: ' || trim(:new.PartCity)
);
else
dbms_output.put_line('New values unknown.');
end if;
else
dbms_output.put_line('Trigger "parts_aft_upd_ins_del" unknown error.');
end if;
end;
/
show errors
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.