Erstellt eine Schnittstelle zu einer nativen oder externen Funktion.
CREATE [ OR REPLACE ] FUNCTION [ owner.]function-name ( [ parameter, ... ] ) [ SQL SECURITY { INVOKER | DEFINER } ] RETURNS data-type [ [ NOT ] DETERMINISTIC ] { EXTERNAL NAME 'native-call' | EXTERNAL NAME 'c-call' LANGUAGE { C_ESQL32 | C_ESQL64 | C_ODBC32 | C_ODBC64 } | EXTERNAL NAME 'clr-call' LANGUAGE CLR | EXTERNAL NAME 'perl-call' LANGUAGE PERL | EXTERNAL NAME 'php-call' LANGUAGE PHP | EXTERNAL NAME 'java-call' LANGUAGE JAVA }
parameter : [ IN ] parameter-name data-type [ DEFAULT expression ]
native-call : [ operating-system:]function-name@library
result-column : column-name data-type
c-call : [ operating-system:]function-name@library; ...
clr-call : dll-name::function-name( param-type-1[, ... ] )
perl-call : <file=perl-file> $sa_perl_return = perl-subroutine( $sa_perl_arg0[, ... ] )
php-call : <file=php-file> print php-func( $argv[1][, ... ] )
java-call : [package-name.]class-name.method-name method-signature
operating-system :
Unix
method-signature : ( [ field-descriptor, ... ] ) return-descriptor
field-descriptor und return-descriptor : { Z | B | S | I | J | F | D | C | V | [descriptor | Lclass-name; }
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 OR REPLACE angeben, wird eine neue Funktion erstellt oder eine bestehende Funktion mit demselben Namen ersetzt. Diese Klausel ändert die Definition der Funktion, lässt aber vorhandene Privilegien unberührt. 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. Bei externen Aufrufen richtet diese Klausel den Eigentümerkontext für nicht qualifizierte Objektreferenzen in der externen Umgebung ein.
Wenn SQL SECURITY INVOKER angegeben ist, wird mehr Speicher verwendet, weil für jeden Benutzer, der die Funktion 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. Beispiel: Der Benutzer user1 erstellt die folgende Funktion:
CREATE FUNCTION user1.myFunc() RETURNS INT SQL SECURITY INVOKER BEGIN DECLARE res INT; SELECT COUNT(*) INTO res FROM table1; RETURN res; END; |
Wenn der Benutzer user2 versucht, diese Funktion auszuführen und die Tabelle user2.table1 nicht existiert, kommt es zu einem Tabellensuchfehler. Wenn eine Tabelle user2.table1 existiert, wird diese Tabelle anstelle der beabsichtigten user1.table1 verwendet. Um dies zu verhindern, qualifizieren Sie die Tabellenreferenz in der Anweisung (user1.table1 anstelle von table1).
[ 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.
EXTERNAL NAME native-call-Klausel
native-call : [operating-system:]function-name@library; ...
operating-system : Unix
Die Klausel EXTERNAL NAME wird für TEMPORARY-Funktionen nicht unterstützt.
Der library-Name kann eine Dateierweiterung enthalten. In der Regel handelt es sich um .dll unter Windows und .so unter Unix. Wenn keine Dateierweiterung angegeben ist, hängt die Software die plattformspezifische Dateierweiterung für Bibliotheken an. Beispiel:
CREATE FUNCTION mystring( IN instr LONG VARCHAR ) RETURNS LONG VARCHAR EXTERNAL NAME 'mystring@mylib.dll;Unix:mystring@mylib.so'; |
Eine einfachere Methode, die oben genannte EXTERNAL NAME-Klausel mit plattformspezifischen Standardwerten zu schreiben, lautet wie folgt:
CREATE FUNCTION mystring( IN instr LONG VARCHAR ) RETURNS LONG VARCHAR EXTERNAL NAME 'mystring@mylib'; |
Nach ihrem Aufruf wird die Bibliothek, die die Funktion enthält, in den Adressraum des Datenbankservers geladen. Die native Funktion wird als Teil des Servers ausgeführt. In diesem Fall wird, falls die Funktion einen Fehler verursacht, der Datenbankserver beendet. Aus diesem Grund wird empfohlen, Funktionen in einer externen Umgebung mit dem LANGUAGE-Attribut zu laden und auszuführen. Wenn eine Funktion einen Fehler in einer externen Umgebung verursacht, läuft der Datenbankserver weiter.
EXTERNAL NAME c-call LANGUAGE {C_ESQL32 | C_ESQL64 | C_ODBC32 | C_ODBC64 }-Klausel Um eine kompilierte native C-Funktion in einer externen Umgebung statt im Datenbankserver aufzurufen, wird die gespeicherte Prozedur oder Funktion mit der Klausel EXTERNAL NAME definiert, gefolgt vom Attribut LANGUAGE, das C_ESQL32, C_ESQL64, C_ODBC32 oder C_ODBC64 angibt.
Wenn das LANGUAGE-Attribut angegeben ist, wird die Bibliothek, die die Funktion enthält, von einem externen Prozess geladen und die externe Funktion wird als Teil dieses externen Prozesses ausgeführt. In diesem Fall läuft der Datenbankserver weiter, falls die Funktion einen Fehler verursacht.
CREATE FUNCTION ODBCinsert( IN ProductName CHAR(30), IN ProductDescription CHAR(50) ) RETURNS INT EXTERNAL NAME 'ODBCexternalInsert@extodbc.dll' LANGUAGE C_ODBC32; |
EXTERNAL NAME clr-call LANGUAGE CLR-Klausel Um eine .NET-Funktion in einer externen Umgebung aufzurufen, wird die Funktionsschnittstelle mit einer EXTERNAL NAME-Klausel definiert, auf die das LANGUAGE CLR-Attribut folgt.
Eine gespeicherte CLR-Prozedur oder -Funktion verhält sich wie eine gespeicherte SQL-Prozedur oder -Funktion, abgesehen davon, dass der Code für die Prozedur oder Funktion in einer .NET-Sprache wie C# oder Visual Basic geschrieben ist und die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. innerhalb eines separaten .NET-Programms).
CREATE FUNCTION clr_interface( IN p1 INT, IN p2 UNSIGNED SMALLINT, IN p3 LONG VARCHAR) RETURNS INT EXTERNAL NAME 'CLRlib.dll::CLRproc.Run( int, ushort, string )' LANGUAGE CLR; |
EXTERNAL NAME perl-call LANGUAGE PERL-Klausel Um eine Perl-Funktion in einer externen Umgebung aufzurufen, wird die Funktionsschnittstelle mit einer EXTERNAL NAME-Klausel definiert, auf die das LANGUAGE PERL-Attribut folgt.
Eine gespeicherte Perl-Prozedur oder Funktion verhält sich wie eine gespeicherte SQL-Prozedur oder Funktion, abgesehen davon, dass der Code für die Prozedur oder Funktion in Perl geschrieben ist und die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. innerhalb einer Perl-Programminstanz).
CREATE FUNCTION PerlWriteToConsole( IN str LONG VARCHAR) RETURNS INT EXTERNAL NAME '<file=PerlConsoleExample> WriteToServerConsole( $sa_perl_arg0 )' LANGUAGE PERL; |
EXTERNAL NAME php-call LANGUAGE PHP-Klausel Um eine PHP-Funktion in einer externen Umgebung aufzurufen, wird die Funktionsschnittstelle mit einer EXTERNAL NAME-Klausel definiert, auf die das LANGUAGE PHP-Attribut folgt.
Eine gespeicherte PHP-Prozedur oder -Funktion verhält sich wie eine gespeicherte SQL-Prozedur oder Funktion, abgesehen davon, dass der Code für die Prozedur oder Funktion in PHP geschrieben ist und die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. innerhalb einer PHP-Programminstanz).
CREATE FUNCTION PHPPopulateTable() RETURNS INT EXTERNAL NAME '<file=ServerSidePHPExample> ServerSidePHPSub()' LANGUAGE PHP; |
EXTERNAL NAME 'java-call' LANGUAGE JAVA-Klausel Um eine Java-Methode in einer externen Umgebung aufzurufen, wird die Funktionsschnittstelle mit einer EXTERNAL NAME-Klausel definiert, auf die das LANGUAGE JAVA-Attribut folgt.
Eine gespeicherte Prozedur oder Funktion über die Java-Schnittstelle verhält sich wie eine gespeicherte SQL-Prozedur oder Funktion, abgesehen davon, dass der Code für die Prozedur oder Funktion in Java geschrieben ist und die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. in einer Java VM).
CREATE FUNCTION HelloDemo( IN name LONG VARCHAR ) RETURNS INT EXTERNAL NAME 'Hello.main([Ljava/lang/String;)V' LANGUAGE JAVA; |
Die Deskriptoren für Argumente und Rückgabewerte von Java-Methoden haben die folgende Bedeutung:
Feldtyp | Java-Datentyp |
---|---|
B | byte |
C | char |
D | double |
F | float |
I | int |
J | long |
L class-name; | Eine Instanz der Klasse class-name. Die Klasse muss voll qualifiziert sein und alle Punkte im Namen müssen durch das Zeichen / ersetzt werden. Zum Beispiel, java/lang/String. |
S | short |
V | void |
Z | Boolescher Wert |
[ | Verwenden Sie jeweils eine für jede Array-Dimension. |
Die CREATE FUNCTION-Anweisung erstellt eine Funktion in der Datenbank. Sie können Funktionen für andere Benutzer erstellen, indem Sie einen Eigentümer angeben. Eine Funktion wird als Teil eines SQL-Ausdrucks aufgerufen.
Bei der Referenzierung einer temporären Tabelle durch mehrere Funktionen kann ein Problem entstehen, wenn die Definitionen der temporären Tabelle nicht konsistent sind und Anweisungen, die die Tabelle referenzieren, im Cache abgelegt sind.
Wenn Sie externe Funktionen erstellen möchten, deren Eigentümer Sie sind, müssen Sie die Systemprivilegien CREATE PROCEDURE und CREATE EXTERNAL REFERENCE haben.
Wenn Sie Sie externe Funktionen erstellen möchten, deren Eigentümer andere Benutzer sind, benötigen Sie das CREATE ANY PROCEDURE-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg sowie das CREATE EXTERNAL REFERENCE-Systemprivileg.
Zum Erstellen von temporären Funktionen ist kein Privileg erforderlich.
Automatisches Festschreiben (Autocommit).
SQL/2008 CREATE FUNCTION für eine externe Sprachenumgebung ist eine Kernfunktion des SQL/2008-Standards, obwohl einige der in SQL Anywhere unterstützten Komponenten optionale SQL/2008-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 Unterstützung für LANGUAGE JAVA ist die optionale SQL/2008-Sprachenfunktion J621.
Die Möglichkeit, ein Schema-Objekt innerhalb einer externen Funktion mit Anweisungen wie CREATE TABLE und DROP TRIGGER zu erstellen oder zu ändern, ist Sprachenfunktion T653.
Die Möglichkeit zum Verwenden einer Dynamic-SQL-Anweisung innerhalb einer externen Funktion, einschließlich der Anweisungen CONNECT, EXECUTE IMMEDIATE, PREPARE und DESCRIBE, ist Sprachenfunktion T654.
Einige Klauseln der CREATE FUNCTION-Anweisung sind Erweiterungen des Herstellers. Es handelt sich dabei um die Folgenden:
Die Unterstützung für C_ESQL32, C_ESQL64, C_ODBC32, C_ODBC64, CLR, PERL und PHP in der LANGUAGES-Klausel ist eine Erweiterung des Herstellers.
Das Format von external-call wird durch die Implementierung festgelegt.
Die optionale DEFAULT-Klausel für einen bestimmten Routinenparameter ist eine Erweiterung des Herstellers.
Die optionale OR REPLACE-Klausel ist eine Erweiterung des Herstellers.
Transact-SQL CREATE FUNCTION für eine externe Routine wird von Adaptive Server Enterprise unterstützt. Adaptive Server Enterprise unterstützt nur LANGUAGE JAVA als externe Umgebung (SQL/2008-Sprachenfunktion J621) für eine externe Funktion.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |