2016-07-27 15 views
0

Ich habe eine Datenbank mit einer Tabelle PRODUCTS von Objekten Product wo die PRIMARY KEY ist das EAN Feld. Jedes Mal, wenn eine Zeile aktualisiert wird, möchte ich eine Elementfunktion des neuen Objekts Product geändert aufrufen. Ich habe diesen Trigger:Anruf Objekt Elementfunktion in einem DML-Trigger nach dem Update (ORACLE Datenbank)

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; 

aber wenn ich PRODUCTS aktualisiere es gibt mir diese Fehlermeldung:

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

wie ich vermuten. Gibt es eine Möglichkeit, das zu tun? Vielen Dank!

Antwort

3

Sie können die Zeile (das Objekt) nicht aus der Tabelle nachschlagen, da dies den mutierenden Tabellenfehler verursacht, den Sie gesehen haben und den Sie sehen möchten.

Sie können auf das betroffene Objekt verweisen direkt, at least from 10g:

You can use the OBJECT_VALUE pseudocolumn in a trigger on an object table since 10g Release 1 (10.1). OBJECT_VALUE means the object as a whole. This is one example of its use. You can also call a PL/SQL function with OBJECT_VALUE as the datatype of an IN formal parameter.

So können Sie einfach tun:

BEGIN 

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

END; 
/
+0

Vielen Dank! Jetzt funktioniert es!!! – Maghio