CREATE PROCEDURE erzeugt eine Prozedur und speichert ihre Definition in der Datenbank..
Prozeduren und ihre Verwendung in SESAM/SQL sind detailliert im Kapitel „Routinen" beschrieben.
Jede Routine, die in der Prozedur aufgerufen wird, muss bereits existieren. Geschachtelte Aufrufe von Routinen sind damit möglich, rekursive Aufrufe aber nicht.
Der aktuelle Berechtigungsschlüssel muss Eigentümer des Schemas sein, zu dem die Prozedur gehört. Er muss auch für alle Tabellen und Spalten, die in der Prozedur angesprochen werden, diejenigen Privilegien besitzen, die benötigt werden, um die in der Prozedur enthaltenen DML-Anweisungen ausführen zu können.
Der aktuelle Berechtigungsschlüssel muss das EXECUTE-Privileg für jede in der Prozedur aufgerufene Routine besitzen. Zusätzlich muss er für alle Tabellen und Spalten, die in der Prozedur angesprochen werden, diejenigen Privilegien besitzen, die benötigt werden, um die in der Prozedur enthaltenen DML-Anweisungen ausführen zu können.
Der aktuelle Berechtigungsschlüssel erhält automatisch das EXECUTE-Privileg für die erzeugte Prozedur. Hat er für die betreffenden Privilegien sogar die Berechtigung, diese weitergeben zu dürfen, dann darf er auch das EXECUTE-Privileg an andere Berechtigungsschlüssel weitergegeben.
Die Prozedur und die Objekte, die in der Prozedur angesprochen werden, müssen zur gleichen Datenbank gehören. Die Namen dieser Objekte werden gegebenenfalls durch den Datenbank- und Schemanamen der Prozedur ergänzt.
CREATE PROCEDURE
prozedur ([
prozedurparameter_definition [,
prozedurparameter_definition ] ...])
{ MODIFIES SQL DATA | READS SQL DATA | CONTAINS SQL }
{
routine_sql_anweisung |
compound_anweisung }
prozedur ::=
routine
prozedurparameter_definition ::= [IN | OUT | INOUT]
routinenparameter datentyp
prozedur
Name für die Prozedur (maximale Länge: 31 Zeichen). Der einfache Prozedurname muss innerhalb der Routinen-Namen des Schemas eindeutig sein. Er kann durch einen Datenbank- und Schemanamen qualifiziert werden.
Wenn die CREATE PROCEDURE-Anweisung innerhalb einer CREATE SCHEMA-Anweisung angegeben wird, dann darf der Prozedurname nur mit den Datenbank- und Schemanamen der CREATE SCHEMA-Anweisung qualifiziert werden.
([
prozedurparameter_definition [{,
prozedurparameter_definition }...]])
Liste der Prozedurparameter. Die Anzahl der Prozedurparameter ist beliebig. Sie wird nur von der maximalen Anweisungslänge begrenzt. Wenn kein Parameter definiert wird, dann besteht die Liste nur aus den runden Klammern.
prozedurparameter_definition
Definition eines Prozedurparameters.
Prozedurparameter besitzen keine Indikatorvariable.
IN: Der Prozedurparameter ist ein Eingabeparameter.
OUT: Der Prozedurparameter ist ein Ausgabeparameter.
INOUT: Der Prozedurparameter ist Ein- und Ausgabeparameter.
routinenparameter
Name des Prozedurparameters. Die Namen der Prozedurparameter müssen sich voneinander unterscheiden.
datentyp
Datentyp des Prozedurparameters.
Es sind nur einfache Prozedurparameter erlaubt.
dimension darf nicht angegeben werden.
MODIFIES SQL DATA
Die Prozedur kann SQL-Anweisungen zum Ändern von Daten enthalten.
READS SQL DATA
Die Prozedur kann SQL-Anweisungen zum Lesen von Daten enthalten, jedoch keine SQL-Anweisungen zum Ändern von Daten. Diese Aussage wird geprüft. Im Fehlerfall wird die Anweisung mit SQLSTATE abgewiesen.
CONTAINS SQL
Die Prozedur enthält weder SQL-Anweisungen zum Lesen von Daten noch zum Ändern von Daten. Diese Aussage wird geprüft. Im Fehlerfall wird die Anweisung mit SQLSTATE abgewiesen.
Aufgerufene Routinen dieser Prozedur dürfen die Angaben MODIFIES SQL DATA und READS SQL DATA nicht enthalten.
routine_sql_anweisung
Eine Prozedur enthält genau eine atomare oder nicht-atomare SQL-Anweisung. Nicht-atomare SQL-Anweisungen in SESAM/SQL sind COMPOUND (ohne Angabe von ATOMIC), CASE, FOR, IF, LOOP, REPEAT und WHILE. Sie können weitere atomare oder nicht-atomare SQL-Anweisungen enthalten. Atomare SQL-Anweisungen sind die weiteren, in einer Routine zulässigen SQL-Anweisungen.
Vor der Durchführung einer SQL-Anweisung werden keine Privilegien geprüft. Eine SQL-Anweisung in einer Prozedur darf auf die Parameter der Prozedur 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 mit Ausnahme von RETURN dürfen verwendet werden.
compound_anweisung
COMPOUND-Anweisung, die mehrere SQL-Anweisungen enthält und dafür ggf. gemeinsame lokale Daten, Cursor und Fehler-Routinen definiert, siehe Abschnitt „COMPOUND - SQL-Anweisungen in gemeinsamem Kontext ausführen".
Randbedingungen
SESAM/SQL bietet zur Steuerung von Routinen die SQL-Anweisungen COMPOUND, CASE, FOR, IF, ITERATE, LEAVE, LOOP, REPEAT, SET und WHILE an. Diese SQL-Anweisungen werden auch als Kontrollanweisungen bezeichnet.
Diagnoseinformationen erhalten Sie in Routinen mit den Diagnoseanweisungen GET DIAGNOSTICS, SIGNAL und RESIGNAL.
In SESAM/SQL sind geschachtelte Aufrufe von Routinen erlaubt. Die CALL-Anweisung gehört deshalb zu den in einer Routine erlaubten Anweisungen.
Eine Routine darf keine SQL-Anweisungen zur Transaktionsverwaltung (siehe "SQL-Anweisungen zur Transaktionsverwaltung") enthalten. Auf lokale Cursor kann deshalb nicht transaktionsübergreifend zugegriffen werden. STORE- oder RESTORE-Anweisungen gehören nicht zu den in einer Routine erlaubten Anweisungen; sie sind in einer Routine nicht sinnvoll.
Eine Routine darf keine dynamisch formulierten SQL-Anweisungen oder Cursorbeschreibungen enthalten, siehe Abschnitt „Dynamische SQL".
Eine Routine kann in einer dynamisch formulierten SQL-Anweisung aufgerufen werden.
Wenn eine Prozedur Parameter vom Typ OUT oder INOUT enthält, dann müssen in einer dynamisch formulierten CALL-Anweisung die korrespondierenden Argumente in Form von Platzhaltern angegeben werden.
Beispiel
Die folgende Prozedur GetCurrentYear
liefert das aktuelle Jahr als Zahl. Sie enthält keine SQL-Anweisungen zum Lesen oder Ändern von Daten.
CREATE PROCEDURE ProcSchema.GetCurrentYear (OUT current_year INTEGER) CONTAINS SQL SET current_year = EXTRACT (YEAR FROM CURRENT_DATE)
Weitere Beispiele finden Sie im Kapitel „Routinen" und in der Beispieldatenbankvon SESAM/SQL (siehe „ Basishandbuch“).
Siehe auch
CALL, DROP PROCEDURE, COMPOUND, CASE, FOR, IF, ITERATE, LEAVE, LOOP, REPEAT, SET, WHILE, SELECT, INSERT, UPDATE, DELETE, MERGE, OPEN, FETCH, UPDATE, DELETE, CLOSE, GET DIAGNOSTICS, SIGNAL, RESIGNAL