2015-11-06 44 views
2

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

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”。有没有办法独立于触发器进行插入操作,然后再运行触发器?

+0

表'triggerTable'是变异的,因为你试图从当前被触发器修改的表中进行选择。 –

+0

那么如何从这张表中选择?是否有解决方法或其他方法来实现我所描述的? – Sammy

+0

为什么你需要这个功能呢?你可以使用':new.filed1' –

回答

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; 
/

它会简单地插入从triggertablefield1价值为anothertable

+0

请检查我的编辑版本。问题不在于“我怎样才能将行插入另一个表”。 – Sammy

0

使函数自主使用编译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; 

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

+0

但是,新插入的行仍然无法访问.. – Sammy

+0

您的where子句是“field1!= param1”,这意味着您在没有新插入的行的情况下获得最大值。为什么你需要访问新插入的行? –