[英]How to log old/new rows as XML in triggers
當觸發器無法成功執行時,我想將舊行和新行作為XML發送到例外表。 我習慣於使用泛型EXCEPTION WHEN OTHERS THEN
子句注銷失敗時,我無法弄清楚的是必須將OLD
和NEW
偽行捕獲(以便記錄)到XML中。
這好像是
old_x := dbms_xmlgen.getxml('select * from OLD');
應該工作,但也許我缺少一些簡單的東西。
您不能從old
選擇,並且恐怕無法通用地訪問old
值-您必須old.empno
指定old.empno
, old.ename
等。
Tom Kyte 在asktom.oracle.com上展示了如何生成觸發器來克服此問題 。
閱讀優質文件 :
在行級別觸發的觸發器可以使用相關名稱訪問正在處理的行中的數據。 缺省的相關名稱是OLD,NEW和PARENT。
OLD,NEW和PARENT也稱為偽記錄,因為它們具有記錄結構,但是在比記錄更少的上下文中允許使用。 偽記錄的結構為table_name%ROWTYPE,其中table_name是在其上創建觸發器的表的名稱(用於OLD和NEW)或父表的名稱(用於PARENT)。
(偽記錄還具有文檔中明確提到的其他限制,但此處未引用。)
除其他限制外,這些限制意味着不能在插入語句擴展中使用偽記錄。
因此,對偽記錄唯一可以做的就是逐一引用它的字段。
例
create table a (a number, b date);
create table b (a number, b date);
create or replace trigger a_trg
before insert on a
for each row
begin
-- NEW pseudorecord is not a real record and therefore compilation will fail:
-- PLS-00049: bad bind variable 'NEW'
-- insert into b values :new;
-- NEW pseudorecord fields have to be referenced one-by-one
insert into b(a, b) values(:new.a, :new.b);
end;
/
show errors
insert into a values(1, sysdate);
select * from a;
select * from b;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.