0

我搜索了一下,发现了一些关于如何从数据库触发器调用 java 代码的信息,但没有找到相反的信息。不能从java方法调用触发器吗?插入到一个表(Table1)后,我需要从第一个表的选择中创建几行到另一个表(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;
4

3 回答 3

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;
于 2013-11-08T08:51:08.660 回答
1

为了调用您的处理,您可以创建一个 PL/SQL 过程/函数并在此过程中复制/粘贴(以一些修改为模)您的触发器代码。

于 2013-11-08T09:00:37.723 回答
0

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

于 2013-11-08T08:46:59.627 回答