我需要做一个触发器,但我要做的唯一区别是根据':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'无法识别。请帮忙!我遇到这个问题需要很多时间,我无法解决。
谢谢,对不起我的英语。
答案 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
行,而不是自己键入所有这些行。