簡體   English   中英

在 Oracle 數據庫中插入、刪除、更新返回舊值和新值的觸發器

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM