访问触发器主体内的触发器表

时间:2015-11-06 09:30:42

标签: oracle function plsql parameters triggers

如何访问触发器主体内部有触发器的表?

create or replace trigger insert_try after insert on triggerTable for each row
begin
    insert into anotherTable (triggerFunction(:new.field1), 155,155); 
end;

create or replace function triggerFunction(param1 in number) return number as   
abc number;
begin
  select max(field1) into abc from triggerTable where field1!= param1;
  return abc ;
end triggerFunction;

这会导致“SQLSyntaxErrorException:ORA-04091”。有没有办法独立于触发器进行插入操作并在之后运行触发器?

2 个答案:

答案 0 :(得分:0)

我没有看到任何理由使用查询定义触发器的同一个表的函数。除了将:new.field1作为参数发送并获得相同的值之外,它什么都不做。

由于您已使用 FOR EACH ROW ,因此您可以将:old:new作为旧值和新值进行访问。

CREATE OR REPLACE TRIGGER insert_try 
AFTER INSERT ON triggerTable 
FOR EACH ROW 
BEGIN
  INSERT INTO anotherTable
    (:new.field1, 155,155
    );
END;
/

它只会将field1 triggertable的值插入anothertable

答案 1 :(得分:0)

使用pragma autonomous_transaction

使函数自治
            create or replace function triggerFunction(param1 in number) return number as   
            abc NUMBER;
            pragma autonomous_transaction ;
            begin
              select max(field1) into abc from triggerTable where field1!= param1;
              return abc ;
            end triggerFunction;

然后尝试插入,在这种情况下不会出现变异表错误。