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
- 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
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:
Die zweite Anweisung schlägt fehl, da die Anzahl der Parameter in der Prozedur gleich ist, auch wenn die Datentypen nicht übereinstimmen.CREATE PROCEDURE PART (IN NUMBER INT, OUT PART_NAME CHAR(35)) ... CREATE PROCEDURE PART (IN COST DECIMAL(5,3), OUT COUNT INT) ...- 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.
- 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ücke
beschriebenen 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).
- 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
inSAVEPOINT
. - 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
- 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
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