如何在触发器中将旧/新行记录为XML

时间:2016-08-10 15:31:26

标签: sql xml plsql triggers

我想要旧的&当触发器无法成功时,新行作为XML到异常表。我习惯使用通用EXCEPTION WHEN OTHERS THEN子句来注销失败,我无法弄清楚必须捕获(因此我可以将OLDNEW伪转换为XML。 / p>

好像是

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

应该有用,但也许我错过了一些简单的事情。

2 个答案:

答案 0 :(得分:0)

您无法从old中进行选择,并且无法一般性地访问old值,我担心 - 您必须指定old.empnoold.ename等一个接一个。

Tom Kyte已经展示了如何生成触发器以克服此here on asktom.oracle.com

答案 1 :(得分:0)

阅读the fine document

  

在行级别触发的触发器可以使用相关名称访问正在处理的行中的数据。默认的相关名称是OLD,NEW和PARENT。

     

OLD,NEW和PARENT也称为伪记录,因为它们具有记录结构,但允许的记录结构比记录少。伪记录的结构是table_name%ROWTYPE,其中table_name是创建触发器的表的名称(对于OLD和NEW)或父表的名称(对于PARENT)。

(伪记录还有文档中明确提到的其他限制,但这里没有引用。)

在所有其他事项中,限制意味着不能使用伪记录,例如在insert statement extension

因此,使用伪记录可以做的唯一事情是逐个引用它的字段。

示例

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;