【发布时间】:2016-07-14 06:28:08
【问题描述】:
我必须为包含许多列的表创建触发器,如果有可能避免在 :new 和 :old 之后使用列的名称,我现在想这样做。我不想专门使用列名,而是将集合中的元素与目标表(设置触发器的表)的列名一起使用。
第25行是绑定错误:
DBMS_OUTPUT.PUT_LINE('Updating customer id'||col_name(i)||to_char(:new.col_name(i)));
下面你可以看到我的触发器:
CREATE OR REPLACE TRIGGER TEST_TRG BEFORE
INSERT OR
UPDATE ON ITEMS REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE TYPE col_list IS TABLE OF VARCHAR2(60);
col_name col_list := col_list();
total INTEGER;
counter INTEGER :=0;
BEGIN
SELECT COUNT(*)
INTO total
FROM user_tab_columns
WHERE table_name = 'ITEMS';
FOR rec IN
(SELECT column_name FROM user_tab_columns WHERE table_name = 'ITEMS'
)
LOOP
col_name.extend;
counter :=counter+1;
col_name(counter) := rec.column_name;
dbms_output.put_line(col_name(counter));
END LOOP;
dbms_output.put_line(TO_CHAR(total));
FOR i IN 1 .. col_name.count
LOOP
IF UPDATING(col_name(i)) THEN
DBMS_OUTPUT.PUT_LINE('Updating customer id'||col_name(i)||to_char(:new.col_name(i)));
END IF;
END LOOP;
END;
此致,
【问题讨论】:
-
不,不是。根据您要完成的工作,您可能会编写一些代码,根据数据字典动态构建您想要的触发器。
-
我想使用触发器来创建一个审计表,其中每列的记录都已更改。
-
你能给我发一个例子的链接吗,请。