Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

COMPOUND - SQL-Anweisungen in gemeinsamem Kontext ausführen

Die COMPOUND-Anweisung führt weitere SQL-Anweisungen einer Routine in einem gemeinsamen Kontext aus. Für diese SQL-Anweisungen gelten gemeinsame lokale Daten (Variablen und Fehlernamen), gemeinsame lokale Cursor und gemeinsame lokale FehlerRoutinen.

Die Schreibweise „COMPOUND“ (groß) wurde lediglich in Analogie zur bisherigen Notation der SQL-Anweisungen für diese SQL-Anweisung gewählt. Es gibt kein SQL-Schlüsselwort „COMPOUND“.

Die COMPOUND-Anweisung darf nur in einer Routine angegeben werden, d.h. im Rahmen einer CREATE PROCEDURE- oder CREATE FUNCTION-Anweisung. Sie ist dann die einzige Anweisung der Routine. Routinen und ihre Verwendung in SESAM/SQL sind detailliert im Kapitel „Routinen" beschrieben.



[ marke :]

BEGIN [[NOT] ATOMIC]

[ lokale_daten ]

[ lokale_cursor ]

[ lokale_fehlerbehandlung ]

[ routine_sql_anweisung; [ routine_sql_anweisung; ]... ]

END [ marke ]



marke

Die Marke vor der COMPOUND-Anweisung (Anfangsmarke) bezeichnet den Anfang der COMPOUND-Anweisung. Sie darf nicht identisch sein mit einer anderen Marke innerhalb der COMPOUND-Anweisung.

Die Anfangsmarke muss nur dann angegeben werden, wenn die COMPOUND-Anweisung über eine LEAVE-Anweisung verlassen werden soll.

Die Marke am Ende der COMPOUND-Anweisung (Endemarke) bezeichnet das Ende der COMPOUND-Anweisung. Wenn die Endemarke angegeben ist, dann muss auch die Anfangsmarke angegeben sein. Beide Marken müssen identisch sein.


[NOT] ATOMIC

Bestimmt, ob die COMPOUND-Anweisung atomar oder nicht-atomar ist. Diese Angabe wirkt sich auf die lokale Fehlerbehandlung aus, siehe "COMPOUND - SQL-Anweisungen in gemeinsamem Kontext ausführen". Wenn keine Angabe gemacht wird, dann gilt: NOT ATOMIC.


lokale_daten

Definiert lokale Variablen und Fehlernamen für die COMPOUND-Anweisung, siehe Abschnitt „Lokale Daten".

Die SQL-Anweisungen der COMPOUND-Anweisung können nur auf lokale Daten zugreifen, die in der COMPOUND-Anweisung definiert sind. Sie können nicht auf Benutzervariablen zugreifen.


lokale_cursor

Definiert lokale Cursor für die COMPOUND-Anweisung, siehe Abschnitt „Lokale Cursor".

Die SQL-Anweisungen der COMPOUND-Anweisung können nur auf Cursor zugreifen, die in der COMPOUND-Anweisung definiert sind.


lokale_fehlerbehandlung

Definiert lokale Fehler-Routinen für die COMPOUND-Anweisung, siehe Abschnitt „Lokale Fehler-Routinen".

SQLSTATEs der Klasse '40xxx' und SQLSTATEs ab Klasse '50xxx' können in den lokalen Fehler-Routinen nicht behandelt werden. Bei Auftreten eines derartigen SQL-STATE wird die Routine sofort abgebrochen. Bei einem SQLSTATE der Klasse '40xxx' wird zusätzlich die gesamte Transaktion zurückgesetzt.

