【问题标题】:PL/SQL Creating Trigger In A PackagePL/SQL 在包中创建触发器
【发布时间】:2014-10-14 00:26:26
【问题描述】:

我编写了一个 PL/SQL 包,其中包含我的所有应用程序代码在 hr 模式中的表上运行。我想编写一个触发器来响应在员工表上执行的任何 DML 语句。

您可以在 PL/SQL 包中编写触发器吗?。我的意思是您可以在一个包中编写所有内容,因此从技术上讲,您应该能够在一个包中编写触发器。

我知道我也可以将此触发器创建为数据库对象。 但我希望这个触发器在包的范围内。

是否可以让触发器“仅”触发以响应包代码执行的 DML 语句?

感谢您的 cmets / 建议!!!

【问题讨论】:

  • 手册中都有回答。
  • 哪个手册???请您指出来。
  • Oracle 手册。如果您对使用 Oracle 很认真,那么您应该有一个书签。

标签: database oracle plsql triggers packages


【解决方案1】:

不,不可能在包中编写触发器。虽然您可以从触发器调用包的已实现部分

【讨论】:

    【解决方案2】:

    如果您希望触发器的代码仅在 DML 由您的包启动时运行,我的做法是在您的包中包含一个全局布尔值,例如

    my_pkg_running boolean := FALSE;
    

    在您的包中,将您的 DML 包装为:

    my_pkg_running := TRUE;
    ... execute the DML here ...
    my_pkg_running := FALSE;
    

    然后你的触发器应该调用一个包过程,例如

    my_pkg.trigger_fired;
    

    会有这样的代码:

    PROCEDURE trigger_fired IS
    BEGIN
      IF my_pkg_running THEN
         ... your trigger code ...
      END IF;
    END trigger_fired;
    

    这样,如果触发器是从不是源自包的 DML 触发的,trigger_fired 过程将什么也不做。

    【讨论】:

    • 这很有趣。我没有想到这一点。会试试的
    【解决方案3】:

    触发器是独立于包的数据库对象,当发生BEFORE UPDATE ON xxxxAFTER INSERT ON yyyy 等触发操作时,无法直接执行包中的一段代码。当然,您可以以调用打包例程的方式对触发器进行编码,类似于:

    CREATE OR REPLACE PACKAGE TRIGGER_PACKAGE AS
      PROCEDURE MY_TRIGGER_PROC;
    END TRIGGER_PACKAGE;
    
    CREATE OR REPLACE PACKAGE BODY TRIGGER_PACKAGE AS
      PROCEDURE MY_TRIGGER_PROC IS
      BEGIN
        DBMS_OUTPUT.PUT_LINE('TRIGGER_PACKAGE.MY_TRIGGER_PROC invoked');
      END MY_TRIGGER_PROC;
    END trigger_package;
    
    CREATE OR REPLACE TRIGGER MY_TABLE_AIUD
      AFTER INSERT UPDATE DELETE ON MY_TABLE
      FOR EACH ROW
    BEGIN
      TRIGGER_PACKAGE.MY_TRIGGER_PROC;
    END MY_TABLE_AIUD;
    

    但是,这样做您将无法访问 :NEW 和 :OLD 值,并且无法确定触发器被调用的方式/原因(例如 INSERTING、UPDATING 和 DELETING 布尔值),因此我不建议将其作为实现触发器的一种方式。 YMMV。

    分享和享受。

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多