CREATE PROCEDURE (SQL) (Anweisung)

Die Anweisung CREATE PROCEDURE (SQL) definiert eine SQL-Prozedur auf dem aktuellen Server.

Aufruf

Diese Anweisung kann in ein Anwendungsprogramm eingebettet oder mithilfe von dynamischen SQL-Anweisungen ausgeführt werden. Es handelt sich um eine ausführbare Anweisung, die nur dann dynamisch vorbereitet werden kann, wenn das DYNAMICRULES-Ausführungsverhalten für das Paket aktiviert ist (SQLSTATE 42509).

Berechtigung

Die Berechtigungen, die von der Berechtigungs-ID der Anweisung gehalten werden, müssen mindestens die folgenden Berechtigungen umfassen:
  • Wenn der implizite oder explizite Schemaname der Prozedur nicht vorhanden ist, ist die Berechtigung IMPLICIT_SCHEMA für die Datenbank vorhanden.
  • Wenn der Schemaname der Prozedur auf ein vorhandenes Schema verweist, Zugriffsrecht CREATEIN für das Schema.
  • Wenn der Schemaname der Prozedur auf ein vorhandenes Schema verweist, ist die Berechtigung SCHEMAADM für das Schema vorhanden.
  • Berechtigung DBADM

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

Um eine vorhandene Prozedur zu ersetzen, muss die Berechtigungs-ID der Anweisung der Eigner der vorhandenen Prozedur sein (SQLSTATE 42501).

Gruppenzugriffsrechte werden für Tabellen oder Sichten, die in der Anweisung CREATE PROCEDURE (SQL) angegeben sind, nicht berücksichtigt.

Syntax

Read syntax diagramSkip visual syntax diagramCREATEOR REPLACE PROCEDUREprocedure-name(,INOUTINOUTparameter-namedata-typedefault-clause)option-listSQL-procedure-body
data-type
Read syntax diagramSkip visual syntax diagram built-in-typeanchored-variable-data-typearray-type-namecursor-type-namedistinct-type-namerow-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 TYPETO variable-nametable-name.column-nameROWOFtable-nameview-namecursor-variable-name
default-clause
Read syntax diagramSkip visual syntax diagramDEFAULT NULLconstantspecial-registerglobal-variable(expression)
option-list
Read syntax diagramSkip visual syntax diagramLANGUAGE SQLSPECIFICspecific-nameDYNAMIC RESULT SETS 0DYNAMIC RESULT SETSintegerMODIFIES SQL DATACONTAINS SQLREADS SQL DATANOT DETERMINISTICDETERMINISTICCALLED ON NULL INPUT COMMIT ON RETURN NOCOMMIT ON RETURN YESAUTONOMOUS INHERIT SPECIAL REGISTERSOLD SAVEPOINT LEVELNEW SAVEPOINT LEVELEXTERNAL ACTIONNO EXTERNAL ACTIONPARAMETER CCSIDASCIIUNICODE
SQL-procedure-body
Read syntax diagramSkip visual syntax diagramSQL-procedure-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).

Beschreibung

OR REPLACE
Gibt an, dass die Definition für die Prozedur ersetzt werden soll, wenn sie auf dem aktuellen Server vorhanden ist. Die vorhandene Definition wird effektiv gelöscht, bevor die neue Definition im Katalog ersetzt wird, mit der Ausnahme, dass Berechtigungen, die für die Prozedur erteilt wurden, nicht betroffen sind. Diese Option kann nur vom Eigner des Objekts angegeben werden. Diese Option wird ignoriert, wenn auf dem aktuellen Server keine Definition für die Prozedur vorhanden ist. Zum Ersetzen einer vorhandenen Prozedur müssen der spezifische Name und der Prozedurname der neuen Definition mit dem spezifischen Namen und dem Prozedurnamen der alten Definition übereinstimmen, oder die Signatur der neuen Definition muss mit der Signatur der alten Definition übereinstimmen. Andernfalls wird eine neue Prozedur erstellt.
prozedurname
Benennt die zu definierende Prozedur. Es handelt sich um einen qualifizierten oder nicht qualifizierten Namen, der eine Prozedur bezeichnet. Die nicht qualifizierte Form von prozedurname ist eine SQL-Kennung. In dynamischen SQL-Anweisungen wird das Sonderregister CURRENT SCHEMA als Qualifikationsmerkmal für einen nicht qualifizierten Objektnamen verwendet. In statischen SQL-Anweisungen gibt die Option QUALIFIER precompile/bind implizit das Qualifikationsmerkmal für nicht qualifizierte Objektnamen an. Das qualifizierte Format ist ein schemaname gefolgt von einem Punkt und einer SQL-Kennung.

Der Name einschließlich der impliziten oder expliziten Qualifikationsmerkmale darf zusammen mit der Anzahl der Parameter keine Prozedur angeben, die im Katalog beschrieben ist (SQLSTATE-Wert 42723). Der nicht qualifizierte Name ist zusammen mit der Anzahl der Parameter innerhalb seines Schemas eindeutig, muss aber nicht für alle Schemas eindeutig sein.

Wenn ein zweiteiliger Name angegeben wird, kann der Schemaname nicht mit 'SYS' beginnen; andernfalls wird ein Fehler zurückgegeben (SQLSTATE 42939).

(IN | OUT | INOUT parametername datentyp standardklausel, ...)
Gibt die Parameter der Prozedur an und gibt den Modus, den Namen, den Datentyp und den optionalen Standardwert jedes Parameters an. Für jeden Parameter, den die Prozedur erwartet, muss ein Eintrag in der Liste angegeben werden.
Es ist möglich, eine Prozedur zu registrieren, die keine Parameter hat. In diesem Fall müssen die Klammern immer noch codiert werden, ohne dazwischenliegende Datentypen. Beispiel:
   CREATE PROCEDURE SUBWOOFER() ...

Es ist nicht zulässig, dass zwei identisch benannte Prozeduren innerhalb eines Schemas genau dieselbe Anzahl von Parametern haben. Eine doppelte Signatur löst einen SQL-Fehler aus (SQLSTATE 42723).

Geben Sie beispielsweise die folgenden Anweisungen an:
   CREATE PROCEDURE PART (IN NUMBER INT, OUT PART_NAME CHAR(35)) ...
   CREATE PROCEDURE PART (IN COST DECIMAL(5,3), OUT COUNT INT) ...
Die zweite Anweisung schlägt fehl, da die Anzahl der Parameter in der Prozedur gleich ist, auch wenn die Datentypen nicht übereinstimmen.
IN | OUT | INOUT
Gibt den Modus des Parameters an.

Wenn von der Prozedur ein Fehler zurückgegeben wird, sind OUT-Parameter nicht definiert und INOUT-Parameter bleiben unverändert.

IN
Gibt den Parameter als Eingabeparameter für die Prozedur an Änderungen, die an dem Parameter in der Prozedur vorgenommen werden, sind für die aufrufende SQL-Anwendung nicht verfügbar, wenn die Steuerung zurückgegeben wird. Der Standardwert ist IN.
OUT
Gibt den Parameter als Ausgabeparameter für die Prozedur an
INOUT
Gibt den Parameter als Eingabe-und Ausgabeparameter für die Prozedur an.
parametername
Gibt den Namen des Parameters an. Der Parametername muss für die Prozedur eindeutig sein (SQLSTATE-Wert 42734).
datentyp
Gibt den Datentyp des Parameters 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".
Boolesch
Für einen booleschen Wert.
CURSOR
Für einen -Verweis auf einen zugrunde liegenden -Cursor.
verankerte Datentypen
Gibt ein anderes Objekt an, mit dem der Datentyp definiert 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 globale Variable an Der Datentyp der globalen Variablen wird als Datentyp für parameternameverwendet.
table-name.column-name
Gibt einen Spaltennamen einer vorhandenen Tabelle oder Sicht an. Der Datentyp der Spalte wird als Datentyp für parameternameverwendet.
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 parametername 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 globale Variable mit einem stark typisierten Cursordatentyp
  • Eine 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 typisiert ist, ist der Datentyp von parametername ein nicht benannter Zeilentyp.