SQLSTATEs, die in den Fehler-Routinen weder in Form einer Klasse noch explizit angeben wurden („unbehandelte SQLSTATEs“) werden von keiner Fehler-Routine behandelt. Das Gleiche gilt, wenn keine lokale Fehlerbehandlung definiert ist. In diesen Fällen führt SESAM/SQL automatisch die Fehlerbehandlung in folgender Weise aus:

    • SQLSTATEs der Klassen '01xxx' (Warnung) oder '02xxx' (keine Daten) werden ignoriert, d.h. die Routine wird wie bei erfolgreicher Ausführung der SQL-Anweisung (SQLSTATE = '00000') fortgesetzt.

    • Für SQLSTATEs, die nicht in den Klassen '01xxx', '02xxx' oder '40xxx' liegen, werden folgende Aktionen ausgeführt:

      • Offene lokale Cursor werden geschlossen.

      • Bei Angabe von ATOMIC in der COMPOUND-Anweisung werden alle Änderungen rückgängig gemacht, die im Rahmen der COMPOUND-Anweisung durchgeführt wurden.

      • Bei Angabe von NOT ATOMIC (Standardwert) in der COMPOUND-Anweisung werden nur die Änderungen rückgängig gemacht, die im Rahmen der fehlerhaften SQL-Anweisung durchgeführt worden sind.

      • Die COMPOUND-Anweisung und damit die Routine wird abgebrochen. Die SQL-Anweisung, in der die Routine verwendet wurde, liefert den betreffenden SQLSTATE zurück.


routine_sql_anweisung

SQL-Anweisung, die in der COMPOUND-Anweisung ausgeführt werden soll.
Eine SQL-Anweisung wird mit „;“ (Semikolon) abgeschlossen.
Mehrere SQL-Anweisungen können nacheinander angegeben werden. Sie werden in der angegebenen Reihenfolge ausgeführt.
In der COMPOUND-Anweisung darf keine (weitere) COMPOUND-Anweisung angegeben werden. D.h., es sind keine geschachtelten COMPOUND-Anweisungen erlaubt (Ausnahme: lokale Fehler-Routinen, siehe "COMPOUND - SQL-Anweisungen in gemeinsamem Kontext ausführen".)
Vor der Durchführung einer SQL-Anweisung werden keine Privilegien geprüft.
Eine SQL-Anweisung in einer Routine darf auf die Parameter der Routine und (wenn die Anweisung Teil einer COMPOUND-Anweisung ist) auf lokale Variablen, jedoch nicht auf Benutzervariablen zugreifen.

Syntax und Bedeutung von routine_sql_anweisung sind zentral im Abschnitt „SQL-Anweisungen in Routinen" beschrieben. Die dort genannten SQL-Anweisungen dürfen verwendet werden.


Beispiel

Beispiele finden Sie im Kapitel „Routinen" und in der Beispieldatenbank von SESAM/SQL (siehe „ Basishandbuch“).

Siehe auch

CREATE PROCEDURE, CREATE FUNCTION, CALL, DROP PROCEDURE, DROP FUNCTION, CASE, FOR, IF, ITERATE, LEAVE, LOOP, REPEAT, SET, WHILE, RETURN, GET DIAGNOSTICS, SIGNAL, RESIGNAL, SELECT, INSERT, UPDATE, DELETE, MERGE, OPEN, FETCH, UPDATE, DELETE, CLOSE

Lokale Daten

Lokale Daten sind Variablen oder Fehlernamen, die nur innerhalb der COMPOUND-Anweisung angesprochen werden können.

Für Variablen wird ein Datentyp und ggf. ein Standardwert definiert. Sie besitzen keine Indikatorvariable. Sie können in lokalen Cursor-Definitionen, lokalen Fehler-Routinen und den SQL-Anweisungen der COMPOUND-Anweisung verwendet werden.

Empfehlung Die Namen von lokalen Variablen sollten sich (z.B. durch Vergabe eines Präfixes wie par_) von Spaltennamen unterscheiden.

Fehlernamen definieren zum leichteren Verständnis einen Namen für einen Fehler (ohne Angabe eines zugehörigen SQLSTATE) oder einen Namen für einen SQLSTATE. Sie können in lokalen Fehler-Routinen verwendet werden, siehe "COMPOUND - SQL-Anweisungen in gemeinsamem Kontext ausführen".



