Compound-SQL-Anweisung (kompiliert) (Anweisung)

Eine Compound-SQL-Anweisung (kompilierte Anweisung) kann SQL-Anweisungen und SQL-Anweisungen enthalten. Compound-SQL-Anweisungen (kompilierte Anweisungen) können verwendet werden, um prozedurale Logik über eine Folge von SQL-Anweisungen mit einem lokalen Geltungsbereich für Variablen, Bedingungen, Cursor und Handler zu implementieren.

Aufruf

Diese Anweisung kann in einen Trigger, eine SQL-Funktion oder eine SQL-Prozedur eingebettet oder über dynamische SQL-Anweisungen ausgegeben werden. Es handelt sich um eine ausführbare Anweisung, die dynamisch vorbereitet werden kann.

Berechtigung

Für eine SQL-Variablendeklaration , die einen cursor-value-constructor angibt, der eine select-anweisungverwendet, müssen die Berechtigungen, die von der Berechtigungs-ID der Anweisung gehalten werden, die Berechtigungen enthalten, die zum Ausführen der select-anweisungerforderlich sind. Siehe Abschnitt "Berechtigung" unter "SQL-Abfragen".

Die Berechtigungen, die von der Berechtigungs-ID der Anweisung gehalten werden, müssen auch alle Berechtigungen enthalten, die zum Aufrufen der SQL-Anweisungen erforderlich sind, die in der zusammengesetzten Anweisung angegeben sind.

Nur PUBLIC-Gruppenzugriffsrechte werden für alle SQL-Objekte berücksichtigt, die im Hauptteil der zusammengesetzten Anweisung angegeben sind.

Syntax

Read syntax diagramSkip visual syntax diagramlabel:BEGINNOT ATOMICATOMICtype-declaration;SQL-variable-declarationcondition-declarationreturn-codes-declaration;statement-declaration;DECLARE-CURSOR-statement;procedure-declaration;handler-declaration;SQL-procedure-statement;END label
type-declaration
Read syntax diagramSkip visual syntax diagramDECLARE TYPEtype-nametype-nameTYPE AS array-type-definitiondistinct-type-definitionrow-type-definition
array-type-definition
Read syntax diagramSkip visual syntax diagramdata-type1ARRAY[ 2147483647integer-constantdata-type2 ]
data-type1
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-data-typerow-type-name
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)XMLBOOLEANCURSOR
anchored-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nametable-name.column-nameROWOFtable-nameview-namecursor-variable-name
data-type2
Read syntax diagramSkip visual syntax diagramINTEGERINTVARCHARCHARACTERCHARVARYING(integer)anchored-non-row-data-type
anchored-non-row-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nametable-name.column-name
distinct-type-definition
Read syntax diagramSkip visual syntax diagramsource-data-typeWITH WEAK TYPE RULES NOT NULL CHECK(check-condition)
source-data-type
Read syntax diagramSkip visual syntax diagram built-in-typeanchored-non-row-data-type
row-type-definition
Read syntax diagramSkip visual syntax diagramROW (,field-namedata-type3)anchored-row-data-type
data-type3
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-non-row-data-typedistinct-type-name
anchored-row-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nameROWOFtable-nameview-namecursor-variable-name
SQL-variable-declaration
Read syntax diagramSkip visual syntax diagramDECLARE,SQL-variable-namedata-type4DEFAULT NULLCONSTANT NULLDEFAULTCONSTANTconstant(cursor-value-constructor)2RESULT_SET_LOCATORVARYING
data-type4
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-data-typearray-type-name3cursor-type-namedistinct-type-namerow-type-name4
cursor-value-constructor
Read syntax diagramSkip visual syntax diagramCURSOR (,cursor-parameter-declaration) holdability FOR select-statementstatement-name5
cursor-parameter-declaration
Read syntax diagramSkip visual syntax diagramparameter-namedata-type5
data-type5
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-non-row-data-typedistinct-type-name
holdability
Read syntax diagramSkip visual syntax diagramWITHOUT HOLDWITH HOLD
condition-declaration
Read syntax diagramSkip visual syntax diagramDECLAREcondition-nameCONDITION FORSQLSTATEVALUEstring-constant
statement-declaration
Read syntax diagramSkip visual syntax diagramDECLARE ,statement-name STATEMENT
return-codes-declaration
Read syntax diagramSkip visual syntax diagramDECLARESQLSTATECHARACTER(5)CHAR(5)DEFAULT '00000'DEFAULTstring-constantSQLCODEINTEGERINTDEFAULT 0DEFAULTinteger-constant
procedure-declaration
Read syntax diagramSkip visual syntax diagramDECLARE PROCEDUREprocedure-nameprocedure-namePROCEDURE ( ,parameter-declaration )SQL-procedure-body
SQL-procedure-body
Read syntax diagramSkip visual syntax diagramSQL-procedure-statement
handler-declaration
Read syntax diagramSkip visual syntax diagramDECLARECONTINUEEXITUNDOHANDLERFOR specific-condition-valuegeneral-condition-value SQL-procedure-statement
specific-condition-value
Read syntax diagramSkip visual syntax diagram,SQLSTATEVALUEstring-constantcondition-name
general-condition-value
Read syntax diagramSkip visual syntax diagram,SQLEXCEPTIONSQLWARNINGNOT FOUND
SQL-procedure-statement
Read syntax diagramSkip visual syntax diagramlabel:SQL-statement
Notes:
  • 1 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
  • 2 If data-type4 specifies a CURSOR built-in type or cursor-type-name, only NULL or cursor-value-constructor can be specified. Only DEFAULT NULL can be explicitly specified for array-type-name or row-type-name .
  • 3 Only DEFAULT NULL can be explicitly specified for array-type-name.
  • 4 Only DEFAULT NULL can be explicitly specified for row-type-name.
  • 5 statement-name cannot be specified if cursor-parameter-declaration is specified.

Beschreibung

Bezeichnung
Definiert die Bezeichnung für den Codeblock. Wenn der Anfangskennsatz angegeben wird, kann er verwendet werden, um SQL-Variablen zu qualifizieren, die in der zusammengesetzten Anweisung deklariert sind, und kann auch in einer Anweisung LEAVE angegeben werden. Wird der Endkennsatz angegeben, muss er mit dem Anfangskennsatz identisch sein.
ATOMIC oder NOT ATOMIC
ATOMIC gibt an, dass alle SQL-Anweisungen in der zusammengesetzten Anweisung rückgängig gemacht werden, wenn eine nicht behandelte Ausnahmebedingung in der Compound-Anweisung auftritt.

NOT ATOMIC gibt an, dass eine nicht behandelte Ausnahmebedingung in der Compound-Anweisung nicht dazu führt, dass die Compound-Anweisung rückgängig gemacht wird.

Wenn das Schlüsselwort ATOMIC in einer dynamisch vorbereiteten Compound-Anweisung oder einer SQL-Funktion angegeben wird, die sich nicht in einem Modul befindet, wird die Compound-Anweisung als Compound-SQL-Anweisung (Inlin-Anweisung) verarbeitet.

Eine zusammengesetzte Anweisung, die im Funktionskörper einer Modultabellenfunktion verwendet wird, kann nur als NOT ATOMIC definiert werden.

typdeklaration
Deklariert einen benutzerdefinierten Datentyp, der für die Compound-Anweisung lokal ist.
type-name
Gibt den Namen eines lokalen benutzerdefinierten Datentyps an Der Name darf nicht mit einem anderen Typ identisch sein, der in der aktuellen zusammengesetzten Anweisung deklariert ist (SQLSTATE-Wert 42734). Der nicht qualifizierte typname hat dieselben Einschränkungen wie in einer beliebigen Anweisung CREATE TYPE (SQLSTATE 42939) beschrieben.
array-type-definition
Gibt die Attribute eines Array-Datentyps an, der dem typnamenzugeordnet werden soll Eine Beschreibung der Syntaxelemente finden Sie unter CREATE TYPE (array) . Der Zeilentypname kann auf einen deklarierten Zeilentyp verweisen, der zuvor deklariert wurde und im Geltungsbereich der aktuellen Compound-SQL-Anweisung (kompilierte Anweisung) liegt. Der Variablenname , der in einer Klausel vom Typ "verankerte Daten" angegeben ist, kann auf eine lokale Variable im Geltungsbereich der aktuellen Compound-SQL-Anweisung (kompiliert) verweisen.
distinct-type-definition
Gibt den Quellentyp und optionale Datentypeinschränkungen eines schwach typisierten einzigartigen Datentyps an, der dem typnamenzugeordnet werden soll. Eine vollständige Beschreibung der Syntaxelemente finden Sie unter "CREATE TYPE (distinct)". Der variablenname , der in der Klausel 'verankerte-nicht-Zeilendatentypen' angegeben ist, kann auf eine lokale Variable im Geltungsbereich der aktuellen Compound-SQL-Anweisung (kompiliert) verweisen. Der Datentyp des Ankers variablenname oder spaltenname muss ein integrierter Datentyp sein.
row-type-definition
Gibt die Felder eines Zeilendatentyps an, der dem typnamenzugeordnet werden soll Eine vollständige Beschreibung der Syntaxelemente finden Sie in CREATE TYPE (row) . Der Variablenname , der in den Klauseln 'verankerte-nicht-zeilendatentyp' oder 'verankerte-zeilendatentyp' angegeben ist, kann auf eine lokale Variable im Geltungsbereich der aktuellen Compound-SQL-Anweisung (kompiliert) verweisen.
SQL-Variablendeklaration
Deklariert eine Variable, die für die zusammengesetzte Anweisung lokal ist.
SQL-Variablenname
Definiert den Namen einer lokalen Variablen. Alle SQL-Variablennamen werden in Großbuchstaben konvertiert. Der Name darf nicht mit einer anderen SQL-Variablen in derselben Compound-Anweisung und nicht mit einem Parameternamen identisch sein. Ein SQL-Variablenname darf nicht mit einem Spaltennamen identisch sein. Wenn eine SQL-Anweisung eine Kennung mit demselben Namen wie eine SQL-Variable und einen Spaltenverweis enthält, wird die Kennung als Spalte interpretiert. Wenn die zusammengesetzte Anweisung, in der die Variable deklariert wird, eine Beschriftung hat, können Verweise auf die Variable mit der Beschriftung qualifiziert werden. Beispielsweise kann die Variable V, die in einer zusammengesetzten Anweisung mit der Bezeichnung C deklariert ist, als C.V.
data-type4
Gibt den Datentyp der Variablen an Ein strukturierter Typ oder Referenztyp kann nicht angegeben werden (SQLSTATE 429BB).
integrierter Typ
Gibt einen integrierten Datentyp an Eine vollständige Beschreibung jedes integrierten Datentyps mit Ausnahme von BOOLEAN und CURSOR, die nicht für eine Tabelle angegeben werden können, finden Sie unter "CREATE TABLE". Der XML-Datentyp kann nicht in einer zusammengesetzten SQL-Anweisung (kompiliert) angegeben werden, die in einem Trigger, in einer Funktion oder als eigenständige Anweisung verwendet wird (SQLSTATE 429BB). Der XML-Datentyp kann angegeben werden, wenn die Compound-SQL-Anweisung (kompilierte Anweisung) in einem SQL-Prozedurhauptteil verwendet wird.
Boolesch
Für einen booleschen Wert.
CURSOR
Für einen Cursor.
verankerte Datentypen
Gibt ein anderes Objekt an, das zur Bestimmung des Datentyps der SQL-Variablen verwendet wird Der Datentyp des Ankerobjekts weist dieselben Einschränkungen auf, die für die direkte Angabe des Datentyps oder im Fall einer Zeile für die Erstellung eines Zeilentyps gelten.
ANKERDATENTYP ZU
Gibt an, dass ein verankerte Datentyp zur Angabe des Datentyps verwendet wird
Variablenname
Gibt eine SQL-Variable, einen SQL-Parameter oder eine globale Variable an Der Datentyp der referenzierten Variablen wird als Datentyp für SQL-Variablennameverwendet.
table-name.column-name
Gibt einen Spaltennamen einer vorhandenen Tabelle oder Sicht an. Der Datentyp der Spalte wird als Datentyp für SQL-Variablennameverwendet.
ROW OF tabellenname oder sichtname
Gibt eine Zeile mit Feldern mit Namen und Datentypen an, die auf den Spaltennamen und Spaltendatentypen der durch tabellenname angegebenen Tabelle oder der durch sichtnameangegebenen Sicht basieren. Der Datentyp SQL-Variablenname ist ein nicht benannter Zeilentyp.
ROW OF cursor-variablenname
Gibt eine Zeile mit Feldern mit Namen und Datentypen an, die auf den Feldnamen und Felddatentypen der Cursorvariablen basieren, die durch Cursorvariablennameidentifiziert wird. Die angegebene Cursorvariable muss eines der folgenden Elemente sein (SQLSTATE 428HS):
  • Eine SQL -Variable oder globale Variable mit einem stark typisierten Cursordatentyp
  • Eine SQL -Variable oder globale Variable mit einem schwach typisierten Cursordatentyp, der mit einer Klausel CONSTANT erstellt oder deklariert wurde, die eine select-anweisung angibt, in der alle Ergebnisspalten benannt sind.
