Einführung in SQL: Programmierung

Aus Wikibooks

Wechseln zu: Navigation, Suche


Innerhalb einer Datenbank können Arbeitsabläufe selbst gesteuert werden. Dafür gibt es Funktionen, Prozeduren und Trigger.

Inhaltsverzeichnis

[Bearbeiten] Allgemeine Hinweise

Bei diesen Konstruktionen gibt es relativ wenig Gemeinsamkeiten zwischen den DBMS. Für Funktionen und Prozeduren lässt bereits der SQL-Standard den DB-Anbietern "alle" Freiheiten, wie sie diese Möglichkeiten verwirklichen wollen. Deshalb können auch wir uns nur auf einige Grundlagen beschränken und müssen wiederum auf die Dokumentation des jeweiligen DBMS verweisen.

Funktionen und Prozeduren werden oft gemeinsam als Routinen bezeichnet.

Diese Elemente benutzen integrierte Funktionen, DML-Befehle und teilweise Datenbank-Operationen, verbunden in einer speziellen Programmiersprache, die prozedurales SQL o.ä. bezeichnet wird. In diesem Kapitel gibt es allgemeine Erklärungen dazu, wie solche Abläufe erstellt und programmiert werden können; in den folgenden Kapiteln werden diese Mittel konkret benutzt.

[Bearbeiten] Funktionen

Eine (benutzerdefinierte Skalar-) Funktion liefert genau einen Wert eines bestimmten Datentyps. Es handelt sich dabei um eine Ergänzung zu den internen Skalarfunktionen des DBMS, die unter Funktionen sowie Funktionen (2) behandelt werden.

[Bearbeiten] Prozeduren

Eine Prozedur – gespeicherte Prozedur, engl. StoredProcedure (SP) – ist vorgesehen für Arbeitsabläufe, die "immer wiederkehrende" Arbeiten ausführen sollen. Es gibt sie mit und ohne Argumente und Rückgabewerte.

  • Einzelheiten dazu werden in Prozeduren behandelt.

[Bearbeiten] Trigger

Ein Trigger ist ein Arbeitsablauf, der automatisch beim Speichern in einer Tabelle ausgeführt wird.

  • Einzelheiten dazu werden in Trigger behandelt.

[Bearbeiten] Routinen ohne feste Speicherung

Das, was als Prozedur gespeichert werden kann, kann in einem DBMS in der Regel auch direkt ausgeführt werden (ohne Speicherung in der Datenbank). Dazu werden die Definition von Parametern und Variablen sowie die Anweisungen mit einer EXECUTE-Anweisung aufgerufen.

Unter Prozeduren gibt es ein Beispiel "Testdaten in einer Tabelle erzeugen"; dies kann auch so verwirklicht werden:

Firebird-Version
Crystal Clear app terminal.png SQL-Quelltext:

EXECUTE BLOCK ( Anzahl INT = ?anzahl )
      RETURNS ( Maxid  INT )
AS
  DECLARE VARIABLE Temp INT = 0;     /* usw. identisch wie bei der Prozedur */
BEGIN
  Maxid = 0;
  WHILE (Temp < Anzahl) DO
  BEGIN
    /* identischer Arbeitsablauf wie bei der Prozedur */
    Temp = Temp + 1;
  END
  SELECT MAX(ID) FROM Fahrzeug INTO :Maxid;
  SUSPEND;
END


[Bearbeiten] Programmieren innerhalb von Routinen

Attention green.svg

Hinweis an Autoren betr. SQL-Dialekte
Die Hinweise zu MS-SQL, MySql, Oracle wurden nur nach der Dokumentation verfasst. Sie müssen genauso kontrolliert werden wie die Beispiele in den folgenden Kapiteln. Nach Erledigung durch einen Fachmann kann der einzelne Hinweis hier entfernt werden; nach Erledigung für alle DBMS kann der Hinweis insgesamt gelöscht werden.

Attention green.svg

Hinweis an Autoren betr. "Labels"
Bei den Verzweigungen und Schleifen gibt es die Möglichkeit, durch Labels den Zusammenhang deutlich zu machen. Ich Juetho sehe die Notwendigkeit dazu nicht und habe darauf verzichtet. Wenn es jemand anders sieht, bitte einfach ändern und einfügen.

[Bearbeiten] Allgemeine Hinweise

Routinen – also Funktionen und Prozeduren – werden grundsätzlich mit einer Syntax ähnlich der folgenden definiert:

CREATE OR ALTER { FUNCTION | PROCEDURE } <routine-name>
        ( [ <parameterliste> ] )
        RETURNS <parameterliste>
AS  
BEGIN
    <variablenliste>
    <anweisungen>
