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

时间:2013-07-17 07:16:24

标签: oracle11g

以下是我的表结构:

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

主表“客户”是存储客户信息。如果有人在客户表中将黑名单更新为Y,则在“客户”表上更新后会触发记录在“黑名单”表中。 如果,

,我们会将客户视为黑名单
  • 将Customer表中的列列为值'Y'和。
  • 黑名单和原因表中有客户记录

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

  1. 更新客户设置blacklisted ='Y',其中customerid ='102';
  2. 从blacklist中选择BlacklistID到var_id中,其中customerid ='102';
  3. 插入原因(BlacklistID,ReasonID,ReasonCode)值(var_ id,111,'RCODE1');
  4. 现在要在Reason表中插入条目(步骤3),我需要BlacklistID这是一个外键,一旦客户表上的触发器得到规定,我将获得BlacklistID的值。所以我的困惑是,我可以假设在cntrl到达我的INSERT INTO reason(步骤3)语句之前,将始终触发更新'Customer'表的触发器。请建议。

3 个答案:

答案 0 :(得分:2)

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

使用create trigger语句的FOLLOWS ...PRECEEDS ...选项完成此操作:

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

  

跟进| PRECEDES

     

指定具有相同时间点的触发器的相对触发。它在创建交叉触发时特别有用,它必须按特定顺序触发以实现其目的。

     

使用FOLLOWS指示正在创建的触发器必须在指定的触发器之后触发。您可以为常规触发器或前向交叉触发器指定FOLLOWS。

     

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

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