Wenn der Cursortyp der Cursorvariablen mit einem benannten Zeilentyp nicht stark rtypisiert ist, ist der Datentyp von SQL-Variablenname ein nicht benannter Zeilentyp.
array-typname
Gibt den Namen eines benutzerdefinierten Array-Typs an. Der Array-Datentyp kann ein lokal deklarierter Datentyp, ein Schemadatentyp oder ein Moduldatentyp sein.
Cursortypname
Gibt den Namen eines Cursortyps an. Der Cursordatentyp kann ein Schemadatentyp oder ein Moduldatentyp sein.
einzigartiger-typname
Gibt den Namen eines einzigartigen Datentyps an. Der einzigartige Datentyp kann ein Schemadatentyp oder ein Moduldatentyp sein. Die Länge, Genauigkeit und Anzahl der Kommastellen der deklarierten Variablen sind die Länge, die Genauigkeit und die Anzahl der Kommastellen des Quellentyps des einzigartigen Typs.
zeilentypname
Gibt den Namen eines benutzerdefinierten Zeilentyps an. Der Zeilendatentyp kann ein lokal deklarierter Datentyp, ein Schemadatentyp oder ein Moduldatentyp sein. Die Felder der Variablen sind die Felder des Zeilentyps.
DEFAULT oder CONSTANT
Gibt einen Wert für die SQL-Variable an, wenn die Compound-SQL-Anweisung (kompilierte Anweisung) referenziert wird. Wenn keiner dieser Werte angegeben ist, ist der Standardwert für die SQL-Variable der Nullwert. Nur DEFAULT NULL kann explizit angegeben werden, wenn array-type-name oder zeilentypname angegeben ist.
DEFAULT
Definiert den Standardwert für die SQL-Variable. Die Variable wird initialisiert, wenn die (kompilierte) Compound-SQL-Anweisungreferenziert wird. Der Standardwert muss mit dem Datentyp der Variablen zuordnungskompatibel sein.
CONSTANT
Gibt an, daß die SQL-Variable einen festen Wert hat, der nicht geändert wird. Eine mit CONSTANT definierte SQL-Variable kann nicht als Ziel einer Zuordnungsoperation verwendet werden. Der feste Wert muss mit dem Datentyp der Variablen zuordnungskompatibel sein.
NULL
Gibt NULL als Standardwert für die SQL-Variable an
konstante
Gibt eine Konstante als Standardwert für die SQL-Variable an Wenn data-type4 einen integrierten Typ CURSOR oder einen Cursortypnamenangibt, kann konstante nicht angegeben werden (SQLSTATE 42601).
Cursor-Wert-Konstruktor
Ein cursor-value-constructor gibt die select-anweisung an, die der SQL-Variablen zugeordnet ist. Die Zuordnung eines Cursorwertkonstruktors zu einer Cursorvariablen definiert den zugrunde liegenden Cursor dieser Cursorvariablen.
(Cursor-Parameter-Deklaration, ...)
Gibt die Eingabeparameter des Cursors an, einschließlich des Namens und des Datentyps jedes Parameters. Benannte Eingabeparameter können nur angegeben werden, wenn select-statement auch in cursor-value-constructor (SQLSTATE 428HU) angegeben wird.
parametername
Benennt den Parameter cursor zur Verwendung als SQL-Variable in select-statement. Der Name darf nicht mit einem anderen Parameternamen für den Cursor übereinstimmen. Namen sollten auch ausgewählt werden, um Spaltennamen zu vermeiden, die in select-statementverwendet werden könnten, da Spaltennamen vor Parameternamen aufgelöst werden.
data-type5
Gibt den Datentyp des Cursorparameters an, der in select-statementverwendet wird. Strukturierte Typen und Referenztypen können nicht angegeben werden (SQLSTATE 429BB).
integrierter Typ
Gibt einen integrierten Datentyp an Eine vollständige Beschreibung der einzelnen integrierten Datentypen finden Sie unter "CREATE TABLE". Die integrierten Typen BOOLEAN und CURSOR können nicht angegeben werden (SQLSTATE 429BB).
verankerte-nicht-zeilendatentyp
Gibt ein anderes Objekt an, das verwendet wird, um den Datentyp des Cursorparameterszu ermitteln. Der Datentyp des Ankerobjekts hat dieselben Einschränkungen, die für die direkte Angabe des Datentyps gelten.
ANKERDATENTYP ZU
Gibt an, dass ein verankerte Datentyp zur Angabe des Datentyps verwendet wird
Variablenname
Gibt eine lokale SQL-Variable, einen SQL-Parameter oder eine globale Variable an Der Datentyp der referenzierten Variablen wird als Datentyp für den Cursorparameterverwendet.
table-name.column-name
Gibt einen Spaltennamen einer vorhandenen Tabelle oder Sicht an. Der Datentyp der Spalte wird als Datentyp für den Cursorparameterverwendet.
einzigartiger-typname
Gibt den Namen eines einzigartigen Datentyps an. Wenn einzigartiger-typname ohne einen Schemanamen angegeben wird, wird der einzigartige Typ durch Durchsuchen der Schemata im SQL-Pfad aufgelöst.
Holdability
Gibt an, ob das Schließen des Cursors infolge einer Commitoperation verhindert wird. Weitere Informationen finden Sie unter "DECLARE CURSOR" Der Standardwert ist WITHOUT HOLD.
OHNE RÜCKSTELLUNG
Verhindert nicht, dass der Cursor als Folge einer Commitoperation geschlossen wird.
MIT SPERRE
Verwaltet Ressourcen über mehrere Arbeitseinheiten hinweg. Verhindert, dass der Cursor infolge einer Commitoperation geschlossen wird.
select-anweisung
Gibt die Anweisung SELECT des Cursors an. Weitere Informationen finden Sie unter "select-statement". Wenn cursor-parameter-deklaration in cursor-wert-konstruktorenthalten ist, darf select-anweisung keine lokalen SQL-Variablen oder SQL-Routinenparameter enthalten (SQLSTATE 42704).
Anweisungsname
Gibt die vorbereitete select-anweisung des Cursors an Eine Erläuterung der vorbereiteten Anweisungen finden Sie unter "PREPARE". Die Zielcursorvariable darf keinen Datentyp haben, der ein stark rtypisierter benutzerdefinierter Cursortyp ist (SQLSTATE 428HU). Benannte Eingabeparameter dürfen nicht in cursor-value-constructor angegeben werden, wenn Anweisungsname angegeben wird (SQLSTATE 428HU).
RESULT_SET_LOCATOR VARIIEREND
Gibt den Datentyp für eine Locator-Variable für Ergebnismenge an.
bedingungsdeklaration
Deklariert einen Bedingungsnamen mit einem optionalen zugeordneten SQLSTATE-Wert.
bedingungsname
Gibt den Namen der Bedingung an. Der Bedingungsname muss innerhalb der zusammengesetzten Anweisung, in der er deklariert ist, eindeutig sein, mit Ausnahme aller Deklarationen in zusammengesetzten Anweisungen, die in dieser zusammengesetzten Anweisung verschachtelt sind (SQLSTATE-Wert 42734). Ein Bedingungsname kann nur innerhalb der zusammengesetzten Anweisung referenziert werden, in der er deklariert ist, einschließlich aller zusammengesetzten Anweisungen, die in dieser zusammengesetzten Anweisung verschachtelt sind (SQLSTATE-Wert 42737).
CONDITION FOR SQLSTATE VALUEzeichenfolgekonstante
Gibt den SQLSTATE-Wert an, der der Bedingung zugeordnet ist. Die Zeichenfolgekonstante muss als fünf Zeichen in einfachen Anführungszeichen angegeben werden, und die SQLSTATE-Klasse (die ersten beiden Zeichen) darf nicht '00' sein. Wenn diese Klausel nicht angegeben wird, hat die Bedingung keinen zugeordneten SQLSTATE-Wert.
Anweisungsdeklaration
Deklariert eine Liste mit Namen, die für die Compound-Anweisung lokal sind. Jeder Name in Anweisungsname darf nicht mit einem anderen Anweisungsnamen identisch sein, der in derselben zusammengesetzten Anweisung deklariert ist.
Rückkehrcodedeklaration
Deklariert spezielle Variablen namens SQLSTATE und SQLCODE, die automatisch auf den Wert gesetzt werden, der nach der Verarbeitung einer SQL-Anweisung zurückgegeben wird. Sowohl die SQLSTATE-als auch die SQLCODE-Variablen können nur in der äußersten zusammengesetzten Anweisung deklariert werden, wenn verschachtelte Compound-SQL-Anweisungen (kompilierte Anweisungen) vorhanden sind, z. B. in einem SQL-Prozedurhauptteil. Diese Variablen dürfen nur einmal pro SQL-Prozedur deklariert werden.
declare-cursor-anweisung
Deklariert einen integrierten Cursor im Prozedurhauptteil. Variablen benutzerdefinierter Cursordatentypen werden mit SQL-Variablendeklaration -Anweisungen deklariert.

