是否可以从Java代码调用数据库触发器?

时间:2013-11-08 08:43:08

标签: java sql oracle oracle-adf

我搜索了一下,我发现了一些关于如何从数据库触发器调用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;

3 个答案:

答案 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)

根据我的理解,在触发器完成之前不应该完成插入,也许插入语句有问题?