PL-SQL: Grundlegende Elemente

Dieses Buch steht im Regal Programmierung Einleitung Zur Startseite Typen


Wer ist Herr Backus? Bearbeiten

Für die Beschreibung einer Programmiersprache gibt es verschiedene Möglichkeiten. Grundlegend unterscheidet man zwischen grafischer und verbaler (Metasprache) Beschreibung. In diesem Buch verwende ich eine Metasprache, die der Erweiterten Backus-Naur-Form (EBNF) entspricht. Diese Metasprache geht auf John Warner Backus und Peter Naur zurück. Die EBNF verwendet folgende Elemente zur Darstellung

Verwendung Darstellung
Definition eines Elementes =
implizite Aufzählung einer bekannten, ordinalen Menge ..
alternatives Element |
optionales Element [ ]
optionale Wiederholung des letzten Elementes [..]
Elementgruppierung ( )
Wiederholung der Elementgruppierung (..)
optionale Wiederholung der Elementgruppierung [(..)]
Regelende ;
konstantes Element (Begrenzung) " "

Namen, Zahlen und Co. Bearbeiten

Jede Programmiersprache besteht aus elementaren, nicht mehr teilbaren, Bestandteilen, die als lexikalische Elemente bezeichnet werden.

  • Namen
  • Zahlen
  • Schlüsselworte
  • Operatoren
  • Kommentare

Namen Bearbeiten

Mit einem Namen wird eine Deklaration, die einen Typ, eine Variable in unterschiedlicher Ausprägung oder eine Funktionalität bezeichnet, definiert. Der Name hat folgende Struktur:

 name = einfacherName | arrayName | globalerName;
   einfacherName = buchstabe [zeichen[..]];
     zeichen     = buchstabe | ziffer | "_";
     buchstabe   = "A".."Z" | "a".."z";
     ziffer      = "0".."9";
   arrayName     = ((einfacherName | globalerName) "[" index "]") [..];
     index       = zahl | name;
   globalerName  = packageName "." name;
     packagename = einfacherName;

Ein Name beginnt immer mit einem Buchstaben und ist mindestens ein Zeichen lang. Damit wären aber nur 26 Namen möglich, da in PL/SQL die Groß-/Kleinschreibung keine Rolle spielt. Dem ersten Buchstaben dürfen weitere Buchstaben, Ziffern oder das Sonderzeichen "_" folgen. Ein Name darf maximal 30 Zeichen lang sein und muss ein Unikat innerhalb seines Gültigkeitsbereiches sein.

Zahlen Bearbeiten

Zahlen werden als Konstanten innerhalb von Anweisungen oder bei Deklarationen verwendet und haben folgende Struktur:

 zahl = ganzeZahl|reelleZahl;
   
   ganzeZahl       = [vorzeichen] ziffer [ziffer[..]];
   reelleZahl      = [vorzeichen] (vorkommaStellen [nachkommaAnteil]) |
                                   nachkommaAnteil |
                                  (vorkommaStellen [nachkommaAnteil] "E" [vorzeichen] exponent);
   
     vorzeichen      = "+" | "-";
     vorkommaStellen = ziffer [ziffer[..]];
     nachkommaAnteil = "." | ("." nachkommaStellen);
     exponent        = zahl:
   
       nachkommaStellen = ziffer [ziffer[..]];    

Eine Zahl kann mit einem Vorzeichen beginne, fehlt es, wird das positive Vorzeichen angenommen. Ganze Zahlen bestehen aus mindestens einer Ziffer. Reelle Zahlen bestehen aus Vorkomma- und Nachkommastellen, die durch einen Punkt getrennt werden, wobei mindestens ein Teil vorhanden sein und dieser Teil aus mindestens einer Ziffer bestehen muss. Über die Genauigkeit und die Typumwandlung wird im Abschnitt Vereinbarungen ausführlich eingegangen. Reelle Zahlen können auch in wissenschaftlicher Darstellung, in Exponentialform, geschrieben werden

