Verwenden Sie diese Anweisung, um eine Schnittstelle zu einer nativen oder externen Funktion zu erstellen. Hinweise zum Erstellen einer benutzerdefinierten SQL-Funktion finden Sie unter CREATE FUNCTION-Anweisung.
CREATE [ OR REPLACE ] FUNCTION [ Eigentümer.]Funktionsname ( [ Parameter, ... ] ) RETURNS Datentyp [ SQL SECURITY { INVOKER | DEFINER } ] [ [ NOT ] DETERMINISTIC ] EXTERNAL NAME Externer Aufruf [ LANGUAGE Umgebungsname ]
Parameter : [ IN ] Parametername Datentyp [ DEFAULT Ausdruck ]
Umgebungsname : C_ESQL32 | C_ESQL64 | C_ODBC32 | C_ODBC64 | CLR | JAVA | PERL | PHP
CREATE FUNCTION Sie können permanent gespeicherte Funktionen erstellen, die externe oder native, mit unterschiedlichen Programmiersprachen erstellte Funktionen aufrufen.
Parameternamen müssen den Regeln für andere Datenbankbezeichner, wie z.B. Spaltennamen, entsprechen. Es muss sich dabei um einen gültigen SQL-Datentyp handeln. Eine Liste der gültigen Datentypen finden Sie unter SQL-Datentypen.
Das Schlüsselwort IN kann Parametern vorangestellt werden. Allerdings sind Funktionsparameter standardmäßig IN.
IN Dieser Parameter ist ein Ausdruck, der der Funktion einen Wert zur Verfügung stellt.
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 beim Ausführen der Funktion kein Argument angegeben und kein Standardwert gesetzt ist, wird ein Fehler ausgegeben.
Wenn Sie OR REPLACE (CREATE OR REPLACE FUNCTION) angeben, wird eine neue Funktion erstellt oder eine bestehende Funktion mit demselben Namen ersetzt. Diese Klausel ändert die Definition der Funktion, lässt aber bestehende Berechtigungen unberührt.Die Klausel EXTERNAL NAME wird für TEMPORARY-Funktionen nicht unterstützt.
[ 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.
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) aufgrufen 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).
EXTERNAL NAME Nativer_Aufruf-Klausel
Nativer_Aufruf : [Betriebssystem:]Funktionsname@Bibliothek; ...
Betriebssystem : Unix
Eine Funktion, die die EXTERNAL NAME-Klausel ohne LANGUAGE-Attribut verwendet, definiert eine Schnittstelle zu einer nativen Funktion, die in einer Programmiersprache wie C geschrieben ist. Die native Funktion wird vom Datenbankserver in seinen Adressenspeicher geladen.
Der Bibliotheksname 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 eine plattformspezifische Dateierweiterung für Bibliotheken an. Es folgt ein formelles 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 Adressenspeicher 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.
Weitere Informationen zu nativen Bibliotheksaufrufen finden Sie unter Externe Bibliotheken aus Prozeduren aufrufen.
EXTERNAL NAME c-Aufruf 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.
Nachstehend wird ein Beispiel für eine Funktionsdefinition angeführt.
CREATE FUNCTION ODBCinsert( IN ProductName CHAR(30), IN ProductDescription CHAR(50) ) RETURNS INT EXTERNAL NAME 'ODBCexternalInsert@extodbc.dll' LANGUAGE C_ODBC32; |
Weitere Hinweise finden Sie unter Die externen ESQL- und ODBC-Umgebungen.
EXTERNAL NAME clr-Aufruf 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).
Nachstehend wird ein Beispiel für eine Funktionsdefinition angeführt.
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; |
Weitere Hinweise finden Sie unter Die externe CLR-Umgebung.
EXTERNAL NAME perl-Aufruf 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 dass die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. innerhalb einer Perl-Programminstanz).
Nachstehend wird ein Beispiel für eine Funktionsdefinition angeführt.
CREATE FUNCTION PerlWriteToConsole( IN str LONG VARCHAR) RETURNS INT EXTERNAL NAME '<file=PerlConsoleExample> WriteToServerConsole( $sa_perl_arg0 )' LANGUAGE PERL; |
Weitere Hinweise finden Sie unter Die externe PERL-Umgebung.
EXTERNAL NAME php-Aufruf 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).
Nachstehend wird ein Beispiel für eine Funktionsdefinition angeführt.
CREATE FUNCTION PHPPopulateTable() RETURNS INT EXTERNAL NAME '<file=ServerSidePHPExample> ServerSidePHPSub()' LANGUAGE PHP; |
Weitere Hinweise finden Sie unter Die externe PHP-Umgebung.
EXTERNAL NAME java-Aufruf 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 Virtual Machine).
Nachstehend wird ein Beispiel für eine Funktionsdefinition angeführt.
CREATE FUNCTION HelloDemo( IN name LONG VARCHAR ) RETURNS INT EXTERNAL NAME 'Hello.main([Ljava/lang/String;)V' LANGUAGE JAVA; |
Weitere Hinweise finden Sie unter Die externe Java-Umgebung.
Die CREATE FUNCTION-Anweisung erstellt eine Funktion in der Datenbank. Benutzer mit DBA-Berechtigung 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. Weitere Hinweise finden Sie unter Temporäre Tabellen innerhalb von Prozeduren referenzieren.
Sie müssen über RESOURCE-Datenbankberechtigungen verfügen, es sei denn, Sie erstellen eine temporäre Funktion.
Sie müssen über DBA-Berechtigungen für externe Funktionen oder zum Erstellen einer Funktion für einen anderen Benutzer verfügen.
Automatisches Festschreiben (Autocommit).
SQL/2003 Persistent Stored Module-Funktion. Die Syntaxerweiterungen für Java-Ergebnismengen werden wie in der optionalen J621-Funktion angegeben verwendet.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |