簡體   English   中英

如何在觸發器中將新行記錄為XML

[英]How to log old/new rows as XML in triggers

當觸發器無法成功執行時,我想將舊行和新行作為XML發送到例外表。 我習慣於使用泛型EXCEPTION WHEN OTHERS THEN子句注銷失敗時,我無法弄清楚的是必須將OLDNEW偽行捕獲(以便記錄)到XML中。

這好像是

old_x := dbms_xmlgen.getxml('select * from OLD');

應該工作,但也許我缺少一些簡單的東西。

您不能從old選擇,並且恐怕無法通用地訪問old值-您必須old.empno指定old.empnoold.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.

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