我搜索了一下,我发现了一些关于如何从数据库触发器调用java代码的信息,但没有相反的情况。是不是可以从java方法调用触发器? 插入一个表(Table1)后,我需要从第一个表的select中创建几行到另一个表(Table2)。我构建了触发器,但如果我在第一个表上插入后执行它,我会收到一个错误:
ORA-04091: table Table1 is mutating, trigger/function may not see it ORA-06512:....
我正在研究ADF应用程序,并且由于Table1-Table2具有主细节关系,因此可能不允许以这种方式插入行。这就是为什么我认为通过按钮调用触发器可以解决我的问题。有什么想法吗?
触发:
CREATE OR REPLACE TRIGGER Table2
AFTER INSERT ON Table1 REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
insert into Table2
(
Select col1,col2... from Table1
);
END;
答案 0 :(得分:3)
触发器无法直接调用,只能在插入/更新/删除行之前/之后执行。
问题在于,在触发器中,您正在尝试访问已为其创建触发器的表,这会导致突变触发器错误,因为触发器不会看到表中的更改。
您能否显示使用触发器的代码?为什么必须访问该表?也许您可以使用存储过程来实现您所需要的并调用它?
修改强>
如果要访问插入行中的值,则应使用:new
伪记录:
CREATE OR REPLACE TRIGGER Table2
AFTER INSERT ON Table1 REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
insert into Table2 values (:new.some_col, :new.some_col2, <other columns>);
END;
答案 1 :(得分:1)
为了调用您的治疗,您可以创建一个PL / SQL过程/函数,并在此过程中复制/粘贴(模数修改)您的触发器代码。
答案 2 :(得分:0)
根据我的理解,在触发器完成之前不应该完成插入,也许插入语句有问题?