繁体   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