Compound-SQL-Anweisung (eingebettete) Anweisung
Kombiniert eine oder mehrere andere SQL-Anweisungen (Unteranweisungen) in einem ausführbaren Block.
Aufruf
Diese Anweisung kann nur in ein Anwendungsprogramm eingebettet werden. Das gesamte zusammengesetzte SQL-Anweisungskonstrukt (eingebettete) ist eine ausführbare Anweisung, die nicht dynamisch vorbereitet werden kann. Die Anweisung wird in REXX nicht unterstützt.
Berechtigung
Zum Aufrufen einer zusammengesetzten SQL (eingebettet)sind keine Berechtigungen erforderlich. Die Berechtigungen, die von der Berechtigungs-ID der Anweisung gehalten werden, müssen jedoch alle erforderlichen Berechtigungen enthalten, um die SQL-Anweisungen aufzurufen, die in die zusammengesetzte Anweisung eingebettet sind.
Syntax
Beschreibung
- ATOMIC
- Gibt an, dass, wenn eine der Unteranweisungen in der zusammengesetzten SQL-Anweisung (eingebettete) fehlschlägt, alle Änderungen, die von einer der Unteranweisungen an der Datenbank vorgenommen wurden, einschließlich Änderungen, die von erfolgreichen Unteranweisungen vorgenommen wurden, rückgängig gemacht werden.
- NICHT ATOMIC
- Gibt an, dass die (eingebettete) Compound-SQL-Anweisung unabhängig vom Fehlschlagen von Unteranweisungen keine Änderungen rückgängig macht, die von den anderen Unteranweisungen an der Datenbank vorgenommen wurden.
- STATIC
- Gibt an, dass Eingabevariablen für alle Unteranweisungen ihren ursprünglichen Wert beibehalten. Betrachten Sie zum Beispiel
die folgenden Bedingungen:
wird gefolgt von:SELECT ... INTO :abc ...
Die Anweisung UPDATE verwendet den Wert, den: abc zu Beginn der Ausführung der Compound-SQL-Anweisung (eingebettete) hatte, nicht den Wert, der auf SELECT INTO folgt.UPDATE T1 SET C1 = 5 WHERE C2 = :abcWenn dieselbe Variable von mehreren Unteranweisungen festgelegt wird, ist der Wert dieser Variablen nach der Compound-SQL-Anweisung (eingebettete Anweisung) der Wert, der von der letzten Unteranweisung festgelegt wurde.
Anmerkung : Nicht statisches Verhalten wird nicht unterstützt. Dies bedeutet, dass die Unteranweisungen als nicht sequenziell ausführend betrachtet werden sollen und Unteranweisungen keine gegenseitigen Abhängigkeiten aufweisen sollen. - NACHHER STOPPEN
- Gibt an, dass nur eine bestimmte Anzahl Unteranweisungen ausgeführt werden.
- hostvariable
- Eine kleine ganze Zahl, die die Anzahl der auszuführenden Unteranweisungen angibt.
- STATEMENTS
- Beendet die Klausel STOP AFTER FIRST host-variable .
- sql-anweisung
- Alle ausführbaren Anweisungen mit Ausnahme der folgenden können in einer eingebetteten statischen Compound-SQL-Anweisung (eingebettete) enthalten sein:
CALL FETCH CLOSE OPEN CONNECT PREPARE Compound SQL RELEASE (Connection) DESCRIBE ROLLBACK DISCONNECT SET CONNECTION EXECUTE IMMEDIATE SET variableHinweis: INSERT, UPDATE und DELETE werden in Compound-SQL für die Verwendung mit Kurznamen nicht unterstützt.Wenn eine COMMIT-Anweisung eingeschlossen wird, muss sie die letzte Unteranweisung sein. Wenn sich COMMIT in dieser Position befindet, dann wird es auch dann ausgegeben, wenn die Klausel STOP AFTER FIRST host-variable STATEMENTS angibt, dass nicht alle Unteranweisungen ausgeführt werden sollen. Angenommen, COMMIT ist die letzte Unteranweisung in einem zusammengesetzten SQL-Block mit 100 Unteranweisungen. Wenn die Klausel STOP AFTER FIRST STATEMENTS angibt, dass nur 50 Unteranweisungen ausgeführt werden sollen, ist COMMIT die 51st Unteranweisung.
Ein Fehler wird zurückgegeben, wenn COMMIT eingeschlossen wird, wenn CONNECT TYPE 2 verwendet wird oder in einer verteilten XA-Transaktionsverarbeitungsumgebung ausgeführt wird (SQLSTATE 25000).
Regeln
- Db2® Connect unterstützt keine SELECT-Anweisungen, die LOB-Spalten in einem zusammengesetzten SQL-Block auswählen.
- Innerhalb einer Compound-SQL-Anweisung (eingebettete Anweisung) ist kein Hostsprachencode zulässig, d. h., zwischen den Unteranweisungen, aus denen die Compound-SQL-Anweisung (eingebettete Anweisung) besteht, ist kein Hostsprachencode zulässig.
- Nur NOT ATOMIC Compound-SQL-Anweisungen (eingebettete) werden von Db2 Connect akzeptiert.
- Zusammengesetzte SQL-Anweisungen (eingebettete) können nicht verschachtelt werden.
- Eine vorbereitete Anweisung COMMIT ist in einer (eingebetteten) Compound-SQL-Anweisung ATOMIC nicht zulässig
Hinweise
- Ein SQLCA wird für die gesamte zusammengesetzte SQL-Anweisung (eingebettete) zurückgegeben. Die meisten Informationen in diesem SQLCA spiegeln die Werte wider, die vom Anwendungsserver festgelegt wurden, als er die letzte Unteranweisung verarbeitet hat. Zum Beispiel:
- Der SQLCODE und SQLSTATE sind normalerweise die für die letzte Unteranweisung (die Ausnahme wird im nächsten Punkt beschrieben).
- Wenn eine Warnung
no data found
(SQLSTATE 02000) zurückgegeben wird, erhält diese Warnung Vorrang vor allen anderen Warnungen, sodass eine WHENEVER NOT FOUND-Ausnahmebedingung bearbeitet werden kann. (Dies bedeutet, dass die Felder SQLCODE, SQLERRML, SQLERRMC und SQLERRP im SQLCA, die schließlich an die Anwendung zurückgegeben werden, diejenigen von der Unteranweisung sind, die die Warnungno data found
ausgelöst hat. Wenn mehr als eine Warnungno data found
in der Compound-SQL-Anweisung (eingebettete Anweisung) vorhanden ist, werden die Felder für die letzte Unteranweisung als Felder zurückgegeben.) - Die SQLWARN-Indikatoren sind eine Summierung der Indikatoren, die für alle Unteranweisungen festgelegt wurden.
- Wenn mindestens ein Fehler während der Ausführung von NOT ATOMIC Compound-SQL aufgetreten ist und keiner dieser Fehler schwerwiegender Natur ist, enthält SQLERRMC Informationen zu diesen Fehlern, bis zu einem Maximum von sieben Fehlern. Das erste Token von SQLERRMC gibt die Gesamtzahl der aufgetretenen Fehler an. Die übrigen Token enthalten jeweils die Ordinalposition und den SQLSTATE-Wert der fehlgeschlagenen Unteranweisung innerhalb der zusammengesetzten SQL-Anweisung (eingebettete). Das Format ist eine Zeichenfolge im folgenden Format:
Dabei beginnt die Unterzeichenfolge mit X, die bis zu sechs weitere Male wiederholt wird, und die wie folgt definierten Zeichenfolgeelemente.nnnXsssccccc- nnn
- Die Gesamtzahl der Anweisungen, die Fehler erzeugt haben. (Wenn die Anzahl 999 überschreiten würde, wird die Zählung bei null erneut gestartet.) Dieses Feld wird linksbündig ausgerichtet und mit Leerzeichen aufgefüllt.
- X
- Das Tokentrennzeichen X'FF '
- sss
- Die Ordinalposition der Anweisung, die den Fehler verursacht hat. (Wenn die Anzahl 999 überschreiten würde, wird die Zählung bei null erneut gestartet.) Wenn beispielsweise die erste Anweisung fehlgeschlagen ist, enthält dieses Feld die Zahl 1 linksbündig (
1
). - ccccc
- Der SQLSTATE-Wert des Fehlers.
- Das zweite SQLERRD-Feld enthält die Anzahl der fehlgeschlagenen Anweisungen (negative SQLCODE-Werte zurückgegeben).
- Das dritte SQLERRD-Feld im SQLCA ist eine Summierung der Anzahl der Zeilen, die von allen Unteranweisungen betroffen sind.
- Das vierte SQLERRD-Feld im SQLCA ist ein Zähler für die Anzahl der erfolgreichen Unteranweisungen. Wenn beispielsweise die dritte Unteranweisung in einer Compound-SQL-Anweisung (eingebettete) fehlgeschlagen ist, würde das vierte Feld SQLERRD auf 2 gesetzt, was anzeigt, dass 2 Unteranweisungen erfolgreich verarbeitet wurden, bevor der Fehler aufgetreten ist.
- Das fünfte SQLERRD-Feld im SQLCA ist eine Summierung der Anzahl der Zeilen, die aufgrund der Durchsetzung referenzieller Integritätsbedingungen für alle Unteranweisungen aktualisiert oder gelöscht wurden, die eine solche Integritätsbedingungsaktivität ausgelöst haben.
Beispiele
- Beispiel 1: Setzen Sie in einem C-Programm eine Compound-SQL-Anweisung (eingebettete) ab, die sowohl die Tabellen ACCOUNTS als auch die Tabelle TELLERS aktualisiert. Wenn eine der Anweisungen einen Fehler enthält, machen Sie die Auswirkungen aller Anweisungen rückgängig (ATOMIC). Sind keine Fehler vorhanden, schreiben Sie die aktuelle Arbeitseinheit fest.
EXEC SQL BEGIN COMPOUND ATOMIC STATIC UPDATE ACCOUNTS SET ABALANCE = ABALANCE + :delta WHERE AID = :aid; UPDATE TELLERS SET TBALANCE = TBALANCE + :delta WHERE TID = :tid; INSERT INTO TELLERS (TID, BID, TBALANCE) VALUES (:i, :branch_id, 0); COMMIT; END COMPOUND; - Beispiel 2: Fügen Sie in einem C-Programm 10 Zeilen mit Daten in die Datenbank ein. Angenommen, die Hostvariable enthält den Wert 10 und S1 ist eine vorbereitete Anweisung INSERT. Nehmen Sie außerdem an, dass alle Einfügungen unabhängig von Fehlern (NOT ATOMIC) versucht werden sollen.
EXEC SQL BEGIN COMPOUND NOT ATOMIC STATIC STOP AFTER FIRST :nbr STATEMENTS EXECUTE S1 USING DESCRIPTOR :*sqlda0; EXECUTE S1 USING DESCRIPTOR :*sqlda1; EXECUTE S1 USING DESCRIPTOR :*sqlda2; EXECUTE S1 USING DESCRIPTOR :*sqlda3; EXECUTE S1 USING DESCRIPTOR :*sqlda4; EXECUTE S1 USING DESCRIPTOR :*sqlda5; EXECUTE S1 USING DESCRIPTOR :*sqlda6; EXECUTE S1 USING DESCRIPTOR :*sqlda7; EXECUTE S1 USING DESCRIPTOR :*sqlda8; EXECUTE S1 USING DESCRIPTOR :*sqlda9; END COMPOUND;