Jeder deklarierte Cursor muss einen eindeutigen Namen innerhalb der zusammengesetzten Anweisung haben, in der er deklariert ist, ausgenommen alle Deklarationen in zusammengesetzten Anweisungen, die in dieser zusammengesetzten Anweisung verschachtelt sind (SQLSTATE-Wert 42734). Auf den Cursor kann nur von der zusammengesetzten Anweisung aus verwiesen werden, in der er deklariert ist, einschließlich aller zusammengesetzten Anweisungen, die in dieser zusammengesetzten Anweisung verschachtelt sind (SQLSTATE 34000).

Verwenden Sie eine Anweisung OPEN, um den Cursor zu öffnen, und eine Anweisung FETCH, um Zeilen mit dem Cursor zu lesen. Um Ergebnismengen aus der SQL-Prozedur an die Clientanwendung zurückzugeben, muss der Cursor mit der Klausel WITH RETURN deklariert werden. Im folgenden Beispiel wird eine Ergebnismenge an die Clientanwendung zurückgegeben:
   CREATE PROCEDURE RESULT_SET()
     LANGUAGE SQL
     RESULT SETS 1
     BEGIN
       DECLARE C1 CURSOR WITH RETURN FOR
         SELECT id, name, dept, job
           FROM staff;
       OPEN C1;
   END

