问题描述
我正在尝试创建一个行触发器 (之后),我将把该行内的所有: 新值转换为xml,并将其保存在另一个表或队列中
如果我使用: New静态地将列名与它联系在一起,我就可以做到这一点,但是我不想在触发器中静态地提及列名,因为列名将来可能会更改
我的问题是我无法将变量动态绑定到: NEW当我循环通过表的列并尝试获取: New时,它会出现错误。列名称
如果我使用: New静态地将列名与它联系在一起,我就可以做到这一点,但是我不想在触发器中静态地提及列名,因为列名将来可能会更改
我的问题是我无法将变量动态绑定到: NEW当我循环通过表的列并尝试获取: New时,它会出现错误。列名称
create or replace TRIGGER EVAL_CHANGE_TriggerActual_Test
AFTER INSERT OR UPDATE OR DELETE
ON PROJ_TEST
REFERENCING NEW AS new OLD AS old
FOR EACH ROW
DECLARE
p_xmldata XMLtype;
P_NEWROWDATA clob;
p_newrowxml clob;
ccolumn_item varchar(3000);
ccolname varchar(3000);
BEGIN
p_newrowxml:='select XMLElement("ResearchTable",';
FOR somecol IN (select cols.column_name as str from SYS.ALL_TAB_COLS cols where upper(cols.owner)=upper('DEVenv1_CUSTOM') and upper(cols.table_name)=upper('PROJ_TEST') order by column_id)
LOOP
ccolumn_item:='XMLElement("'||somecol.str||'", ' ;
-- ccolumn_item:=CONCAT(ccolumn_item,:NEW.DESCR );
-- This works fine when i try to add columns statically
ccolumn_item:=CONCAT(ccolumn_item,:NEW.'||somecol.str||' );
-- Error in the line here when i dynamically try to get value from new
p_newrowxml:=CONCAT(p_newrowxml,ccolumn_item );
END LOOP;
p_newrowxml:=CONCAT(p_newrowxml,' ) from dual');
DBMS_OUTPUT.PUT_LINE(p_newrowxml);
--EXECUTE IMMEDIATE p_newrowxml into p_xmldata ;
-- p_newrowdata:=p_xmldata.getClobVal();
END; 专家解答
没错-你不能动态访问它们。它们是绑定而不是真正的列。
解决此问题的一种方法是编写编写触发器的代码。无论如何,这要好得多,因为然后触发器包含静态代码 (因为查询all_tab_cols是昂贵的)。
这里有一个例子
https://asktom.oracle.com/pls/asktom/asktom.search?tag=generic-trigger-for-auditing-column-level-changes
解决此问题的一种方法是编写编写触发器的代码。无论如何,这要好得多,因为然后触发器包含静态代码 (因为查询all_tab_cols是昂贵的)。
这里有一个例子
https://asktom.oracle.com/pls/asktom/asktom.search?tag=generic-trigger-for-auditing-column-level-changes
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




