[英]Trigger for insert, delete, update returning old & new value in Oracle Database
So i have got a table called parts with the columns PartID, PartName, PartColor, PartPrice, PartCity and I want to create a trigger that returns the old and new values via .put_line when inserting and updating and return the old value when deleting.因此,我有一个名为parts的表,其中包含 PartID、PartName、PartColor、PartPrice、PartCity列,我想创建一个触发器,在插入和更新时通过.put_line返回旧值和新值,并在删除时返回旧值。
I want to do this all with one trigger.我想用一个触发器来完成这一切。
I wrote this trigger, which isn't working:我写了这个触发器,它不起作用:
(PL/SQL: Statement ignored PLS-00306: wrong number or types of arguments in call to 'DELETING' PL/SQL: Statement ignored PLS-00306: wrong number or types of arguments in call to 'INSERTING')
(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
Do you have any idea how I am able to solve this problem?你知道我如何解决这个问题吗?
You are deleting the whole row , so there's no point in eg deleting('PartID')
.您正在删除整行,因此例如
deleting('PartID')
没有意义。 Use deleting
only.仅使用
deleting
。
There are multiple errors in your trigger.您的触发器中有多个错误。
deleting
/ inserting
do not take any parameters. deleting
/ inserting
不带任何参数。 They are booleans.:old
values are always null and while deleting :new
values are always null.:old
值始终为 null,而删除时:new
值始终为 null。 Use the following code where both of the above issues are resolved.使用以下代码解决上述两个问题。
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;
/
Thanks to @Littlefoot for pointing out my logic error.感谢@Littlefoot 指出我的逻辑错误。
The code now works just fine:代码现在工作得很好:
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.