array-typname
Gibt den Namen eines benutzerdefinierten Array-Typs an. Wenn array-type-name ohne einen Schemanamen angegeben wird, wird der Arraytyp durch Durchsuchen der Schemata im SQL-Pfad aufgelöst.
Cursortypname
Gibt den Namen eines Cursortyps an. Wenn cursor-typname ohne einen Schemanamen angegeben wird, wird der Cursortyp aufgelöst, indem die Schemas im SQL-Pfad durchsucht werden.
einzigartiger-typname
Gibt den Namen eines einzigartigen Datentyps an. Die Länge, Genauigkeit und Anzahl der Kommastellen des Parameters sind die Länge, Genauigkeit und Anzahl der Kommastellen des Quellentyps des einzigartigen Typs. Ein einzigartiger Typparameter wird als Quellentyp des einzigartigen Datentyps übergeben. Wenn einzigartiger-typname ohne einen Schemanamen angegeben wird, wird der einzigartige Typ durch Durchsuchen der Schemata im SQL-Pfad aufgelöst.
zeilentypname
Gibt den Namen eines benutzerdefinierten Zeilentyps an. Die Felder des Parameters sind die Felder des Zeilentyps. Wenn zeilentypname ohne einen Schemanamen angegeben wird, wird der Zeilentyp aufgelöst, indem die Schemata im SQL-Pfad durchsucht werden.
DEFAULT
Gibt einen Standardwert für den Parameter an Der Standardwert kann eine Konstante, ein Sonderregister, eine globale Variable, ein Ausdruck oder das Schlüsselwort NULL sein. Die Sonderregister, die als Standardwert angegeben werden können, entsprechen denen, die für einen Spaltenstandardwert angegeben werden können (siehe default-clause in der Anweisung CREATE TABLE). Andere Sonderregister können mithilfe eines Ausdrucks als Standardwert angegeben werden.

Der Ausdruck kann ein beliebiger Ausdruck des unter Ausdrückebeschriebenen Typs sein. Wenn kein Standardwert angegeben wird, hat der Parameter keinen Standardwert und das entsprechende Argument kann beim Aufruf der Prozedur nicht übergangen werden. Die maximale Größe des Ausdrucks beträgt 64K Byte.

Der Standardausdruck darf keine SQL-Daten ändern (SQLSTATE 428FL oder SQLSTATE 429BL). Der Ausdruck muss mit dem Parameterdatentyp (SQLSTATE 42821) zuordnungskompatibel sein.

In den folgenden Situationen kann kein Standardwert angegeben werden:
  • Für INOUT-oder OUT-Parameter (SQLSTATE 42601)
  • Für einen Parameter des Typs ARRAY, ROW oder CURSOR (SQLSTATE 429BB)
SPECIFIC spezifischer-name
Gibt einen eindeutigen Namen für die Instanz der zu definierenden Prozedur an. Dieser spezifische Name kann beim Ändern, Löschen oder Kommentieren der Prozedur verwendet werden. Sie kann nie zum Aufrufen der Prozedur verwendet werden. Die nicht qualifizierte Form von spezifischer-name ist eine SQL-Kennung. Das qualifizierte Format ist ein schemaname gefolgt von einem Punkt und einer SQL-Kennung. Der Name, einschließlich des impliziten oder expliziten Qualifikationsmerkmals, darf keine andere Prozedurinstanz angeben, die auf dem Anwendungsserver vorhanden ist; andernfalls wird ein Fehler (SQLSTATE 42710) ausgelöst.

Der spezifischer-name kann mit einem vorhandenen prozedurnamenidentisch sein.

Wird kein Qualifikationsmerkmal angegeben, wird das Qualifikationsmerkmal verwendet, das für prozedurname verwendet wurde. Wenn ein Qualifikationsmerkmal angegeben wird, muss es mit dem expliziten oder impliziten Qualifikationsmerkmal für prozedurnameübereinstimmen, oder es wird ein Fehler (SQLSTATE 42882) ausgelöst.

Wenn spezifischer-name nicht angegeben wird, wird vom Datenbankmanager ein eindeutiger Name generiert. Der eindeutige Name lautet 'SQL' gefolgt von einer Zeichenzeitmarke: 'SQLjjmmtthhmmssxxx'.

Wenn Sie die Prozedur mit dem Befehl GET ROUTINE archivieren möchten, stellen Sie sicher, dass der spezifische Name eine maximale Länge von 18 Zeichen hat.

