[英]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.