CREATE FUNCTION erzeugt eine UDF und speichert ihre Definition in der Datenbank.
UDFs und ihre Verwendung in SESAM/SQL sind detailliert im Kapitel „Routinen" beschrieben.
Jede Routine, die in der UDF 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 UDF gehört. Er muss auch für alle Tabellen und Spalten, die in der UDF angesprochen werden, diejenigen Privilegien besitzen, die benötigt werden, um die in der UDF enthaltenen DML-Anweisungen ausführen zu können.
Der aktuelle Berechtigungsschlüssel muss das EXECUTE-Privileg für die in der UDF direkt aufgerufenen Routine besitzen. Zusätzlich muss er für alle Tabellen und Spalten, die in der UDF angesprochen werden, diejenigen Privilegien besitzen, die benötigt werden, um die in der Routine enthaltenen DML-Anweisungen ausführen zu können.
Der aktuelle Berechtigungsschlüssel erhält automatisch das EXECUTE-Privileg für die erzeugte UDF. 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 UDF und die Objekte, die in der UDF angesprochen werden, müssen zur gleichen Datenbank gehören. Die Namen dieser Objekte werden gegebenenfalls durch den Datenbank und Schemanamen der UDF ergänzt.
CREATE FUNCTION
udf ([
udf_parameter_definition [,
udf_parameter_definition ]...])
RETURNS
datentyp
{ READS SQL DATA | CONTAINS SQL }
{
routine_sql_anweisung |
compound_anweisung }
udf ::=
routine
udf_parameter_definition ::= [IN]
routinenparameter datentyp
udf
Name für die UDF (maximale Länge: 31 Zeichen). Der einfache Name der UDF muss innerhalb der Routinen-Namen des Schemas eindeutig sein. Er kann durch einen Datenbank- und Schemanamen qualifiziert werden.
Wenn die CREATE FUNCTION-Anweisung innerhalb einer CREATE SCHEMA-Anweisung angegeben wird, dann darf der UDF-Name nur mit den Datenbank- und Schemanamen der CREATE SCHEMA-Anweisung qualifiziert werden.
([
udf_parameter_definition [{,
udf_parameter_definition }...]])
Liste der UDF-Aufrufparameter. Die Anzahl der UDF-Aufrufparameter 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.
udf_parameter_definition
Definition eines UDF-Aufrufparameters.
UDF-Aufrufparameter besitzen keine Indikatorvariable.
routinenparameter
Name des UDF-Aufrufparameters. Die Namen der UDF-Aufrufparameter müssen sich voneinander unterscheiden.
datentyp
Datentyp des UDF-Aufrufparameters.
Es sind nur einfache UDF-Aufrufparameter erlaubt.
dimension darf nicht angegeben werden.
RETURNS datentyp
Datentyp des UDF-Rückgabewertes.
Es sind nur einfache UDF-Rückgabewerte erlaubt.
dimension darf nicht angegeben werden.
READS SQL DATA
Die UDF 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 UDF 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 UDF enthält genau eine nicht-atomare SQL-Anweisung oder genau eine RETURN-Anweisung. Die nicht-atomare SQL-Anweisung muss mindestens eine RETURN-Anweisung enthalten.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 UDF darf auf die Parameter der UDF 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 der SQL-Anweisungen zum Ändern von Daten (INSERT, UP-DATE, MERGE, DELETE) 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 „COM-POUND - 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 UDF 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 UDF CREATE FUNCTION GetCurrentYear (IN "TIME" TIMESTAMP(3)) RETURNS DECIMAL(4) CONTAINS SQL RETURN EXTRACT (YEAR FROM "TIME") Weitere Beispiele finden Sie im Kapitel „Routinen" und in der Beispieldatenbank |
Siehe auch
DROP FUNCTION, COMPOUND, CASE, FOR, IF, ITERATE, LEAVE, LOOP, REPEAT, SET, WHILE, CALL, RETURN, SELECT, INSERT, OPEN, FETCH, CLOSE, GET DIAGNOSTICS, SIGNAL, RESIGNAL