Konstanten Bearbeiten

Mit Konstanten werden Werte festgelegt, die in Ausdrücken verarbeitet werden.

 konstanten = numerische_konstanten | boolsche_konstanten | char_konstanten;
   numerische_konstanten = zahl;
   boolsche_konstanten   = "TRUE" | "FALSE";
   char_konstanten       = zeichenkette;
     zeichenkette = zeichenkettenbegrenzer zeichen[..] zeichenkettenbegrenzer;
       zeichenkettenbegrenzer = """;

Der Zeichenkettenbegrenzer ist das Zeichen ", deshalb wird es in sich selbst in der Regel dargestellt.

Schlüsselworte Bearbeiten

Fest vorgegebene Zeichenketten in einer Programmzeile werden als Schlüsselworte bezeichnet.

 name = buchstabe [zeichen[..]];

Schlüsselworte sind reservierte Worte und dürfen nicht als Namen verwendet werden. Im Anhang befindet sich eine Auflistung aller Schlüsselwort in PL/SQL.

Was ist NULL? Bearbeiten

Verschiedene Programmiersprachen, dazu zählt PL/SQL, besitzen die Möglichkeit, den Zustand, dass eine Variable definiert, aber nicht mit einem Wert belegt ist, auszuwerten. Dazu wird in der Variable ein bestimmtes, dem Programmierer nicht bekantes, Bitmuster hinterlegt, welches als NULL definiert ist. An dieser Stelle muss betont werden, dass NULL einen Zustand und keinen Wert darstellt. Auf den Zustand NULL kann nicht mit Vergleichsoperatoren, sondern nur mit NULL-Operatoren verglichen werden.

Operationswerkzeuge Bearbeiten

Mit Operationszeichen werden einzelne Operanden, das können Variablen, Konstanten oder Ausdrücke sein, verknüpft. Je nach Typ der Operanden unterscheidet man zwischen

  • arithemetische,
  • booleschen,
  • Character-,
  • Mengen-,
  • Vergleichsoperationszeichen und
  • NULL-Operationszeichen.
 opz = arithmetische_opz | boolsche_opz | char_opz | mengen_opz | vgl_opz | null_opz;

Arithmetische Operationszeichen Bearbeiten

Mit arithmetischen Operationszeichen werden numerische Ausdrücke verbunden.

 arithmetische_opz = "+" | "-" | "*" | "/" | "**";

Arithmetische Operationszeichen liefern als Ergebnis numerische Werte. Ob die mathematische Operation, die mit dem Operationszeichen verbunden ist, auch erklärt ist (z.B. Division durch 0), wird erst bei der Laufzeit erkannt. Höhere arithmetische Operationen (Winkelfunktion u.a.m.) werden durch Standardfunktionen abgebildet.

Boolsche Operationszeichen Bearbeiten

Mit boolschen Operationszeichen werden logische Ausdrücke verbunden.

 boolsche_opz = "AND" | "OR" | "NOT";

Das Ergebnis eines logischen Ausdrucks, dessen Operanden mit "AND" verbunden sind, ist TRUE, wenn alle Operanden TRUE als Ergebnis liefern. Mit "OR" verknüpfte Operanden liefern TRUE als Ergebnis, wenn mindestens ein Operand TRUE als Ergebnis hat. "NOT" negiert das Ergebnis eines Operanden.

Characteroperationszeichen Bearbeiten

Mit Characteroperationszeichen werden Zeichenketten bearbeitet.

 char_opz = "||"

Mit diesem Operationszeichen werden zwei Zeichenketten verknüpft. Alle anderen Operationen mit Zeichenketten (Substring, InString usw.) werden durch Standardfunktionen abgebildet.

Mengenoperationszeichen Bearbeiten

PL/SQL kennt nur zwei Mengenoperationszeichen, die als Ergebnis der Operation TRUE oder FALSE liefern.

 mengen_opz = "IN" | "NOT IN" | "BETWEEN" | "NOT BETWEEN";

Mengenoperationszeichen liefern als Ergebnis boolsche Werte. "IN" liefert TRUE, wenn der Operand in der aufgezählten Menge ist. "NOT IN" kehrt die Auswertung um, der Operand darf nicht in der aufgezähten Menge sein. Mit "BETWEEN" wird ein Operand auf Zugehörigkeit, einschließlich der angegebenen Grenzen, zur aufgezählten Menge überprüft. Das Ergebnis ist TRUE, wenn er zur Menge gehört. "NOT BETWEEN" überprüft, die Nichtzugehörigkeit zur Menge und liefert TRUE für diesen Fall.

Vergleichsoperationszeichen Bearbeiten

Vergleichsoperatoren liefern boolsche Werte als Ergebnis. Verglichen werden können nur Operanden gleichen Typs (numerische, char usw.)

 vgl_opz = "<" | "<=" | "=" | ">=" | ">" | "!=" | "<>";

Die Operationszeichen sind selbsterklärend, außer die letzten beiden, die die Operanden auf Ungleichheit vergleichen.

NULL-Operationszeichen Bearbeiten

Um den Zustand NULL zu erkennen, gibt es zwei Operationszeichen,

 null_opz = "IS NULL" | "IS NOT NULL";

Die Verknüpfung eines Operanden mit den NULL-Operationszeichen liefert einen boolschen Wert zurück. Die Verwendung aller anderen Operationszeichen auf einen Operanden der den Zustand NULL hat ist undefiniert.

Wie kommentiert man? Kann man schreiben, wie man will? Bearbeiten

Jeder Quellcode sollte nicht nur fehlerfrei sein, sondern auch verständlich. Neben der Strukturierung des Programmablaufes, dienen Kommentare dazu, den Programmablauf verständlich zu machen. PL/SQL hat zwei Möglichkeiten, Kommentare in den Quellcode einzufügen

 kommentar = einzeiliger_kommentar|mehrzeiliger_kommentar
   einzeiliger_kommentar  = "--" text zeilenvorschub
   mehrzeiliger_kommentar = "/*" textzeile[..] "*/"
     textzeile = text zeilenvorschub
     text      = zeichen[..]

Das Regelelement "zeilenvorschub" ist vom Betriebssystem abhängig. Eine Verschachtelung von ein- und mehrzeiligen Kommentaren ist möglich, sollte aber vermieden werden.

PL/SQL ist, im Gegensatz zu Programmiersprachen wie JAVA, nicht case-sensitiv. Der Name ABC ist identisch mit aBc. Ebenfalls ist es ohne Bedeutung,

  • wieviele Leerzeichen zwischen zwei lexikalischen Elementen stehen,
  • wieviele Leerzeichen am Zeilenbeginn eingerückt werden und
  • wie lang die Zeile ist.

Leerzeichen werden, außer in Characterkonstanten, bei der Quelltextinterpretation ignoriert. Zur besseren Übersichtlichkeit werden alle Schlüsselworte in diesem Buch groß geschrieben. In PL/SQL wird in den meisten Fällen kommerzielle Software geschrieben. In Softwarefirmen gibt aus vielen Gründen (Programmentwicklung im Team, Wartbarkeit der Software, Qualitätssicherung u.a.m.) Vorschriften,

  • wie Quelltexte zu strukturien sind,
  • welche Namen zu vergeben sind,
  • welche Sprachelemente nicht verwendet werden dürfen (z.B. Exceptionhandling zur Programmsteuerung) und
  • wie Sprachelemente verwendet werden dürfen (z.B. keinen impliziten Cursor).

Auf diese Details kann in einem Wikibook natürlich nicht eingegangen werden, sondern nur auf die Möglichkeiten, die PL/SQL insgesamt bietet.