两个不同表上的 ORACLE SQL 触发器或存储过程

Posted

技术标签:

【中文标题】两个不同表上的 ORACLE SQL 触发器或存储过程【英文标题】:ORACLE SQL TRIGGER OR STORED PROCEDURE ON TWO DIFFERENT TABLES 【发布时间】:2020-06-16 11:27:21 【问题描述】:

我有两张桌子。我想在这两个表上创建一个触发器。表格中的列如下所示。

Table_A

CL_ID, TIMESTAMP_A, OUT_ID, STATUS ETC.

Table_B

OUT_ID, TIMESTAMP_B, ETC.

在这两个表中自动插入数据(由于集成系统)。我需要这样控制。

IF TIMESTAMP_A > TIMESTAMP_B THEN 
   UPDATE TABLE_A SET OUT_ID =' ' AND STATUS = 'ABC' 
   WHERE A.OUT_ID = B.OUT_ID

我对触发器没有太多经验。我尝试使用“join”从这两个表中创建一个视图并编写了一个“instead of trigger”,但它不能正常工作。存储过程对此更有意义吗?有人可以帮我解决这个问题吗?提前感谢您帮助我。

【问题讨论】:

【参考方案1】:

这里有很多场景可以归结为。

什么定义 TIMESTAMP_A > TIMESTAMP_B ?表中有任何行吗?我假设我们指的是 tableA 中的一行和 tableB 中的合作伙伴行,其中“合作伙伴”是由某些东西定义的。我会假设 OUT_ID

表格是一对一的吗?一对多?如果是后者,那么规则是什么?有时间戳吗?最低的?最高?

即使我们假设最简单的情况,1 对 1,现在我们也有一个问题:什么时候我们要实现这个规则。

如果我插入到 tableA 中,那么(当前)tableB 中还没有行...我们可以保证会有一个 tableB 行最终吗?它会成为同一交易的一部分吗?如果我们稍后更新表的某一行会发生什么?我们是否重新执行相同的逻辑?

所以即使假设更简单的情况:一对一插入同一个事务

那么它仍然很复杂,因为在 Oracle 中没有“提交触发器”之类的东西,也就是说,当有人发出提交时,你不能触发代码。所以最终,您会考虑使用 AQ 之类的东西将条目放入队列中,该队列记录 tableA 的 OUT_ID,并让第二个后台进程侦听队列,然后对消息采取行动。由于它只在提交时看到该消息,因此到那个阶段,tableA tableB 将拥有您需要的行,并且后台处理器可以对其进行操作。

跨表逻辑(在任何数据库中)比看起来更难。

【讨论】:

以上是关于两个不同表上的 ORACLE SQL 触发器或存储过程的主要内容,如果未能解决你的问题,请参考以下文章

2个表上的Oracle触发器:未找到任何数据

oracle对象之触发器

简述oracle视图

SQL 视图

oracle 学习笔记之触发器

SQL Join 在两个表上的 Codeigniter 中?