lokale_daten ::= DECLARE deklaration ; [DECLARE deklaration ;] ...

deklaration ::=
{

lokale_variable [, lokale_variable ], ... datentyp [ voreinstellung ] |
fehlername CONDITION [FOR sqlstate ];

}

sqlstate ::= SQLSTATE [VALUE] alphanumerisches_literal



Mehrere Variablen des gleichen Datentyps mit dem gleichen SQL-Defaultwert können nacheinander, getrennt durch „,“ (Komma), angegeben werden.
Die Definition eines lokalen Datums wird mit „;“ (Semikolon) abgeschlossen. Mehrere Definitionen können nacheinander angegeben werden.

lokale_variable

Name der lokalen Variablen.
Die Namen aller lokalen Variablen müssen sich voneinander, von den lokalen Fehlernamen und von den Namen der Parameter der Routine unterscheiden.

datentyp

Datentyp der lokalen Variablen.
Es gibt nur einfache lokale Variablen. dimension darf nicht angegeben werden.

voreinstellung

Legt den SQL-Defaultwert für die lokale Variable fest.
Es gelten die Zuweisungsregeln für Defaultwerte, siehe Abschnitt „Defaultwerte für Tabellenspalten").

fehlername

Name für einen Fehler oder einen SQLSTATE.
Alle Fehlernamen müssen sich voneinander, von den lokalen Variablen und von den Namen der Parameter der Routine unterscheiden.

FOR sqlstate

SQLSTATE (alphanumerisches Literal der Länge 5), der durch fehlername bezeichnet wird.
Die Einschränkungen für die Menge der SQLSTATEs ist zu beachten, siehe „Lokale Fehler-Routinen".

FOR sqlstate nicht angegeben

Lokale Fehlernamen ohne FOR-Klausel können nur durch eine SIGNAL- oder RESIGNAL-Anweisung ausgelöst werden. Sie werden auf den SQLSTATE '45000' (unbehandelter Anwenderfehler) abgebildet und an das Benutzerprogramm gemeldet. fehlername erscheint dabei als Insert der Fehlermeldung.


Beispiel


Definition lokaler Variablen:

DECLARE a,b,c SMALLINT DEFAULT 0;

DECLARE mytim TIME(3) DEFAULT CURRENT_TIME;


Definition von Fehlernamen:

DECLARE Tab_not_accessible CONDITION FOR SQLSTATE '42SQK';
DECLARE "CHECK problem" CONDITION FOR SQLSTATE '23SA1';
DECLARE "Unknown problem" CONDITION;


Lokale Cursor

Mit der Definition lokaler Cursor werden Cursor festgelegt, die nur innerhalb der COMPOUND-Anweisung angesprochen werden können.
Die Namen der lokalen Cursor müssen sich voneinander unterscheiden.

Lokale Cursor können in lokalen Fehler-Routinen und den SQL-Anweisungen der COMPOUND-Anweisung verwendet werden.

Die SQL-Anweisungen STORE und RESTORE sind bei lokalen Cursorn nicht erlaubt.



lokale_cursor ::= { declare_cursor_anweisung ; } ...



Eine Cursor-Definition wird mit „;“ (Semikolon) abgeschlossen.

Mehrere Cursor-Definitionen können nacheinander angegeben werden.


declare_cursor_anweisung

DECLARE CURSOR-Anweisung (siehe Abschnitt „DECLARE CURSOR - Cursor vereinbaren"), mit der der lokale Cursor definiert wird. Die Klausel WITH HOLD darf nicht angegeben werden.
Ein lokaler Cursor unterscheidet sich von einem gewöhnlichen Cursor nur durch den beschränkten Gültigkeitsbereich.


Beispiel


Siehe Abschnitt „DECLARE CURSOR - Cursor vereinbaren".

Lokale Fehler-Routinen


lokale_fehlerbehandlung ::= fehler_routine ; [ fehler_routine ;]...

fehler_routine ::= DECLARE { CONTINUE | EXIT | UNDO } HANDLER FOR
                               fehlerliste { routine_sql_anweisung | compound_anweisung }

fehlerliste ::= { klassenliste | sqlstate_oder_fehlerliste }

klassenliste ::= { SQLEXCEPTION | SQLWARNING | NOT FOUND }
              [{ SQLEXCEPTION | SQLWARNING | NOT FOUND }] ...]

