动态column_value根据触发器中的动态column_name

时间:2011-12-22 18:57:52

标签: oracle triggers oracle10g

我需要做一个触发器,但我要做的唯一区别是根据':new.COLUMN_NAME'和':old.COLUMN_NAME'获得动态值

我在一个查询中带来一个表的列,然后用一个for LOOP运行它。

这是我的触发器:

CREATE OR REPLACE TRIGGER aft_ins_soliccambio
AFTER INSERT OR DELETE OR UPDATE
ON SEG_V_SOLICCAMBIO
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
   old_col_value   VARCHAR2 (4000);
   new_col_value   VARCHAR2 (4000);
BEGIN
   FOR REC IN (  SELECT OWNER, TABLE_NAME, COLUMN_NAME
                   FROM all_tab_columns
                  WHERE OWNER = 'EUCEDA' AND (TABLE_NAME = 'SEG_V_SOLICCAMBIO')
               ORDER BY column_id)
   LOOP
      EXECUTE IMMEDIATE ' select :new.' || REC.COLUMN_NAME || ' from dual'
               INTO new_col_value;

      pkg_tumi.insert_auditoria ('SEG_V_SOLICCAMBIO',
                                 REC.COLUMN_NAME,
                                 :new.EMPR_IDEMPRESA_N,
                                 fn_get_pk ('SEG_V_SOLICCAMBIO', 1),
                                 fn_get_pk ('SEG_V_SOLICCAMBIO', 2),
                                 fn_get_pk ('SEG_V_SOLICCAMBIO', 3),
                                 fn_get_pk ('SEG_V_SOLICCAMBIO', 4),
                                 fn_get_pk ('SEG_V_SOLICCAMBIO', 5),
                                 fn_get_pk ('SEG_V_SOLICCAMBIO', 6),
                                 1,
                                 '',
                                 new_col_value,
                                 SYSDATE,
                                 NULL);
   END LOOP;
END;

当我编译触发器时,它不会抛出任何错误但是当我尝试在表中插入一个新值时,我正在触发它会抛出此错误:

  

ORA-01008:没有todas las变量han sido enlazadas   ORA-06512:en“EUCEDA.AFT_INS_SOLICCAMBIO”,línea10   ORA-04088:错误执行主席'EUCEDA.AFT_INS_SOLICCAMBIO'

检查问题我意识到问题出现在'EXECUTE IMMEDIATE ..'但我看到的原因是:new.'dynamic_column'无法识别。请帮忙!我遇到这个问题需要很多时间,我无法解决。

谢谢,对不起我的英语。

1 个答案:

答案 0 :(得分:0)

触发器中的

:new:old有点不灵活。我不知道如何使用动态SQL来执行您尝试对EXECUTE IMMEDIATE执行的操作。我怀疑这是不可能的。

我担心我所知道的唯一选择有点费力。其中一种替代方法是将EXECUTE IMMEDIATE替换为CASE表达式,如下所示:

    new_col_value := CASE REC.COLUMN_NAME
                       WHEN 'COLUMN_1' THEN :new.column_1
                       WHEN 'COLUMN_2' THEN :new.column_2
                       WHEN 'COLUMN_3' THEN :new.column_3
                       ...
                     END;

有可能运行一个合适的SQL语句来生成此WHEN ... THEN ...语句中的所有CASE行,而不是自己键入所有这些行。