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 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".
lokale_cursor
Definiert lokale Cursor für die COMPOUND-Anweisung, siehe Abschnitt „Lokale Cursor".
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.
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.
Folgende Auflistung zeigt Beispiele für SQLSTATEs, für die eine eigene Fehlerbehandlung sinnvoll sein kann (siehe Handbuch „ Meldungen“):
01004 | Zeichenkette wurde rechts verkürzt |
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.
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;