DYNAMIC RESULT SETS ganzzahl
Gibt die geschätzte Obergrenze der zurückgegebenen Ergebnismengen für die Prozedur an
MODIFIZIERT SQL-DATEN, ENTHÄLT SQL, LIEST SQL-DATEN.
Gibt die Klassifizierung von SQL-Anweisungen an, die von dieser Prozedur oder einer von dieser Prozedur aufgerufenen Routine ausgeführt werden können. Der Datenbankmanager prüft, ob die von der Prozedur abgesetzten SQL-Anweisungen und alle von der Prozedur aufgerufenen Routinen mit dieser Spezifikation konsistent sind.

Informationen zur Klassifizierung der einzelnen Anweisungen finden Sie unter SQL-Anweisungen, die in Routinen und Triggern ausgeführt werden.

Der Standardwert ist MODIFIES SQL DATA.

MODIFIZIERT SQL-DATEN
Gibt an, dass die Prozedur alle SQL-Anweisungen außer Anweisungen ausführen kann, die in Prozeduren nicht unterstützt werden (SQLSTATE 38003 oder 42985).
CONTAINS SQL
Gibt an, dass die Prozedur nur Anweisungen mit einer Datenzugriffsklassifikation von CONTAINS SQL ausführen kann (SQLSTATE 38003 oder 38004 oder 42985).
READS SQL DATA
Gibt an, dass die Prozedur Anweisungen mit einer Datenzugriffsklassifikation von READS SQL DATA oder CONTAINS SQL ausführen kann (SQLSTATE 38002 oder 38003 oder 42985).
Wenn die Klausel BEGIN ATOMIC in einer zusammengesetzten SQL-Prozedur verwendet wird, kann die Prozedur nur erstellt werden, wenn sie als MODIFIES SQL DATA definiert ist.
DETERMINISTIC oder NOT DETERMINISTIC
Diese Klausel gibt an, ob die Prozedur immer dieselben Ergebnisse für bestimmte Argumentwerte (DETERMINISTIC) zurückgibt oder ob die Prozedur von einigen Statuswerten abhängt, die die Ergebnisse beeinflussen (NOT DETERMINISTIC). Das heißt, eine DETERMINISTIC-Prozedur muss immer dasselbe Ergebnis von aufeinanderfolgenden Aufrufen mit identischen Eingaben zurückgeben.

Diese Klausel wirkt sich derzeit nicht auf die Verarbeitung der Prozedur aus.

CALLED ON NULL INPUT
CALLED ON NULL INPUT gilt immer für Prozeduren. Dies bedeutet, dass die Prozedur unabhängig davon aufgerufen wird, ob Argumente null sind. Jeder OUT-oder INOUT-Parameter kann einen Nullwert oder einen normalen Wert (ungleich null) zurückgeben. Die Zuständigkeit für das Testen auf Nullargumentwerte liegt bei der Prozedur.
Commit bei Rückgabe
Gibt an, ob bei der Rückkehr von der Prozedur eine Festschreibung ausgegeben werden soll. Der Standardwert ist NEIN.
NEIN
Wenn die Prozedur zurückkehrt, wird kein Commit ausgegeben.
YES
Ein Commit wird ausgegeben, wenn die Prozedur zurückkehrt, wenn ein positiver SQLCODE von der Anweisung CALL zurückgegeben wird.

Die Festschreibungsoperation umfasst die Arbeit, die vom aufrufenden Anwendungsprozess und der Prozedur ausgeführt wird.

Wenn die Prozedur Ergebnismengen zurückgibt, müssen die Cursor, die den Ergebnismengen zugeordnet sind, als WITH HOLD definiert sein, damit sie nach dem Commit verwendbar sind.

Autonom
Gibt an, dass die Prozedur in einem eigenen autonomen Transaktionsbereich ausgeführt werden soll
INHERIT SPECIAL REGISTERS
Diese optionale Klausel gibt an, dass aktualisierbare Sonderregister in der Prozedur ihre Anfangswerte aus der Umgebung der aufrufenden Anweisung übernehmen. Für eine Routine, die in einem verschachtelten Objekt (z. B. einem Auslöser oder einer Ansicht) aufgerufen wird, werden die Anfangswerte von der Laufzeitumgebung übernommen (nicht von der Objektdefinition übernommen).

