【问题标题】:Call object member function in a DML trigger after update (ORACLE database)更新后在 DML 触发器中调用对象成员函数(ORACLE 数据库)
【发布时间】:2016-12-01 15:37:51
【问题描述】:

我有一个包含 Product 对象表 PRODUCTS 的数据库,其中 PRIMARY KEYEAN 字段。每次更新一行时,我都想调用修改后的新对象Product 的成员函数。我做了这个触发器:

CREATE OR REPLACE TRIGGER SHOW_PROFIT_PERCENTAGE
AFTER UPDATE ON PRODUCTS
FOR EACH ROW

DECLARE

P  Product;

BEGIN

    SELECT VALUE(PS) INTO P
    FROM PRODUCTS PS
    WHERE EAN = :NEW.EAN;

    DBMS_OUTPUT.PUT_LINE('Profit percentage: ' || P.getProfit());

END;

但是当我更新PRODUCTS 时,它给了我这个错误:

table PRODUCTS is mutating, trigger/function may not see it

正如我所怀疑的那样。有没有办法做到这一点?谢谢!

【问题讨论】:

    标签: database oracle object triggers mutating-table


    【解决方案1】:

    您无法从表中查找行(对象),因为这会导致您看到并期望看到的 mutating table 错误。

    您可以直接参考受影响的对象,at least from 10g

    自 10g 第 1 版 (10.1) 起,您可以在对象表的触发器中使用 OBJECT_VALUE 伪列。 OBJECT_VALUE 表示整个对象。这是其使用的一个例子。您还可以使用 OBJECT_VALUE 作为 IN 形式参数的数据类型来调用 PL/SQL 函数。

    所以你可以这样做:

    BEGIN
    
        DBMS_OUTPUT.PUT_LINE('Profit percentage: ' || :NEW.OBJECT_VALUE.getProfit());
    
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 2014-02-27
      • 2021-05-20
      • 1970-01-01
      • 2016-06-24
      • 2013-12-29
      • 2017-04-08
      • 1970-01-01
      相关资源
      最近更新 更多