2010-07-26 2 views
5

Kürzlich stieß ich auf einen BEFORE INSERT OR UPDATE Trigger auf einer Tabelle. In diesem Trigger verlässt sich der Autor auf die Funktionen INSERTING und UPDATING (beide geben BOOLEAN zurück) des DBMS_STANDARD-Pakets, um festzustellen, ob der Trigger vor einer Einfügung oder vor einer Aktualisierung ausgelöst wurde.Sollen Prozeduren und/oder Funktionen des DBMS_STANDARD-Pakets im PL/SQL-Code verwendet werden?

Zum Beispiel:

CREATE OR REPLACE TRIGGER CUSTOMER_TRIGGER 
    BEFORE INSERT OR UPDATE ON CUSTOMER 
    FOR EACH ROW 
BEGIN 
    IF INSERTING THEN 
    /* Some code */ 
    END IF; 

    IF UPDATING THEN 
    /* Some other code */ 
    END IF; 
END; 

Ja, ich weiß, dass zwei einzelne Trigger geschrieben wurden, könnten die beiden Ereignisse separat zu behandeln. Das ist nicht der Sinn dieser Frage.

Nach der Behandlung eines Fehlers, der von diesen Funktionen empfangen wurde, erhielten wir die Nachricht (von Oracle Support), dass "dbms_standard-Routinen eigentlich nicht dazu bestimmt sind, von Benutzerprogrammen aufgerufen zu werden". Ist das wahr?

Ich finde dies ein wenig seltsam, unter Berücksichtigung anderer Verfahren (wie RAISE_APPLICATION_ERROR und COMMIT) werden häufig in PL/SQL-Code verwendet.

+0

Haben Sie eine Metalink-Notiz oder etwas anderes, das die Öffentlichkeit (oder zumindest die Oracle-lizenzierte Öffentlichkeit) sehen kann? Und wenn die INSERTING/UPDATING-Aufrufe von STANDARD in Triggern nicht verwendet werden, wann genau werden sie verwendet? –

+0

@Adam: Nein, diese Empfehlung kam nicht von einer Metalink-Notiz. Vielmehr kam es direkt von Oracle Support auf einer Serviceanfrage. –

Antwort

9

Die Funktionen EINFÜGEN, AKTUALISIEREN und LÖSCHEN sind ausdrücklich zum Schreiben von Triggercodes vorgesehen (siehe trigger documentation), so dass es absolut nicht verboten ist, diese zu verwenden. Entsprechend sollte RAISE_APPLICATION_ERROR documented für die Verwendung durch Entwickler bestimmt sein.

Mit DESCribed DBMS_STANDARD gibt es sicherlich einige Funktionen, von denen ich nichts weiß und die vielleicht nicht in Ihrem eigenen Code (für alles was ich weiß) wie GRANTEE verwendet werden sollten.

Im Allgemeinen, wenn Sie Oracle offizielle Dokumentation finden können, die Ihnen sagt, wie man etwas verwendet, dann ist es in Ordnung, es zu benutzen.

+0

Ausgezeichnete Punkte! Wir werden mit Oracle zur Klärung sprechen. –

+1

Ich vermute, dass ein Analyst der Stufe 1 sagte: "Aha, DBMS_STANDARD ist nicht dokumentiert, und mein handliches Dandy-Notizbuch weist Kunden an, nicht dokumentierte Parameter oder Funktionen ohne unsere Anleitung zu verwenden." –

Verwandte Themen