sqlstate_oder_fehlerliste ::= { sqlstate | fehlername }
                       [,{ sqlstate | alphanumerisches_literal | fehlername },...]

sqlstate ::= SQLSTATE [VALUE] alphanumerisches_literal



Mit der Definition lokaler Fehler-Routinen wird festgelegt, wie reagiert werden soll, wenn bei der Verarbeitung einer SQL-Anweisung im Rahmen der COMPOUND-Anweisung ein SQL-STATE ≠ '00000' gemeldet wird.

Es können die SQLSTATEs der Klassen '0xxxx' (mit Ausnahme des SQLSTATE = '00000'), '1xxxx', '2xxxx', '3xxxx' und '4xxxx' (mit Ausnahme der Klasse '40xxx') behandelt werden.

Fehler-Routinen werden mit „;“ (Semikolon) abgeschlossen.
Mehrere Fehler-Routinen können nacheinander angegeben werden.

Wenn ein SQLSTATE ≠ '45000' auftritt (definiert in der klassenliste oder als sqlstate oder fehlername), dann wird die Fehler-Routine für den angegebenen SQLSTATE ausgeführt.

Tritt, ausgelöst durch eine SIGNAL- oder RESIGNAL-Anweisung, der SQLSTATE '45000' (unbehandelte Anwender-Bedingung) auf, dann wird der fehlername der Fehler-Information ausgewertet und die entsprechende Fehler-Routine ausgeführt.


DECLARE

Art der Fehlerbehandlung in Abhängigkeit vom SQLSTATE. Siehe auch den Abschnitt „Erfolg einer SQL-Anweisung in einer Routine".


CONTINUE

          • Die Änderungen, die im Rahmen der fehlerhaften SQL-Anweisung durchgeführt worden sind, werden rückgängig gemacht.

          • Die SQL-Anweisung der Fehler-Routine wird ausgeführt.

          • Wenn diese SQL-Anweisung erfolglos beendet wurde, dann wird die Routine abgebrochen und dieser SQLSTATE wird an den Anwender zurückgemeldet.

          • Wenn diese SQL-Anweisung fehlerfrei beendet wurde, dann wird die Routine fortgesetzt. Die SQL-Anweisung, die den SQLSTATE gemeldet hat und damit die Fehlerbehandlung auslöste, wird als erfolgreich angesehen.


EXIT

          • Die Änderungen, die im Rahmen der fehlerhaften SQL-Anweisung durchgeführt worden sind, werden rückgängig gemacht.

          • Die SQL-Anweisung der Fehler-Routine wird ausgeführt.
            Offene lokale Cursor werden geschlossen.

          • Wenn diese SQL-Anweisung erfolglos beendet wurde, dann wird die Routine abgebrochen und dieser SQLSTATE wird an den Anwender zurückgemeldet.

          • Wenn diese SQL-Anweisung fehlerfrei beendet wurde, dann wird die Routine beendet. Die COMPOUND-Anweisung wird als erfolgreich angesehen (SQL-STATE = '00000' wird zurückgemeldet).


UNDO (nur erlaubt bei Angabe von ATOMIC in der COMPOUND-Anweisung)

          • Alle Änderungen, die im Rahmen der COMPOUND-Anweisung durchgeführt wurden, werden rückgängig gemacht.

          • Die SQL-Anweisung der Fehler-Routine wird ausgeführt.
            Offene lokale Cursor werden geschlossen.

          • Wenn diese SQL-Anweisung erfolglos beendet wurde, dann wird die Routine abgebrochen und dieser SQLSTATE wird an den Anwender zurückgemeldet.

          • Wenn diese SQL-Anweisung fehlerfrei beendet wurde, dann wird die Routine beendet. Die COMPOUND-Anweisung wird als erfolgreich angesehen (SQL-STATE = '00000' wird zurückgemeldet).


