PL-SQL: Deklarationszwang

Aus Wikibooks
Wechseln zu: Navigation, Suche
Nuvola apps bookcase.svg Dieses Buch steht im Regal Programmierung Go-previous.svg Typen Go-up.svg Zur Startseite Go-next.svg Anweisungen


In PL/SQL gibt es einen Deklarationszwang. Jede Variable muss vor ihrer ersten Verwendung deklariert werden. Eine Deklaration besteht aus dem Namen der Variablen und dem Typ der Variablen. Optional ist eine Initialbelegung möglich. Eine FORWARD-Deklaration gibt es nicht.

Die Veränderlichen – Variablen[Bearbeiten]

Die Variablendeklaration hat folgenden Aufbau

 variablenDeklaration = variablenName typdeklaration [initialbelegung];
   variablenName      = einfachername;
   typdeklaration     = skalareType | lobType | dbobjekttype | subType | plsqltableType;
   initialbelegung    = term;

In ihrem Gültigkeitsbereich darf jeder Variablenname nur einmal verwendet werden.

Die Unveränderlichen – Konstanten[Bearbeiten]

Die Konstantendeklaration hat folgenden Aufbau

 konstantenDeklaration = konstantenName "constant" typdeklaration initialbelegung;
   konstantenName      = einfacherName;    
   typdeklaration      = skalareType | lobType | dbobjektType | subType | plsqltableType;
   initialbelegung     = term;

In ihrem Gültigkeitsbereich darf jeder Konstantenname nur einmal verwendet werden. Konstanten können nur bei ihrer Deklaration einen Wert zugewiesen bekommen.

Die Indizierten – PL/SQL-Tabellen[Bearbeiten]

PL/SQL-Tabellendeklaration hat folgenden Aufbau

 plsqltableDeklaration = plsqltableName typdeklaration;
   plsqltableName      = einfacherName;
   typdeklaration      = plsqltableType;

In ihrem Gültigkeitsbereich darf jede PL/SQL-Tabledeklaration nur einmal verwendet werden. Eine PL/SQL-Table Typdeklaration ist ein Objekt und beinhaltet neben den Daten eine Vielzahl von Methoden.

Die Selektierten – Cursor[Bearbeiten]

Ein Cursor ist eine Datenmenge, die durch ein SELECT-Statement erzeugt wird. Die Datenmenge kann eine leere Menge sein. Ein Cursor wird wie folgt deklariert.

 cursorDeklaration         = "cursor" cursorName [cursorParameterliste] "is" selectStatement;
   cursorname              = einfacherName;
   cursorParameterliste    = "(" cursorParameter [..] ")"
     cursorParameter       = (cursorParametername typdeklaration) [,..]
       cursorParametername = einfacherName;
       typDeklaration      = skalareType | dbobjektType ;
   selectStatement         = sqlStatement;

Ausführliche Erläuterungen zum SELECT-Statement sind an hier zu finden.

Die Fehlerhaften – Exception[Bearbeiten]

Bei der Abarbeitung auftretende Fehler, damit sind keine ORACLE-Fehler (Fehler beim Zugriff auf die Datenbank) gemeint, sondern ausschließlich Fehler, die anwenderspezifisch sind, müssen deklariert werden, um diese abzufangen und zu behandeln. Eine Exceptiondeklaration wird wie folgt definiert.

 exceptionDeklaration = exceptionName "exception" [pragmaDeklaration];
   exceptionName      = einfacherName;
   pragmaDeklaration  = "pragma" pragmaName "(" exceptionname ",-" exceptionNummer ")";
     pragmanName      = einfacherName;
     exceptionNummer  = zahl;

Mit der PRAGMA-Deklaration kann der Exception eine negative, ganze Zahl, die kleiner oder gleich -20000 sein muss, zugewiesen werden.

Gültigkeitsbereich und Sichtbarkeit[Bearbeiten]

Der Gültigkeitsbereich gliedert sich in folgende Ebenen, begonnen mit der kleinsten.

  • lokal innerhalb einer Prozedur/Funktion, definiert im Deklaraionsteile der Prozedur
  • lokal innerhalb einer Prozedur/Funktion, definiert in der Parameterliste
  • global innerhalb eines Packages, definiert im Deklarationsteil des Packages
  • global innerhalb der Datenbanksession, definiert im Packageheader
 create or replace package pa_1 is
 global_1 number;                                                                                              * global_1
                                                                                                               |
   create or replace package body pa_1 is                                                                      |
   global_2 number;                                                                                * global_2  |
                                                                                                   |           |
     procedure p1 (para_lokal_1 varchar2) is                                       * para_lokal_1  |           |
     lokal_1 number;                                       * lokal_1   * lokal_2   |               |           |
     lokal_2 varchar2(19);                                 |           |           |               |           |
                                                           |           |           |               |           |
       function f1 is                                      |           |           |               |           |
       lokal_1 number;                          * lokal_1  #           |           |               |           |
       begin                                    |          #           |           |               |           |
         ...                                    |          #           |           |               |           |
       end;                                     *          #           |           |               |           |
                                                           |           |           |               |           |
     begin                                                 |           |           |               |           |
     ...                                                   |           |           |               |           |
     end;                                                  *           *           *               |           |
                                                                                                   |           |
   end;                                                                                            *           |
                                                                                                               | 
 end;                                                                                                          *

Die Variable global_1 ist in der gesamten Session gültig und sichtbar. Zugegriffen wird auf diese Variable mit einem globalen Namen. Es ist möglich, mit dem Namen der Variablen zu zugrefen, wenn dieser im Header des eigenen Packages deklariert wurde. Aus Gründen der Übersichtlichkeit sollte aber auch in diesem Fall der globale Name verwendet werden. Die Variable global_2 ist nur im eigenen Package gültig und sichtbar. Die Parametervariable para_lokal_1 ist im Deklarationsteil und Ausführungsteil der Prozedur p1 gültig und sichtbar. Die lokale Variable lokal_1 der Prozedur p1 ist ab ihrer Deklaration bis zum Ende der Prozedur gültig und in der Prozedur p1 sichtbar. In der Funktion f1 ist diese Variable gültig, aber nicht sichtbar, da sie durch die lokale Variable lokal_1 der Funktion f1 in ihrer Sichtbarkeit überschrieben wird. Der Wert der lokalen Variablen lokal_1 der Prozedur p1 wird in der Funktion f1 aber nicht überschrieben, sonder bleibt erhalten. Die lokale Variable lokal_2 der Prozedur p1 ist in der Prozedur p1 und der Funktion f1 gültig und sichtbar. Die lokale Variable lokal_1 der Funktion f1 ist nur in dieser Funktion gültig und sichtbar.

Bei Auftreten einer Exception, unabhängig davon, ob von der Datenbank oder dem Anwenderprogramm ausgelöst, gehen alle lokalen Variablen verloren, aber alle globalen Variablen bleiben mit ihrem Inhalt erhalten. Dieser Aspekt ist zu berücksichtigen, wenn die Exception nach ihrer Behandlung eine Weiterarbeit ermöglicht. Sollen dabei die globalen Variablen neu initialisiert werden, muß das im Exceptionhandling ausprogrammiert werden.