Zu Oracle

Bereich:
Versionsinfo:
PL/SQL
10.2, 11.1
Erstellung:
Letzte Überarbeitung:
08/2005 HA
05/2009 HA
 Als PDF Downloaden!

Bedingte Kompilierung in Oracle Version 10.2

Haben Sie nicht auch schon ein Programm mit Aufrufen von DBMS_OUTPUT "gepflastert", beispielsweise um Laufzeitfehler oder Fehler in der Logik nachzuvollziehen? Der Nachteil dabei: Wenn man fertig ist, muss man alle Aufrufe entweder wieder entfernen oder auskommentieren. Und wenn man das nächste Mal ein Problem hat, muss alles wieder rein....

Ab Version 10g Release 2 gibt es eine Alternative dazu, die in anderen Programmiersprachen schon lange bekannt ist: die bedingte Kompilierung. Dabei werden Bedingungen nicht zur Laufzeit ausgewertet, sondern zur Kompilierzeit; daher werden sie auch "Prä-Prozessor-Direktiven" genannt.

Die zu evaluierenden Variablen können prinzipiell auf zwei Arten gesetzt bzw. verändert werden:

  1. Man arbeitet mit einer Prä-Prozessor-Variable:
    Diese kann auf System- oder Session-Ebene gesetzt werden, oder speziell für eine Prozedur bzw. eine Funktion.
  2. Man arbeitet mit Konstanten in Packages.

Prä-Prozessor-Direktiven werden durch ein "$"-Zeichen gekennzeichnet; auch die Syntax unterscheidet sich etwas von normalen IF/ELSE-Konstrukten:

$IF ... $THEN
....
[$ELSE]
.....
$END   -- ohne IF und ohne Semikolon

 

1. Prä-Prozessor-Variablen

Hier wird die Variable über "$$" angesprochen, um sie als Prä-Prozessor-Variable zu kennzeichnen. Wird sie auf System- oder Sessionebene geändert, so muss die Prozedur, die sie referenziert, explizit neu kompiliert werden, um den geänderten Wert anzuziehen.
Solange einer solchen Variablen nicht explizit ein Wert zugewiesen wurde, hat sie den Wert NULL.

Beispiel:

CREATE OR REPLACE PROCEDURE DEBUG_PROC IS      
   v_dummy NUMBER;
BEGIN             
   v_dummy := 20;
   --.....         
   $IF $$debug_flag $THEN  
      DBMS_OUTPUT.PUT_LINE('Inhalt von v_dummy: '||v_dummy);
   $END  
   --...
END;
/
SET SERVEROUTPUT ON
EXEC DEBUG_PROC

Um eine Ausgabe zu erhalten, müssen Sie nun die Variable auf TRUE setzen:

ALTER SESSION SET plsql_ccflags = 'DEBUG_FLAG:TRUE';  
-- oder:
ALTER SYSTEM SET plsql_ccflags = 'DEBUG_FLAG:TRUE';
-- dann muss die Prozedur neu kompiliert werden:
ALTER PROCEDURE DEBUG_PROC COMPILE;

-- Alternative: nur für die Prozedur allein das Flag setzen
ALTER PROCEDURE DEBUG_PROC
COMPILE plsql_ccflags = 'DEBUG_FLAG:TRUE' REUSE SETTINGS;

Durch Ergänzung der optionalen Klausel REUSE SETTINGS wird erreicht, dass die Einstellungen bei folgenden Kompiliervorgängen beibehalten werden.

2. Package-Konstanten

Prinzipiell einfacher ist die Verwendung von Package-Konstanten. In diesem Fall reicht es, im Package die Konstante umzusetzen: Abhängige Prozeduren werden in gewohnter Weise automatisch auf INVALID gesetzt und beim nächsten Aufruf ebenfalls automatisch kompiliert.

Beispiel:

CREATE OR REPLACE PACKAGE PAC_C IS
   is_debug CONSTANT BOOLEAN := FALSE;
END;
/
CREATE OR REPLACE PROCEDURE DEBUG_PROC IS
   v_dummy NUMBER;
BEGIN             
   v_dummy := 20;
   ...
   $IF PAC_C.is_debug $THEN  
      DBMS_OUTPUT.PUT_LINE('Inhalt von v_dummy: '||v_dummy);
   $END  
END;
/

Anmerkung: Prinzipiell kann die Konstante im gleichen Package stehen wie die Prozedur mit der bedingten Anweisung; allerdings muss auch in diesem Fall der Package-Name zwingend vor den Variablennamen gesetzt werden.

Suche

Kontakt

Telefon:
  089 6228 6789-0

Telefon (gültig bis Ende 2010):
  089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.