Database 更新后在DML触发器中调用对象成员函数(ORACLE数据库)
我有一个数据库,其中包含对象的表Database 更新后在DML触发器中调用对象成员函数(ORACLE数据库),database,oracle,object,triggers,mutating-table,Database,Oracle,Object,Triggers,Mutating Table,我有一个数据库,其中包含对象的表PRODUCTS,其中主键是EAN字段。每次更新一行时,我都要调用新对象Productmodified的成员函数。我扣动了这个扳机: 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
PRODUCTS
,其中主键是EAN
字段。每次更新一行时,我都要调用新对象Product
modified的成员函数。我扣动了这个扳机:
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;
但当我更新产品时
会出现以下错误:
table PRODUCTS is mutating, trigger/function may not see it
正如我所怀疑的那样。有办法吗?谢谢 您无法从表中查找行(对象),因为这会导致您看到和期望看到的突变表错误
您可以直接引用受影响的对象:
自10g版本1(10.1)以来,您可以在对象表的触发器中使用OBJECT_值
pseudo列<代码>对象\u值
表示对象作为一个整体。这是它使用的一个例子。您还可以使用OBJECT_值作为IN-formal参数的数据类型来调用PL/SQL函数
所以你可以做:
BEGIN
DBMS_OUTPUT.PUT_LINE('Profit percentage: ' || :NEW.OBJECT_VALUE.getProfit());
END;
/
您无法从表中查找行(对象),因为这会导致您看到和预期看到的“变异表”错误
您可以直接引用受影响的对象:
自10g版本1(10.1)以来,您可以在对象表的触发器中使用OBJECT_值
pseudo列<代码>对象\u值表示对象作为一个整体。这是它使用的一个例子。您还可以使用OBJECT_值作为IN-formal参数的数据类型来调用PL/SQL函数
所以你可以做:
BEGIN
DBMS_OUTPUT.PUT_LINE('Profit percentage: ' || :NEW.OBJECT_VALUE.getProfit());
END;
/