Es werden keine Änderungen an den Sonderregistern an den Aufrufenden der Prozedur zurückgegeben.

Nicht aktualisierbare Sonderregister, wie z. B. die Sonderregister für Datum und Uhrzeit, spiegeln eine Eigenschaft der momentan ausgeführten Anweisung wider und werden daher auf ihre Standardwerte gesetzt.

OLD SAVEPOINT LEVEL oder NEW SAVEPOINT LEVEL
Gibt an, ob diese Prozedur eine neue Sicherungspunktebene für Sicherungspunktnamen und -effekte erstellt. OLD SAVEPOINT LEVEL ist das Standardverhalten. Weitere Informationen zu Sicherungspunktebenen finden Sie unter Regeln in SAVEPOINT.
LANGUAGE SQL
Diese Klausel wird verwendet, um anzugeben, dass der Prozedurhauptteil in der SQL-Sprache geschrieben wird.
EXTERNAL ACTION oder NO EXTERNAL ACTION
Gibt an, ob die Prozedur eine Aktion ausführt, die den Status eines Objekts ändert, das nicht vom Datenbankmanager verwaltet wird (EXTERNAL ACTION) oder nicht (NO EXTERNAL ACTION). Der Standardwert ist EXTERNAL ACTION. Wenn NO EXTERNAL ACTION angegeben ist, kann das System bestimmte Optimierungen verwenden, die davon ausgehen, dass die Prozedur keine externen Auswirkungen hat.
PARAMETER-CCSID
Gibt das Schema für Codeumsetzung an, das für alle Zeichenfolgedaten verwendet werden soll, die an die und aus der Prozedur übergeben werden. Wenn die Klausel PARAMETER CCSID nicht angegeben wird, ist der Standardwert PARAMETER CCSID UNICODE für Unicode-Datenbanken und PARAMETER CCSID ASCII für alle anderen Datenbanken.
ASCII
Gibt an, dass Zeichenfolgedaten in der Datenbankcodepage codiert werden. Wenn die Datenbank eine Unicode-Datenbank ist, kann PARAMETER CCSID ASCII nicht angegeben werden (SQLSTATE 56031).
UNICODE
Gibt an, dass Zeichendaten in UTF-8und Grafikdaten in UCS-2vorliegen. Wenn die Datenbank keine Unicode-Datenbank ist, kann PARAMETER CCSID UNICODE nicht angegeben werden (SQLSTATE 56031).
SQL-Prozedurhauptteil
Gibt die SQL-Anweisung an, die der Hauptteil der SQL-Prozedur ist.

Siehe SQL-Prozeduranweisung in der Anweisung Compound-SQL (Compiled) .

Regeln

  • Einschränkungen für autonome Routinen: Autonome Routinen können keine Ergebnismengen zurückgeben und unterstützen die folgenden Datentypen nicht (SQLSTATE 428H2):
    • Benutzerdefinierte Cursortypen
    • Benutzerdefinierte strukturierte Typen
    • XML als IN-, OUT-und INOUT-Parameter
    Sitzungsvariablen von Cursortypen können nicht innerhalb des autonomen Bereichs referenziert werden.
  • 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.
  • Verwendung von Cursor-und Zeilentypen: Eine Prozedur, die einen Cursortyp oder Zeilentyp für einen Parameter verwendet, kann nur aus einer Compound-SQL-Anweisung (kompilierten Anweisung) (SQLSTATE 428H2) aufgerufen werden, mit Ausnahme von Java-Anwendungen, die JDBCverwenden und eine Prozedur mit OUT-Parametern aufrufen können, die einen Cursortyp haben. Der Aufruf von externen Java-Prozeduren wird nicht unterstützt.