Hinweis: Zur Verarbeitung von Ergebnismengen müssen Sie Ihre Clientanwendung mit einer der Db2® Call Level Interface (Db2 Call Level Interface), Open Database Connectivity (ODBC), Java™ Database Connectivity (JDBC) oder eingebetteten SQL for Java (SQLJ) -Anwendungsprogrammierschnittstellen schreiben.

Weitere Informationen zum Deklarieren eines Cursors finden Sie unter "DECLARE CURSOR".

Prozedurdeklaration
Deklariert eine Prozedur, die für die zusammengesetzte Anweisung lokal ist. Die Definition einer lokalen Prozedur enthält keine Spezifikation einer der Optionen, die in einer Anweisung CREATE PROCEDURE (SQL) möglich sind. Die Optionen werden standardmäßig wie für eine Anweisung CREATE PROCEDURE (SQL) mit Ausnahme von MODIFIES SQL DATA verwendet. Die Datenzugriffsebene für die Prozedur wird automatisch als Mindeststufe für die Verarbeitung des SQL-Prozedurhauptteils festgelegt.
prozedurname
Definiert die Namen einer lokalen Prozedur. Der Name muss ohne Qualifikation angegeben werden (SQLSTATE 42601). Die Prozedursignatur, die aus dem Prozedurnamen und der Anzahl der deklarierten Parameter besteht, muss innerhalb der aktuellen zusammengesetzten Anweisung eindeutig sein. Äußere zusammengesetzte Anweisungen, in denen die aktuelle zusammengesetzte Anweisung verschachtelt ist, dürfen keine Prozedur mit demselben Namen enthalten.
parameterdeklaration
Gibt die Parameter der lokalen Prozedur an. Eine Beschreibung der Syntaxelemente finden Sie unter CREATE PROCEDURE (SQL) . Der Parameterdatentyp kann ein lokal deklarierter Datentyp im Geltungsbereich der aktuellen zusammengesetzten Anweisung sein.
SQL-Prozedurhauptteil
Gibt die SQL-Anweisung an, die der Hauptteil der SQL-Prozedur ist. Namen, auf die im SQL-Prozedurhauptteil verwiesen wird, können auf deklarierte Objekte (z. B. deklarierte Variablen, Datentypen und Prozeduren) verweisen, die zuvor deklariert wurden und sich im Geltungsbereich der zusammengesetzten Anweisung befinden, in der die lokale Prozedur deklariert ist.
Handler-Deklaration
Gibt einen Handlerund eine Gruppe von mindestens einer SQL-Prozeduranweisung an, die ausgeführt werden soll, wenn eine Ausnahme oder eine Abschlussbedingung in der zusammengesetzten Anweisung auftritt.SQL-Prozeduranweisung ist eine Anweisung, die ausgeführt wird, wenn der Handler die Steuerung erhält.

