首页 > 解决方案 > 两个不同表上的 ORACLE SQL 触发器或存储过程

问题描述

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

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”,但它不能正常工作。存储过程对此更有意义吗?有人可以帮我解决这个问题吗?提前感谢您帮助我。

标签: stored-proceduresplsqlviewtriggersoracle-sqldeveloper

解决方案


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

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

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

即使我们假设最简单的情况,1 对 1,现在我们还有一个问题是何时实施此规则。

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

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

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

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


推荐阅读