klassenliste

Angabe von SQLSTATE-Mengen:

            • SQLWARNING bezeichnet die SQLSTATEs der Klasse 01xxx (Warnung).

            • NOT FOUND bezeichnet die SQLSTATEs der Klasse 02xxx (keine Daten).

            • SQLEXCEPTION bezeichnet alle sonstigen SQLSTATEs der Klassen 0xxxxx bis 4xxxx (mit Ausnahme des SQLSTATEs '00000' und der Klasse 40xxx), die im Rahmen einer Fehler-Routine behandelt werden können.


sqlstate

Explizite Angabe von SQLSTATEs.
Jedes alphanumerische Literal muss einen SQLSTATE in 5 Zeichen (Ziffern oder Großbuchstaben) darstellen.
Es dürfen nur SQLSTATEs angegeben werden, die im Rahmen einer Fehler-Routine behandelt werden können.

Jeder SQLSTATE darf nur einmal in einer der Fehler-Routinen der COM-POUND-Anweisung auftreten.

Folgende Auflistung zeigt Beispiele für SQLSTATEs, für die eine eigene Fehlerbehandlung sinnvoll sein kann (siehe Handbuch „ Meldungen“):


01004
20000
21000
22001
22003
22SA1
23SA0
23SA1
23SA2
23SA3
23SA4
23SA5
24SA1
24SA2
24SA3

Zeichenkette wurde rechts verkürzt
CASE-Anweisung ohne Treffer enthält keine ELSE-Klausel
Ergebnistabelle enthält mehr als 1 Zeile
Zeichenkette wurde rechts verkürzt
Numerischer Wert zu groß oder zu klein
Kommastellen abgeschnitten oder gerundet
Referenzbedingung verletzt
CHECK-Bedingung verletzt
Eindeutigkeitsbedingung verletzt
NOT-NULL-Bedingung verletzt
NOT-NULL-Bedingung des Primärschlüssels verletzt
Eindeutigkeitsbedingung des Primärschlüssels verletzt
Cursor ist nicht geschlossen
Cursor ist nicht geöffnet
Cursor ist nicht auf einem Satz positioniert

Andere SQLSTATEs, z.B. Syntaxfehler, werden am besten über eine der zuvor beschriebenen Mengen von SQLSTATEs behandelt.


fehlername

Name für einen Fehler oder einen SQLSTATE, siehe „Lokale Daten".
Es dürfen nur solche Fehlernamen angegeben werden, die im Rahmen einer Fehler-Routine behandelt werden können.

Jeder fehlername darf nur einmal in einer der Fehler-Routinen der COMPOUND-Anweisung auftreten.


routine_sql_anweisung

SQL-Anweisung, die in der Fehler-Routine ausgeführt werden soll.

Syntax und Bedeutung von routine_sql_anweisung sind zentral im Abschnitt „SQL-Anweisungen in Routinen" beschrieben. Die dort genannten SQL-Anweisungen dürfen verwendet werden.


compound_anweisung

COMPOUND-Anweisung, die mehrere SQL-Anweisungen enthält , siehe Abschnitt „COMPOUND - SQL-Anweisungen in gemeinsamem Kontext ausführen".
Eine hier angegebene COMPOUND-Anweisung darf außer den zulässigen routi ne_sql_anweisungen keine Definitionen lokaler Daten, Cursor oder Fehler-Routinen enthalten.


Beispiel


Definition einer einfachen Fehlerbehandlung mit zwei Fehler-Routinen.

DECLARE CONTINUE HANDLER FOR SQLWARNING,NOT FOUND 
   SET eot=1;
DECLARE EXIT HANDLER FOR SQLSTATE '23SA0'
   BEGIN END;