暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 行触发器中动态绑定列值的问题

ASKTOM 2020-07-16
407

问题描述

我正在尝试创建一个行触发器 (之后),我将把该行内的所有: 新值转换为xml,并将其保存在另一个表或队列中

如果我使用: 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


文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论