Ein Handler gilt als aktiv für die Dauer der Ausführung der Gruppe von SQL-Prozeduranweisungen , die auf die Gruppe von handler-deklarationen in der zusammengesetzten Anweisung folgen, in der der Handler deklariert ist, einschließlich aller verschachtelten zusammengesetzten Anweisungen.

Es gibt drei Typen von Bedingungshandlern:

CONTINUE
Nachdem der Handler erfolgreich aufgerufen wurde, wird die Steuerung an die SQL-Anweisung zurückgegeben, die auf die Anweisung folgt, die die Ausnahmebedingung ausgelöst hat. Wenn der Fehler, der die Ausnahmebedingung ausgelöst hat, eine Anweisung FOR, IF, CASE, WHILE oder REPEAT ist (aber keine SQL-Prozeduranweisung innerhalb einer dieser Anweisungen), wird die Steuerung an die Anweisung zurückgegeben, die auf END FOR, END IF, END CASE, END WHILE oder END REPEAT folgt.
BEENDEN
Nachdem der Handler erfolgreich aufgerufen wurde, wird die Steuerung an das Ende der zusammengesetzten Anweisung zurückgegeben, die den Handler deklariert hat.
RÜCKGÄNGIG
Bevor der Handler aufgerufen wird, werden alle SQL-Änderungen, die in der Compound-Anweisung vorgenommen wurden, rückgängig gemacht. Nachdem der Handler erfolgreich aufgerufen wurde, wird die Steuerung an das Ende der zusammengesetzten Anweisung zurückgegeben, die den Handler deklariert hat. Bei Angabe von UNDO muss die zusammengesetzte Anweisung, in der der Handler deklariert ist, ATOMIC sein.

Die Bedingungen, die die Aktivierung des Handlers bewirken, werden in der Handlerdeklaration wie folgt definiert:

spezifischer-bedingungswert
Gibt an, dass der Handler ein spezifischer Bedingungshandlerist.
SQLSTATE VALUEzeichenfolgekonstante
Gibt einen SQLSTATE-Wert an, für den der Handler aufgerufen wird. Die ersten beiden Zeichen des SQLSTATE-Werts dürfen nicht '00' sein.
bedingungsname
Gibt einen Bedingungsnamen an, für den der Handler aufgerufen wird. Der Bedingungsname muss zuvor in einer Bedingungsdeklaration definiert sein oder er muss eine Bedingung angeben, die auf dem aktuellen Server vorhanden ist.
allgemeine-bedingung-wert
Gibt an, dass der Handler ein allgemeiner Bedingungshandlerist.
SQLEXCEPTION
Gibt an, dass der Handler aufgerufen wird, wenn eine Ausnahmebedingung auftritt. Eine Ausnahmebedingung wird durch einen SQLSTATE-Wert dargestellt, dessen erste zwei Zeichen nicht '0', '01' oder '01' sind.
SQLWARNING
Gibt an, dass der Handler aufgerufen wird, wenn eine Warnungsbedingung auftritt. Eine Warnungsbedingung wird durch einen SQLSTATE-Wert dargestellt, dessen erste zwei Zeichen '01' sind.
NICHT GEFUNDEN
Gibt an, dass der Handler aufgerufen wird, wenn eine Bedingung NOT FOUND auftritt. Eine Bedingung NOT FOUND wird durch einen SQLSTATE-Wert dargestellt, dessen erste zwei Zeichen '02' sind.
SQL-Prozeduranweisung
Gibt die SQL-Prozeduranweisung an.
Bezeichnung
Gibt einen Kennsatz für die SQL-Prozeduranweisung an. Die Bezeichnung muss innerhalb einer Liste von SQL-Prozeduranweisungen, einschließlich aller in der Liste verschachtelten zusammengesetzten Anweisungen, eindeutig sein. Beachten Sie, dass zusammengesetzte Anweisungen, die nicht verschachtelt sind, dieselbe Bezeichnung verwenden können. Eine Liste von SQL-Prozeduranweisungen ist in einer Reihe von SQL-Steueranweisungen möglich.
SQL-Anweisung
Alle ausführbaren SQL-Anweisungen mit Ausnahme von:
  • ALTER
  • CONNECT
  • CREATE
  • DESCRIBE
  • DISCONNECT
  • DROP
  • FLUSH EVENT MONITOR
  • FREE LOCATOR
  • ERTEILEN
  • REFRESH TABLE
  • RELEASE (nur Verbindung)
  • RENAME TABLE
  • RENAME TABLESPACE
  • WIDERRUFEN
  • SET CONNECTION
  • SET INTEGRITY
  • SET PASSTHRU
  • SERVEROPTION FESTLEGEN
  • TRANSFER OWNERSHIP