END

Die Definition von Triggern verläuft so ähnlich: Parameter entfallen, aber die Art der Auslösung kommt hinzu – siehe Trigger. Die Hinweise zu Variablen und Anweisungen in den folgenden Abschnitten gelten für Trigger in gleicher Weise wie für Routinen.

Der Teil zwischen BEGIN und END (jeweils einschließlich) wird als Rumpf – engl. body – bezeichnet, alles davor heißt Kopf – engl. header – der Routine.

Bitte beachten Sie, dass jedes DBMS seine eigenen Besonderheiten hat. Die wichtigsten Unterschiede sind:

  • Bei MySql müssen CREATE und ALTER getrennt werden, bei Oracle heißt es CREATE OR REPLACE.
  • RETURNS gehört zu Funktionen (bei Oracle: RETURN). Nur Firebird benutzt dies zur Trennung der Ausgabe-Parameter auch bei Prozeduren.
  • Ob die Parameter in Klammern stehen müssen oder nicht, ist unterschiedlich geregelt.
  • AS kann teilweise auch entfallen, bei Oracle wird auch IS verwendet.
  • Die <variablenliste> ist Bestandteil der <anweisungen>; bei Firebird und Oracle steht sie zwischen AS und BEGIN.

Wenn es insgesamt (einschließlich Variablen) nur eine einzige Anweisung gibt, kann auf BEGIN und END verzichtet werden; der Übersichtlichkeit halber ist ihre Verwendung aber fast immer zu empfehlen.

Gleiches gilt innerhalb einzelner Abschnitte (wie Verzweigungen oder Schleifen): Eine einzelne Anweisung kann ohne BEGIN...END angegeben werden; wenn es die Übersichtlichkeit oder Verschachtelung erfordern, ist die Verwendung dieser Schlüsselwörter vorzuziehen.

Eine Funktion benötigt als (letzte) Anweisung RETURN, mit der ein bestimmter Wert zurückgegeben wird.

Hinweis: In diesem Buch werden nur einfache lokale Variable benutzt; deren Gültigkeitsbereich beschränkt sich auf die aktuelle Routine. Je nach DBMS stehen auch globale Variable zur Verfügung. Außerdem kann man über das Schlüsselwort CURSOR eine ganze Zeile von Tabellen oder Ergebnismengen mit einer Variablen benutzen.

Hinweis: In diesem Abschnitt beschränke ich mich auf die wichtigsten Erläuterungen. Die konkreten SQL-Anweisungen sind in den einzelnen Kapiteln für Eigene Funktionen, Prozeduren und Trigger zu finden. Außerdem gibt es zu fast allen genannten Themen weitere Möglichkeiten.

Attention green.svg

Hinweis
Wir empfehlen, dieses Kapitel und jeweils eines der nächsten Kapitel in zwei Fenstern Ihres Browsers gleichzeitig zu öffnen und diese nebeneinander zu setzen. Dann können Sie ein umfangreiches Beispiel und die folgenden Einzelheiten je nach SQL-Dialekt gleichzeitig sehen.


Achtung: In allen Fällen, in denen die Namen von Variablen oder Parametern auf die Namen von Tabellenspalten treffen, muss dem DBMS klar sein, um welche Art von Namen es sich handelt:

  • MS-SQL regelt das mit '@' am Anfang des Namens von Variablen oder Parametern.
  • MySql und Oracle unterscheiden nicht. Sie müssen selbst für unterschiedliche Bezeichner sorgen.
  • Firebird verlangt in diesen Situationen einen Doppelpunkt vor dem Namen von Variablen und Parametern.


Wegen der vielfältigen Unterschiede werden die wichtigsten Möglichkeiten getrennt behandelt.

[Bearbeiten] SQL-Programmierung mit Firebird

[Bearbeiten] SQL-Programmierung mit MS-SQL

[Bearbeiten] SQL-Programmierung mit MySql

[Bearbeiten] SQL-Programmierung mit Oracle


[Bearbeiten] Zusammenfassung

In diesem Kapitel wurden die wichtigsten Bestandteile besprochen, mit denen SQL-Befehle in eigenen Funktionen, in gespeicherten Prozeduren oder in Triggern verarbeitet werden:

  • Deklaration von Parametern und Variablen
  • Verwendung von Parametern und Variablen
  • Verzweigungen mit IF u.a. sowie Schleifen
  • Zulässigkeit von DML- und DDL-Befehlen
  • Trennung zwischen einer Routine insgesamt und einer einzelnen Anweisung

Bei allen Einzelheiten müssen die Besonderheiten eines jeden DBMS beachtet werden.


[Bearbeiten] Übungen


Persönliche Werkzeuge