0

我有一个带有PRODUCTS对象表的数据库,Product其中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

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

4

1 回答 1

3

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

您可以直接引用受影响的对象,至少从 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;
/
于 2016-07-27T14:57:17.050 回答