Die folgenden ausführbaren Anweisungen werden in eigenständigen Compound-SQL-Anweisungen (kompilierten Anweisungen) nicht unterstützt, aber in zusammengesetzten SQL-Anweisungen (kompilierten Anweisungen), die in einer SQL-Funktion, einer SQL-Prozedur oder einem Trigger verwendet werden:
  • CREATE eines Index, einer Tabelle oder einer Sicht
  • DECLARE GLOBAL TEMPORARY TABLE
  • DROP eines Index, einer Tabelle oder einer Sicht
  • ERTEILEN
  • ROLLBACK
Die Anweisung ROLLBACK wird auch in keiner verschachtelten Anweisung unterstützt, die in der eigenständigen zusammengesetzten SQL-Anweisung (kompiliert) aufgerufen wird.
Die folgenden Anweisungen, die keine ausführbaren Anweisungen sind, werden in zusammengesetzten SQL-Anweisungen (kompiliert) unterstützt:
  • CURSOR ZUORDNEN
  • QUERVERWEISE ZUORDNEN

Regeln

  • ATOMIC-Compound-Anweisungen können nicht verschachtelt werden.
  • Die folgenden Regeln gelten für Handlerdeklarationen:
    • Eine Handlerdeklaration kann nicht denselben bedingungsnamen oder SQLSTATE-Wert mehr als einmal enthalten und kann keinen SQLSTATE-Wert und einen bedingungsnamen enthalten, die denselben SQLSTATE-Wert darstellen.
    • Dabei werden mindestens zwei Bedingungshandler in einer zusammengesetzten Anweisung deklariert:
      • Keine zwei Handlerdeklarationen dürfen dieselbe allgemeine Bedingungskategorie angeben (SQLEXCEPTION, SQLWARNING, NOT FOUND).
      • Keine zwei Handlerdeklarationen können dieselbe spezifische Bedingung angeben, entweder als SQLSTATE-Wert oder als bedingungsname , der denselben Wert darstellt.
    • Ein Handler wird aktiviert, wenn er der am besten geeignete Handler für eine Ausnahme-oder Abschlussbedingung ist. Der am besten geeignete Handler wird anhand der folgenden Aspekte bestimmt:
      • Der Geltungsbereich einer Handlerdeklaration H ist die Liste der SQL-Prozeduranweisung , die auf die Handlerdeklarationen folgt, die in der zusammengesetzten Anweisung enthalten sind, in der H vorkommt. Dies bedeutet, dass der Bereich von H nicht die Anweisungen enthält, die im Hauptteil des Bedingungshandlers Henthalten sind, was bedeutet, dass ein Bedingungshandler Bedingungen, die in seinem eigenen Hauptteil auftreten, nicht verarbeiten kann. Für zwei beliebige Handler H1 und H2 , die in derselben zusammengesetzten Anweisung deklariert sind, verarbeitet H1 keine Bedingungen, die im Hauptteil von H2auftreten, und H2 verarbeitet keine Bedingungen, die sich im Hauptteil von H1ergeben.
      • Ein Handler für einen spezifischen-bedingungswert oder einen allgemeinen-bedingungswert C, der in einem inneren Bereich deklariert ist, hat Vorrang vor einem anderen Handler für C, der in einem einschließenden Bereich deklariert ist.
      • Wenn ein bestimmter Handler für Bedingung C und ein allgemeiner Handler, der auch C verarbeiten würde, in demselben Geltungsbereich deklariert werden, hat der spezifische Handler Vorrang vor dem allgemeinen Handler.
      • Wenn ein Handler für eine Modulbedingung, der keinen zugeordneten SQLSTATE-Wert hat, und ein Handler für SQLSTATE 45000 in demselben Geltungsbereich deklariert werden, hat der Handler für die Modulbedingung Vorrang vor dem Handler für SQLSTATE 45000.
      Wenn eine Ausnahmebedingung auftritt, für die es keinen geeigneten Handler gibt, wird die SQL-Prozedur, die die fehlgeschlagene Anweisung enthält, mit einer nicht behandelten Ausnahmebedingung beendet. Wenn eine Abschlussbedingung auftritt, für die es keinen geeigneten Handler gibt, wird die Ausführung mit der nächsten SQL-Anweisung fortgesetzt.
  • Das Referenzieren von Variablen oder Parametern des Datentyps XML in SQL-Prozeduren nach einer Commit-oder Rollback-Operation wird nicht unterstützt (SQLSTATE 560CE).
  • Verwendung von verankerten Datentypen Ein verankerte Datentyp kann nicht auf die folgenden Objekte verweisen (SQLSTATE 428HS): einen Kurznamen, eine typisierte Tabelle, eine typisierte Sicht, eine Statistiksicht, die einem ausdrucksbasierten Index zugeordnet ist, eine deklarierte temporäre Tabelle, eine Zeilendefinition, die einem schwach typisierten Cursor zugeordnet ist, ein Objekt mit einer Codepage oder einer Sortierfolge, die sich von der Datenbankcodepage oder der Datenbanksortierfolge unterscheidet.
  • Wenn benannte Parametermarken in einer Compound-SQL-Anweisung (kompilierten Anweisung) verwendet werden, die dynamisch vorbereitet oder ausgeführt wird, muss jeder Parametermarkenname eindeutig sein (SQLSTATE 42997).

