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

标签 java sql oracle oracle-adf

我搜索了一下,找到了一些关于如何从数据库触发器调用java代码的信息,但没有找到相反的信息。不是可以从java方法调用触发器吗? 插入到一个表(表 1)后,我需要通过第一个表的选择向另一个表(表 2)创建几行。我构建了触发器,但如果我让它在第一个表上插入后执行,则会收到错误:

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;

最佳答案

触发器不能直接调用,它们仅在插入/更新/删除行之前/之后执行。

问题在于,在触发器中,您尝试访问已为其创建触发器的表,这会导致突变触发器错误,因为触发器不会看到表中的更改。

您可以显示触发器代码的使用吗?为什么您必须访问该表?也许您可以只使用存储过程来实现您需要的并调用它?

编辑

如果您想访问插入行中的值,您应该使用 :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;

关于java - 是否可以从Java代码调用数据库触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19854793/

相关文章:

mysql - 在 MySQL 中提取 JSON 提取的第一个键

php - 使用php获取oracle中最后插入的id

Oracle - 并行模式更新技术......有吗?

sql - 为什么在 PostgreSQL 中删除表中的一行时, future 插入行的 ID 号不是连续的?

java - 在 Android 中加载自动完成 View 建议的最佳方法

java - 加密和解密 ArrayList<String>

java - 从字符串中删除尖括号 < 和 > : Java regex

mysql - Update, set + 90 where ...(查询更新错误值)

Oracle Apex : How to execute procedure and display the results on a page

java - 无法在 eclipse 中运行脚本