我必须为包含许多列的表创建一个触发器,我想现在是否有可能避免使用以下列之后的列名:new和:old。而不是专门使用列名我想使用集合中的元素与目标表的列名(设置触发器的表)。
第25行是绑定错误:
DBMS_OUTPUT.PUT_LINE('Updating customer id'||col_name(i)||to_char(:new.col_name(i)));
Bellow你可以看到我的触发器:
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;
此致,
答案 0 :(得分:0)
在挖掘更多内容后,我发现无法在触发器中动态引用:new.column_name或:old.column_name值。因此,我将仅使用我的代码INSERT(它没有旧值:-(),我将在java中执行一些代码来生成UPDATE语句。
答案 1 :(得分:0)
我必须根据Justin Cave所说的内容以及我的发现来完善我以前的答案。我们可以根据引用子句(旧的和新的)创建由INSERTING和UPDATING触发的动态值列表。例如,我创建了2个带有varchars的嵌套表类型的集合。一个集合将包含所有列选项卡(作为字符串),我将用于审计,另一个集合将包含具有绑定引用的列的值(例如:new。)。在INSERTING谓词之后,我已经按字符串的集合(关联数组)创建了一个索引,其ID取自具有列选项卡名称的字符串列表,以及从new引用的列的值列表中获取的值。由于收集索引,您可以使用完整的工作动态列表。祝你好运:-)