Erstellt eine benutzerdefinierte SQL-Funktion in der Datenbank.
CREATE [ OR REPLACE | TEMPORARY ] FUNCTION [ owner.]function-name ( [ parameter, ... ] ) RETURNS data-type [ SQL SECURITY { INVOKER | DEFINER } ] [ ON EXCEPTION RESUME ] [ [ NOT ] DETERMINISTIC ] compound-statement | AS tsql-compound-statement
parameter : [ IN ] parameter-name data-type [ DEFAULT expression ]
tsql-compound-statement : sql-statement sql-statement ...
Parameternamen müssen den Regeln für Datenbankbezeichner folgen. Sie müssen einen gültigen SQL-Datentyp umfassen und das Schlüsselwort IN kann vorangestellt werden. Dieses Präfix weist darauf hin, dass das Argument ein Ausdruck ist, welcher der Funktion einen Wert zur Verfügung stellt. Allerdings sind Funktionsparameter standardmäßig IN.
Wenn Funktionen ausgeführt werden, müssen nicht alle Parameter angegeben werden. Wenn in der CREATE FUNCTION-Anweisung ein Standardwert bereitgestellt wird, werden den fehlenden Parametern die Standardwerte zugeordnet. Falls kein Argument vom Aufrufer angegeben wurde und kein Standardwert gesetzt ist, wird ein Fehler ausgegeben.
OR REPLACE-Klausel Wenn Sie CREATE OR REPLACE FUNCTION angeben, wird eine neue Funktion erstellt oder eine bestehende Funktion mit demselben Namen ersetzt. Beim Ersetzen einer Funktion wird die Definition der Funktion geändert, aber die bestehenden Berechtigungen werden beibehalten.
Sie können die OR REPLACE-Klausel nicht mit temporären Funktionen verwenden.
TEMPORARY-Schlüsselwort Die Angabe von CREATE TEMPORARY FUNCTION bedeutet, dass die Funktion lediglich für die Verbindung sichtbar ist, die sie erstellt hat, und dass sie automatisch gelöscht wird, wenn die Verbindung beendet wird. Temporäre Funktionen können auch explizit gelöscht werden. Sie können kein ALTER, GRANT oder REVOKE für sie ausführen, und im Gegensatz zu anderen Funktionen werden temporäre Funktionen nicht im Katalog oder Transaktionslog aufgezeichnet.
Temporäre Funktionen werden mit den Berechtigungen ihres Erstellers (aktueller Benutzer) oder eines angegebenen Eigentümers ausgeführt. Sie können unter folgenden Voraussetzungen einen Eigentümer für eine temporäre Funktion festlegen:
Wenn die temporäre Funktion in einer permanenten gespeicherten Prozedur erstellt wird.
Wenn der Eigentümer der temporären Funktion mit dem der permanenten gespeicherten Prozedur identisch ist.
Um den Eigentümer einer temporären Funktion zu löschen, müssen Sie erst die temporäre Funktion löschen.
Temporäre Funktionen können erstellt und gelöscht werden, wenn eine Verbindung mit einer schreibgeschützten Datenbank besteht.
Sie können die OR REPLACE-Klausel nicht mit temporären Funktionen verwenden.
RETURNS-Klausel Verwenden Sie die Klausel RETURNS, um den Datentyp für das Ergebnis der Funktion anzugeben.
SQL SECURITY-Klausel Die SQL SECURITY-Klausel legt fest, ob die Funktion als INVOKER (der Benutzer, der die Funktion aufruft) oder als DEFINER (der Benutzer, dem die Funktion gehört) aufgerufen wird. Standardwert ist DEFINER.
ON EXCEPTION RESUME-Klausel Fehlerbehandlung wie in Transact-SQL verwenden.
[ NOT ] DETERMINISTIC-Klausel Verwenden Sie diese Klausel, um anzugeben, ob Funktionen deterministisch oder nicht deterministisch sind. Wenn diese Klausel weggelassen wird, gilt das deterministische Verhalten der Funktion als nicht angegeben (Standard).
Wenn eine Funktion als DETERMINISTIC deklariert wird, muss Sie jedes Mal, wenn sie mit denselben Parametern aufgerufen wird, denselben Wert zurückgeben.
Wenn eine Funktion als NOT DETERMINISTIC deklariert wird, garantiert sie nicht, dass bei identischen Parametern ein identischer Wert zurückgegeben wird. Eine Funktion, die als NOT DETERMINISTIC deklariert ist, wird bei jedem Aufruf in einer Abfrage neu berechnet. Diese Klausel muss verwendet werden, wenn bekannt ist, dass das Ergebnis der Funktion mit gegebenen Parametern unterschiedlich ausfallen kann.
Außerdem sollten Funktionen mit Nebenwirkungen wie der Änderung von Basisdaten als NOT DETERMINISTIC deklariert werden. Beispiel: Eine Funktion, die Primärschlüsselwerte generiert und in einer INSERT…SELECT-Anweisung verwendet wird, muss als NOT DETERMINISTIC deklariert werden:
CREATE FUNCTION keygen( increment INTEGER ) RETURNS INTEGER NOT DETERMINISTIC BEGIN DECLARE keyval INTEGER; UPDATE counter SET x = x + increment; SELECT counter.x INTO keyval FROM counter; RETURN keyval END INSERT INTO new_table SELECT keygen(1), ... FROM old_table; |
Funktionen können als DETERMINISTIC deklariert werden, wenn sie stets denselben Wert für gegebene Eingabeparameter zurückgeben.
compound-statement Eine Gruppe von SQL-Anweisungen in BEGIN und END, getrennt durch Semikola.
tsql-compound-statement Ein Batch von Transact-SQL-Anweisungen.
Die CREATE FUNCTION-Anweisung erstellt eine Funktion in der Datenbank. Eine Funktion kann für einen anderen Benutzer erstellt werden, indem der Name eines Eigentümers angegeben wird. Eine Funktion kann, entsprechend den Berechtigungen, auf die gleiche Weise wie andere Nicht-Aggregatfunktionen verwendet werden.
Wenn SQL SECURITY INVOKER angegeben ist, wird mehr Speicher verwendet, weil für jeden Benutzer, der die Prozedur aufruft, ein Vermerk erfolgen muss. Außerdem erfolgt bei SQL SECURITY INVOKER auch eine Namensauflösung als Aufrufer. Sie sollten daher mit Umsicht vorgehen und alle Objektnamen (Tabellen, Prozeduren, etc.) mit ihrem richtigen Eigentümer qualifizieren.
Alle Funktionen werden als deterministisch behandelt, sofern sie nicht als NOT DETERMINISTIC deklariert sind. Deterministische Funktionen geben für die gleichen Parameter ein konsistentes Ergebnis zurück und weisen keine Nebenwirkungen auf. Das heißt, der Datenbankserver nimmt an, dass zwei aufeinander folgende Aufrufe derselben Funktion mit denselben Parametern das gleiche Ergebnis zurückgeben und keine unerwünschten Nebeneffekte auf die Semantik der Abfrage haben.
Wenn eine Funktion eine Ergebnismenge zurückgibt, kann sie nicht zusätzlich Ausgabeparameter setzen oder einen Rückgabewert zurückgeben.
Sie müssen über RESOURCE-Datenbankberechtigungen verfügen, es sei denn, Sie erstellen eine temporäre Funktion.
Externe Funktionen einschließlich Java-Funktionen erfordern die DBA-Berechtigung.
Automatisches Festschreiben, auch für temporäre Funktionen.
SQL/2008 CREATE FUNCTION ist eine Kernfunktion des SQL/2008-Standards, obwohl einige der in SQL Anywhere unterstützten Komponenten optionale SQL-Sprachenfunktionen sind. Zu diesen Funktionen gehören folgende:
Die SQL SECURITY-Klausel ist die optionale Sprachenfunktion T324.
Die Möglichkeit zum Übergeben eines LONG VARCHAR-, LONG NVARCHAR- oder LONG BINARY-Werts an eine SQL-Funktion ist Sprachenfunktion T041.
Die Möglichkeit, ein Schema-Objekt innerhalb einer SQL-Funktion mit Anweisungen wie CREATE TABLE und DROP TRIGGER zu erstellen oder zu ändern, ist Sprachenfunktion T651.
Die Möglichkeit zum Verwenden einer Dynamic-SQL-Anweisung innerhalb einer SQL-Funktion, einschließlich der Anweisungen CONNECT, EXECUTE IMMEDIATE, PREPARE und DESCRIBE, ist Sprachenfunktion T652.
Einige Klauseln der CREATE FUNCTION-Anweisung sind Erweiterungen des Herstellers. Es handelt sich dabei um die folgenden:
Die TEMPORARY-Klausel.
Die ON EXCEPTION RESUME-Klausel.
Die optionale DEFAULT-Klausel für einen bestimmten Routinenparameter.
Die Angabe einer Transact-SQL-Funktion mit der AS-Klausel.
Die optionale OR REPLACE-Klausel.
Transact-SQL CREATE FUNCTION wird von Adaptive Server Enterprise unterstützt. Adaptive Server Enterprise unterstützt nicht das optionale Schlüsselwort IN für Funktionsparameter.
Die folgende Funktion verkettet die Zeichenfolge 'Vorname' mit der Zeichenfolge 'Nachname'.
CREATE FUNCTION fullname( firstname CHAR(30), lastname CHAR(30) ) RETURNS CHAR(61) BEGIN DECLARE name CHAR(61); SET name = firstname || ' ' || lastname; RETURN (name); END; |
Im folgenden Beispiel wird die Funktion fullname ersetzt, die im ersten Beispiel erstellt wurde. Nachdem die Funktion ersetzt
wurde, wird die lokale Variable name
entfernt:
CREATE OR REPLACE FUNCTION fullname( firstname CHAR(30), lastname CHAR(30) ) RETURNS CHAR(61) BEGIN RETURN ( firstname || ' ' || lastname ); END; |
Die folgenden Beispiele veranschaulichen die Verwendung der fullname-Funktion.
Rückgabe eines vollständigen Namens aus zwei angegebenen Zeichenfolgen:
SELECT fullname ( 'joe', 'smith' ); |
fullname('joe', 'smith') |
---|
joe smith |
Namensliste aller Mitarbeiter:
SELECT fullname ( GivenName, Surname ) FROM Employees; |
fullname (GivenName, Surname) |
---|
Fran Whitney |
Matthew Cobb |
Philip Chin |
Julie Jordan |
... |
Die folgende Funktion benutzt Transact-SQL-Syntax:
CREATE FUNCTION DoubleIt( @Input INT ) RETURNS INT AS BEGIN DECLARE @Result INT SELECT @Result = @Input * 2 RETURN @Result END; |
Die Anweisung SELECT DoubleIt( 5 )
gibt den Wert 10
zurück.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |