我的想法是,我希望在更新时将记录克隆为 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?
感谢。
答案 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格式,你也可以自己做,只需将字符串连接在一起。