Oracle存储过程中触发器和语句的执行顺序

问题描述 投票:0回答:4

以下是我的表格结构:

Table -Customer
CustomerID Blacklisted Customer Name
101 Y ABC
102 Y DEF

Table -Blacklist
CustomerID BlacklistID Customer Name
101 1011 ABC
102 1012 DEF

Table -Reason
BlacklistID ReasonID Reason Code
1012 02 Rcode2

主表“Customer”用于存储客户信息。如果有人将客户表中的黑名单更新为“Y”,则“Customer”表更新后会触发向“Blacklist”表插入记录。 如果出现以下情况,我们会将客户列入黑名单:

  • 客户表中的黑名单列值为“Y”并且。
  • 黑名单和原因表中有客户的记录

现在我的要求是从后端将客户列入黑名单。为此,我正在编写带有以下查询的存储过程:

  1. 更新列入黑名单的客户集 ='Y',其中 customerid='102';
  2. 从黑名单中选择 BlacklistID 到 var_id,其中 customerid='102';
  3. 插入reason(BlacklistID,ReasonID,ReasonCode)values(var_ id,111,'RCODE1');

现在要在原因表中插入条目(步骤 3),我需要 BlacklistID,它是一个外键,一旦客户表上的触发器被执行,我将获得 BlacklistID 的值。所以我的困惑是,我可以假设触发器在在 cntrl 到达我的 INSERT INTO Reason(step-3) 语句之前,始终会执行“Customer”表的更新。请建议。

oracle11g
4个回答
3
投票

如果需要确定触发器的执行顺序,可以在创建触发器时指定该顺序。

这是通过创建触发器语句的

FOLLOWS ...
PRECEEDS ...
选项完成的:

手册中的更多详细信息:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CJAEJAFB

关注 |前面

指定具有相同时间点的触发器的相对触发。在创建跨版本触发器时特别有用,该触发器必须以特定顺序触发才能实现其目的。

使用 FOLLOWS 指示正在创建的触发器必须在指定的触发器之后触发。您可以为传统触发器或正向跨版本触发器指定 FOLLOWS。

使用 PRECEDES 指示正在创建的触发器必须在指定的触发器之前触发。您只能为反向交叉版本触发器指定 PRECEDES。


1
投票

是的。触发器是语句的一部分。虽然您不能完全确定 *) 同一语句中多个触发器的执行顺序,但您可以确定它们在语句本身完成时也已完成。因此,到第 2 步时,第 1 步的所有更新触发器都已触发。

*) 实际上,默认顺序是:

  1. 触发前的语句级别
  2. 触发前的行级别
  3. 触发后的行级别
  4. 触发后的语句级别

但是,如果您在触发之前有两个行级别,默认情况下您无法确定这两个行的执行顺序。但我从评论中了解到,在 Oracle 11 中,您实际上可以指定顺序来覆盖这些情况。


1
投票

我认为不需要所有这些表,因此不需要触发器。

为什么不在客户表中使用黑名单原因代码?黑名单表的目的尚不清楚,因为它似乎没有添加任何数据,只是使用附加的 id 列重复客户表中的数据?

或者,如果您需要多个原因代码,则只需使用引用客户 ID 和原因代码的 blacklist_reason 表 - 我认为您甚至不需要客户表中的黑名单列。


0
投票

使用这个关键字: 关注 例如: 触发器1 触发器2 在trigger2的声明部分写:

FOLLOWS trigger1
© www.soinside.com 2019 - 2024. All rights reserved.