Hinweise

  • XML-Zuordnungen: Die Zuordnung zu Parametern und Variablen des Datentyps XML erfolgt nach Referenz.

    Die Übergabe von Parametern des Datentyps XML in einer Anweisung CALL an eine SQL-Prozedur erfolgt nach Referenz. Wenn XML-Werte nach Referenz übergeben werden, werden alle Eingabeknotenbaumstrukturen direkt aus dem XML-Argument verwendet. Diese direkte Verwendung behält alle Eigenschaften bei, einschließlich der Dokumentreihenfolge, der ursprünglichen Knotenidentitäten und aller übergeordneten Eigenschaften.

Beispiele

  • Beispiel 1: Eine einfache eigenständige zusammengesetzte Anweisung, die das Wort 'Hello' ausgibt:
       SET SERVEROUTPUT ON;
       BEGIN
           CALL DBMS_OUTPUT.PUT_LINE ( 'Hello' );
       END
  • Beispiel 2: Eine einfache eigenständige zusammengesetzte Anweisung, die die Anzahl der Datensätze in staff zählt und das Ergebnis ausgibt:
       SET SERVEROUTPUT ON;
       BEGIN
           DECLARE v_numRecords INTEGER DEFAULT 1;
        SELECT COUNT(*) INTO v_numRecords FROM staff;
    
        CALL DBMS_OUTPUT.PUT_LINE (v_numRecords);
       END
  • Beispiel 3: Erstellen Sie eine Prozedur mit einer zusammengesetzten SQL-Anweisung (kompiliert), die die folgenden Aktionen ausführt:
    1. Deklariert SQL-Variablen.
    2. Deklariert einen Cursor, um das Gehalt von Mitarbeitern in einer durch einen IN-Parameter festgelegten Abteilung zurückzugeben. In der Anweisung SELECT wird der Datentyp der Spalte salary von DECIMAL in DOUBLE umgesetzt.
    3. Deklariert einen EXIT-Handler für die Bedingung NOT FOUND (Dateiende), die den Wert '6666' dem OUT-Parameter medianSalary zuordnet.
    4. Wählen Sie die Anzahl der Mitarbeiter in der angegebenen Abteilung in der SQL-Variablen numRecords aus
    5. Zeilen vom Cursor in einer WHILE-Schleife abrufen, bis 50% + 1 der Mitarbeiter abgerufen wurden
    6. Gibt das Mediangehalt zurück
       CREATE PROCEDURE DEPT_MEDIAN
         (IN deptNumber SMALLINT, OUT medianSalary DOUBLE)
         LANGUAGE SQL
         BEGIN
           DECLARE v_numRecords INTEGER DEFAULT 1;
           DECLARE v_counter INTEGER DEFAULT 0;
           DECLARE c1 CURSOR FOR
             SELECT CAST(salary AS DOUBLE) FROM staff
               WHERE DEPT = deptNumber
               ORDER BY salary;
           DECLARE EXIT HANDLER FOR NOT FOUND
             SET medianSalary = 6666;
       -- initialize OUT parameter
             SET medianSalary = 0;
             SELECT COUNT(*) INTO v_numRecords FROM staff
               WHERE DEPT = deptNumber;
             OPEN c1;
             WHILE v_counter < (v_numRecords / 2 + 1) DO
               FETCH c1 INTO medianSalary;
               SET v_counter = v_counter + 1;
             END WHILE;
             CLOSE c1;
         END
  • Beispiel 4: Das folgende Beispiel veranschaulicht den Ausführungsablauf in einem hypothetischen Fall, in dem ein UNDO Handler aus einer anderen Bedingung als Ergebnis von RESIGNAL aktiviert wird:
       CREATE PROCEDURE A()
       LANGUAGE SQL
       CS1: BEGIN ATOMIC
         DECLARE C CONDITION FOR SQLSTATE '12345';
         DECLARE D CONDITION FOR SQLSTATE '23456';
    
         DECLARE UNDO HANDLER FOR C    
         H1: BEGIN
           -- Perform rollback after error, perform final cleanup, and exit        
           -- procedure A.                
    
           -- ...                
    
           -- When this handler completes, execution continues after        
           -- compound statement CS1; procedure A will terminate.    
         END;
    
         -- Perform some work here ...    
         CS2: BEGIN
           DECLARE CONTINUE HANDLER FOR D
           H2: BEGIN
             -- Perform local recovery, then forward the error            
             -- condition to the outer handler for additional
             -- processing.
    
             -- ...
    
             RESIGNAL C; -- will activate UNDO handler H1; execution
                         -- WILL NOT return here.  Any local cursors
                         -- declared in H2 and CS2 will be closed.
           END;
    
           -- Perform some more work here ...
    
           -- Simulate raising of condition D by some SQL statement
           -- in compound statement CS2:
           SIGNAL D; -- will activate H2
         END;
       END