Hinweise

  • Die Erstellung einer Prozedur mit einem Schemanamen, der noch nicht vorhanden ist, führt zur impliziten Erstellung dieses Schemas, vorausgesetzt, die Berechtigungs-ID der Anweisung verfügt über die Berechtigung IMPLICIT_SCHEMA. Der Schemaeigner ist SYSIBM. Das Zugriffsrecht CREATEIN für das Schema wird als PUBLIC erteilt.
  • Eine Prozedur, die aus einer zusammengesetzten SQL-Anweisung (Inliniert) heraus aufgerufen wird, wird so ausgeführt, als wäre sie mit der Angabe NEW SAVEPOINT LEVEL erstellt worden, auch wenn OLD SAVEPOINT LEVEL angegeben oder standardmäßig verwendet wurde, als die Prozedur erstellt wurde.
  • Erstellen von Prozeduren, die anfänglich ungültig sind: Wenn ein Objekt, auf das im Prozedurhauptteil verwiesen wird, nicht vorhanden ist oder als ungültig markiert ist oder der definierende Benutzer vorübergehend keine Zugriffsrechte für das Objekt hat und wenn der Datenbankkonfigurationsparameter auto_reval nicht auf DISABLED gesetzt ist, wird die Prozedur trotzdem erfolgreich erstellt. Die Prozedur wird als ungültig markiert und beim nächsten Aufruf erneut validiert.
  • Einstellung des Standardwerts: Parameter einer Prozedur, die mit dem Standardwert definiert sind, werden beim Aufruf der Prozedur auf ihren Standardwert gesetzt, aber nur, wenn beim Aufrufen der Prozedur kein Wert für das entsprechende Argument angegeben oder als DEFAULT angegeben wird.
  • Zugriffsrechte: Der definierende Benutzer einer Prozedur erhält immer das Zugriffsrecht EXECUTE WITH GRANT OPTION für die Prozedur sowie das Recht, die Prozedur zu löschen.
  • Rebinding abhängige Pakete: Jede SQL-Prozedur hat ein abhängiges Paket. Das Paket kann jederzeit durch Ausführen der Prozedur REBIND_ROUTINE_PACKAGE erneut gebunden werden. Durch das explizite erneute Binden des abhängigen Pakets wird eine ungültige Prozedur nicht erneut validiert. Eine ungültige Prozedur sollte mit automatischer Neuprüfung oder durch explizite Ausführung der Prozedur ADMIN_REVALIDATE_DB_OBJECTS erneut geprüft werden. Bei der erneuten Überprüfung der Prozedur wird das abhängige Paket automatisch erneut gebunden.
  • Syntaxalternativen: Die folgenden Syntaxalternativen werden aus Gründen der Kompatibilität mit früheren Versionen von Db2® und mit anderen Datenbankprodukten unterstützt. Diese Alternativen sind vom Standard abweichend und sollten nicht verwendet werden.
    • RESULT SETS kann anstelle von DYNAMIC RESULT SETS angegeben werden.
    • NULL CALL kann anstelle von CALLED ON NULL INPUT angegeben werden.
    Die folgende Syntax wird als Standardverhalten akzeptiert:
    • ASUTIME NO LIMIT
    • KEINE SAMMLUNGS-ID
    • STAY RESIDENT NO

Beispiel

Erstellen Sie eine SQL-Prozedur, die das gemittelte Mitarbeitergehalt zurückgibt. Dabei wird eine Ergebnismenge zurückgegeben, die Name, Position und Gehalt aller Mitarbeiter enthält, die mehr als das mittlere Gehalt verdienen.
   CREATE PROCEDURE MEDIAN_RESULT_SET (OUT medianSalary DOUBLE)
     RESULT SETS 1
     LANGUAGE SQL
   BEGIN
     DECLARE v_numRecords INT DEFAULT 1;
     DECLARE v_counter INT DEFAULT 0;

     DECLARE c1 CURSOR FOR
       SELECT CAST(salary AS DOUBLE)
         FROM staff
         ORDER BY salary;
     DECLARE c2 CURSOR WITH RETURN FOR
       SELECT name, job, CAST(salary AS INTEGER)
         FROM staff
         WHERE salary > medianSalary
         ORDER BY salary;

     DECLARE EXIT HANDLER FOR NOT FOUND
       SET medianSalary = 6666;

     SET medianSalary = 0;
     SELECT COUNT(*) INTO v_numRecords
       FROM STAFF;
     OPEN c1;
     WHILE v_counter < (v_numRecords / 2 + 1)
     DO
       FETCH c1 INTO medianSalary;
       SET v_counter = v_counter + 1;
     END WHILE;
     CLOSE c1;
     OPEN c2;
   END