Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  1/2006
suche: 
Dieser Artikel richtet sich an Oracle Datenbankadministratoren und -entwickler, die in der Version Oracle Database 10g Release 2 PL/SQL-Skripte einsetzen.

Glossar

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.

PL/SQL-Neuerungen mit Oracle 10g Release 2

Mit jedem Release gibt es wieder einige neue Features rund um PL/SQL. Wir stellen Ihnen in diesem Artikel die Neuerungen im Release 2 vor:

Unlimited im DBMS_OUTPUT Package

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:
ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 97
ORA-06512: at "SYS.DBMS_OUTPUT", line 112
ORA-06512: at line 2

Ab Oracle Database 10g Release 2 ist diese Einschränkung
aufgehoben und kann nun unbeschränkt ("unlimited") sein.

SERVEROUTPUT ON SIZE UNLIMITED FORMAT WORD_WRAPPED

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 WRAP Package

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
....
Abb. 1: Beispiel für eine Prozedur TEST im WRAP-Format.

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;
Abb. 2: Beispiel für eine Prozedur PROC mit Variable im WRAP-Format.

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.

"Conditional Compilation" in PL/SQL

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


1 CREATE OR REPLACE FUNCTION func
2 	       RETURN varchar2
3 AS
4 BEGIN
5    $IF $$ppval $THEN
6    return 'VP_VAL was TRUE';
7    $ELSE
8    return 'VP_VAL was FALSE';
9    $END
10 END;
Abb. 3: Beispiel einer Funktion für die Rückgabe einer Zeichenkette.

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
Abb. 4: Beispiel für die REUSE SETTING Klausel

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
Abb. 5: Beispielausgabe für das Ignorieren durch ALTER SESSION.

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).

ALTER FUNCTION func COMPILE;
SELECT func FROM dual;

FUNC
----------------
VP_VAL was FALSE
Abb. 6: Beispielausgabe für das manuelle Rekompilieren der Funktion.

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.

Resümee

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).