
| DDL Data Definition Language. Dient zur Erstellung der Datenbankobjekte innerhalb eines Schemas. |
| Schema Sammlung der Datenbankobjekte eines Benutzers innerhalb der Datenbank. |
| PL/SQL Prozedurale Erweiterung der Abfragesprache SQL (Structured Query Language). |
| Package Stellt eine Sammlung logisch zusammengehöriger Funktionalitäten (Prozeduren, Funktionen, Typdeklarationen, ...) dar. |
In den vorhergehenden Releases war das Maximum der Ausgabe durch DBMS_OUTPUT auf eine Million Bytes beschränkt. Dies war insbesondere bei der Entwicklung oft störend. Der Vorteil von DBMS_OUTPUT im Vergleich zu UTL_FILE ist, dass die Ausgabe auf dem Rechner möglich ist, auf dem der Aufruf stattfindet.
ERROR at line 1:Ab Oracle Database 10g Release 2 ist diese Einschränkung
aufgehoben
und kann nun unbeschränkt ("unlimited") sein.
Eine weitere Einschränkung war die maximale Größe (255 Bytes) einer angezeigten Zeile durch DBMS_OUTPUT. In Oracle 10gR2 dürfen nun auch die Zeilen unbeschränkt lang sein.
Das Release 2 von Oracle 10g liefert ein Package, das benutzt wird, um den Code in einem Wrapped-Format zu erstellen. Dieses Package ergänzt das Dienstprogramm "WRAP Utility", aber ersetzt es nicht. Dies ist sinnvoll, wenn viele Quelldateien im Wrapped-Format erstellt werden sollen.
Allgemein werden PL/SQL-Programme "gewrapped", um darin enthaltene, sensitive und vertrauliche Informationen von Firmen über Geschäftsprozesse und andere Interna zu schützen. Dies soll eine nicht autorisierte Betrachtung des Quellcodes verhindern. In Abbildung 1 ist ein Beispiel für eine Prozedur TEST im WRAP Format dargestellt.
CREATE OR REPLACE
PROCEDURE test AS
BEGIN
null;
END;
BEGIN
DBMS_DDL.CREATE_WRAPPED
('CREATE OR REPLACE PROCEDURE test as BEGIN null; END;');
END;
/
SELECT text FROM user_source WHERE name = 'TEST';
TEXT
-----------------------
PROCEDURE test wrapped
a000000
369
abcd
....
|
Die erste Zeile der Prozedur TEST ist die Bestätigung, dass das WRAP-Verfahren zur Erstellung genutzt wurde. Wenn das DDL-Statement mit der DBMS_METADATA.GET_DDL() Funktion ermittelt wird, ist auch nur das Wrapped-Format erkennbar.
Wenn der PL/SQL-Code 32 K übersteigt, muss eine andere Methode verwendet werden. Es wird eine Kollektionsvariable als Eingabeparameter benutzt. Hier kann der mitgelieferte Datentyp VARCHAR2 aus dem Standard Package DBMS_SQL benutzt werden. Der Kollektionsdatentyp (TABLE OF VARCHAR2) jedes einzelnen Elementes der Tabelle kann bis zu 32 K des Textes aufnehmen. Die Variable wird um die benötigte Anzahl an Elementen erweitert. Ein Beispiel finden Sie in Abbildung 2.
CREATE OR REPLACE PROCEDURE proc AS v_key VARCHAR2(200); BEGIN v_key := 'TEST_PROC'; END; 1 DECLARE 2 v_input DBMS_SQL.VARCHAR2S; 3 begin 4 v_input(1) := 'Array to hold the procedure proc'; 5 v_input(2) := 'create or replace procedure proc as '; 6 v_input(3) := ' v_key VARCHAR2(200);'; 7 v_input(4) := 'begin '; 8 v_input(5) := ' v_key := ''TEST_PROC'';'; 9 v_input(6) := 'end;'; 10 v_input(7) := 'the end'; 11 sys.dbms_ddl.create_wrapped ( 12 ddl => v_input, 13 lb => 2, 14 ub => 6 15 ); 16 end; |
Die Variable v_input dient dazu, den Originaltext aufzunehmen. In den Zeilen 4 bis 10 sind die Codezeilen zugewiesen, die im WRAP-Format verwendet werden sollen. Damit der entsprechende Code aufgenommen wird, dürfen der Variable bis zu 32-K-große Zeilen und die benötigte Anzahl an Elementen zugewiesen werden.
Die Zeilen 11 bis 15 zeigen den Aufruf für die Erstellung der Prozedur im WRAP-Format. Die Kollektion wird als DDL-Parameter in Zeile 12 übergeben. Im ersten und letzten Element ist jeweils ein Kommentar zur Dokumentation hinterlegt. Dies ist eine nicht PL/SQL konforme Syntax. Damit der gültige PL/SQL Code erkannt wird, ist der Parameter lb und der Parameter ub anzugeben. Damit ist festgelegt, dass der zu benutzende Quellcode innerhalb der Zeilen 2 bis 6 liegt. Mit diesem Verfahren kann nun jede Prozedur innerhalb eines PL/SQL Codes im Wrapped-Format angelegt werden.
Ein nützliches und elegantes Feature in der Programmierung ist der Einsatz von Compiler Direktiven. Bereits in der Programmiersprache "C" wurde dieses Konzept benutzt. Preprozessor Anweisungen können nun während der Kompilierung ausgewertet werden – allerdings nicht zur Laufzeit (siehe Abbildung 3). Der Einsatz ist sinnvoll für
|
Ab Zeile 5, beginnt die Verwendung der Preprozessor Direktiven, um die VP_VAL Variable auszuwerten. Weil die Preprozessorvariable VP_VAL nicht normales PL/SQL ist, wird $$ verwendet. Ebenso wird der Compiler informiert, dass er die Zeilen nur während der Kompilierung verarbeiten soll.
Dazu wurde das $-Zeichen z. B. für $if benutzt. Gibt es keine session-weit gültige Einstellung, kann optional die Klausel REUSE SETTINGS benutzt werden, die sicherstellt, dass die gleiche Compiler-Anweisung verwendet wird, wenn die Funktionen später rekompiliert werden (siehe Abbildung 4).
ALTER SESSION SET plsql_ccflags ='VP_VAL:TRUE'; ALTER FUNCTION func COMPILE plsql_ccflags ='VP_VAL:TRUE' REUSE SETTINGS; SELECT func FROM dual; FUNC --------------- VP_VAL was TRUE |
Der Wert von VP_VAL wurde während der Kompilierung automatisch auf FALSE gesetzt. Nun wird er aktiv auf FALSE gesetzt und dann die Funktion noch einmal ausgeführt (siehe Abbildung 5).
ALTER SESSION SET plsql_ccflags = 'VP_VAL:FALSE'; SELECT func FROM dual; FUNC --------------- VP_VAL was TRUE |
Obwohl der Wert innerhalb der Session auf FALSE steht, benutzt ihn die Funktion nicht. Er wird während der Kompilierung gesetzt. Nun wird einmal rekompiliert und dann die Funktion noch einmal ausgeführt. Während der Kompilierung ist der Wert FALSE und wird nun zurückgegeben (siehe Abbildung 6).
|
Dies kann nur als Einstieg in das Thema verstanden werden. Weitergehende Informationen sind natürlich der Oracle-Dokumentation zu entnehmen oder sprechen Sie uns an.
Die hier beschriebenen Verbesserungen im PL/SQL des neuen Database 10g Release 2 sind nicht sehr umfangreich, aber nützlich und helfen dem Entwickler an vielen Stellen.
Klaus Günther (info@ordix.de).