如何在更新后将行转换为应用触发器中的CLOB?

时间:2013-08-05 09:08:10

标签: oracle plsql triggers oracle11g

我的想法是,我希望在更新时将记录克隆为 CLOB 。 为什么这样做? 有两种不同的应用 A1 A2 A1 取决于 A2 。 根据 A1 值,计算 A2 的值。

A2 流程每天仅运行一次以计算值,但对于A1, TABLE_NAME 中的每个字段都可以每天更改几次并且不会有历史。

目的是在自动表格的表格“ NEW_TABLE ”中创建一个CLOB字段的历史记录。

对不起我的英语,但如果有些事情不可理解,我可以重写这个问题

我的代码在这里:


CREATE or REPLACE TRIGGER TRIGGER_NAME
AFTER  UPDATE
   ON TABLE_NAME 
   FOR EACH ROW 

DECLARE
    row_record                  NEW_TABLE%rowtype;
    c_xml                       CLOB;   


    FUNCTION GetXML(a_tablela varchar2, a_key_1 varchar2, a_key_2 varchar2)
      RETURN CLOB
      is
       x_xml CLOB;
    BEGIN      
      select dbms_xmlgen.getxml('select * from '||a_tablela||' where key_1 = '''||a_key_1||''' and key_2 = '''||a_key_2||'''') into x_xml from dual;              
      return x_xml;
    END;
BEGIN

    --** TABLE_NAME Automatically fetches all columns and transforms them to CLOB
    c_xml := GetXML('TABLE_NAME', :new.key_1, :new.key_2);
    if c_xml is not null then 
        row_record.TABLE_NAME :=c_xml; 
    end if;                


    INSERT INTO NEW_TABLE VALUES row_record;


EXCEPTION
   when others then
        raise_application_error(-20000,'ERROR: '||to_char(sqlcode));

END;


现在我收到错误:

  

ORA-04091 :表格 TABLE_NAME 正在变异,触发/功能可能看不到它。

当我在 SELECT 语句中获得此记录时。

如何在应用的 TRIGGER AFTER UPDATE 中将行转换为CLOB?

感谢。

1 个答案:

答案 0 :(得分:1)

您无法使用select语句的原因是因为您处于触发器中,并且表正在更改或“变异”,如错误所示。从这里更新的行中获取数据的唯一方法是使用新旧:

old.column1
new.column1

旧版是更新前列的值,new是更新后的值。
示例:


CREATE or REPLACE TRIGGER TRIGGER_NAME
AFTER  UPDATE
    ON TABLE_NAME 
    FOR EACH ROW 
BEGIN
    l_string := 'This is the old value for column 1: ' || old.column1 || '. This is the new value: ' || new.column1;
    dbms_output.put_line(l_string);
END;

您将无法使用dbms_xmlgen,因为它使用select语句,该语句会引发变异错误异常。

我不确定我是否完全理解你要做的事情,但你应该能够自己建立 CLOB ,只需将自己与列名联系起来即可。像这样:


CREATE or REPLACE TRIGGER TRIGGER_NAME
AFTER  UPDATE
    ON TABLE_NAME 
    FOR EACH ROW 
BEGIN
    l_clob := 'Column1 ' || old.column1 || ', Column2 ' || old.column2; --For as many columns as are in the table
    --Now you have a clob with all the old values, insert it where you want it
END;

然后从那里开始。如果你真的想要XML格式,你也可以自己做,只需将字符串连接在一起。