Erstellt eine Schnittstelle zu einer nativen oder externen Prozedur.
CREATE [ OR REPLACE ] PROCEDURE [ owner.]procedure-name ( [ parameter[, ... ] ] ) [ SQL SECURITY { INVOKER | DEFINER } ] [ RESULT ( result-column [, ... ] ) | NO RESULT SET ] [ DYNAMIC RESULT SETS integer-expression ] { 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 : [ parameter-mode ] parameter-name data-type [ DEFAULT expression ] | SQLCODE | SQLSTATE
parameter-mode : IN | OUT | INOUT
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; }
Sie können permanent gespeicherte Prozeduren erstellen, die externe oder native, mit unterschiedlichen Programmiersprachen erstellte Prozeduren aufrufen. PROC kann als Synonym für PROCEDURE verwendet werden.
OR REPLACE-Klausel Wenn Sie OR REPLACE angeben, wird eine neue Prozedur erstellt oder eine bestehende Prozedur mit demselben Namen ersetzt. Diese Klausel ändert die Definition der Prozedur, lässt aber vorhandene Privilegien unberührt. Ein Fehler wird zurückgegeben, wenn Sie eine Prozedur ersetzen, die gerade verwendet wird.
Parameter 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.
Parameter können eines der Schlüsselwörter IN, OUT oder INOUT vorangestellt haben. Wenn Sie keinen dieser Werte angeben, sind die Parameter standardmäßig INOUT. Die Schlüsselwörter haben die folgenden Bedeutungen:
IN Dieser Parameter ist ein Ausdruck, der der Prozedur einen Wert zur Verfügung stellt.
OUT Dieser Parameter ist eine Variable, die von der Prozedur einen Wert erhalten kann.
INOUT Dieser Parameter ist eine Variable, die einen Wert für die Prozedur bereitstellt, und die von der Prozedur einen neuen Wert erhalten kann.
Wenn Prozeduren mit der CALL-Anweisung ausgeführt werden, müssen nicht alle Parameter angegeben werden. Wenn in der CREATE PROCEDURE-Anweisung ein Standardwert bereitgestellt wird, werden fehlenden Parametern die Standardwerte zugeordnet. Falls in der CALL-Anweisung kein Argument angegeben wurde und kein Standardwert gesetzt ist, wird ein Fehler ausgegeben.
SQLSTATE und SQLCODE sind spezielle OUT-Parameter, die den SQLSTATE- oder SQLCODE-Wert ausgeben, wenn die Prozedur beendet wird. Die Spezialwerte SQLSTATE und SQLCODE können sofort geprüft werden, nachdem ein Prozeduraufruf abgeschlossen wurde, um den Rückgabestatus der Prozedur zu testen.
Die Spezialwerte SQLSTATE und SQLCODE werden durch die nächste SQL-Anweisung geändert. Indem SQLSTATE oder SQLCODE als Prozedurargumente bereitgestellt werden, kann die Rückmeldung in einer Variablen gespeichert werden.
Wenn Sie OR REPLACE (CREATE OR REPLACE PROCEDURE) angeben, wird eine neue Prozedur erstellt oder eine bestehende Prozedur mit demselben Namen ersetzt. Diese Klausel ändert die Definition der Prozedur, lässt aber vorhandene Privilegien unberührt. Ein Fehler wird zurückgegeben, wenn Sie eine Prozedur ersetzen, die gerade verwendet wird.
Sie können keine extern aufgerufenen TEMPORARY-Prozeduren erstellen.
RESULT-Klausel Die RESULT-Klausel deklariert die Anzahl und den Typ der Spalten in der Ergebnismenge. Mit der Liste in Klammern nach dem Schlüsselwort RESULT werden die Namen und Typen der Ergebnisspalten festgelegt. Diese Angaben werden von Embedded SQL DESCRIBE oder von ODBC SQLDescribeCol zurückgegeben, wenn eine CALL-Anweisung beschrieben wird.
Externe Prozeduren in Embedded SQL (LANGUAGE C_ESQL32, LANGUAGE C_ESQL64) or ODBC (LANGUAGE C_ODBC32, LANGUAGE C_ODBC64) können 0 oder 1 Ergebnismenge zurückgeben.
Externe Prozeduren in Perl oder PHP (LANGUAGE PERL, LANGUAGE PHP) können keine Ergebnismengen zurückgeben. Prozeduren, die vom Datenbankserver geladene native Funktionen aufrufen, können ebenfalls keine Ergebnismengen zurückgeben.
Externe CLR- oder Java-Prozeduren (LANGUAGE CLR, LANGUAGE JAVA) können 0, 1 oder mehr Ergebnismengen zurückgeben.
Einige Prozeduren können mehr als eine Ergebnismenge mit unterschiedlicher Spaltenanzahl zurückgeben, je nachdem, wie sie ausgeführt werden. Die folgende Prozedur gibt beispielsweise unter bestimmten Bedingungen zwei Spalten und in anderen Fällen nur eine Spalte zurück.
CREATE PROCEDURE names( IN formal char(1)) BEGIN IF formal = 'n' THEN SELECT GivenName FROM GROUPO.Employees ELSE SELECT Surname, GivenName FROM Employees END IF END; |
Prozeduren mit variablen Ergebnismengen müssen ohne RESULT-Klausel oder in Transact-SQL geschrieben werden. Ihre Verwendung ist den folgenden Einschränkungen unterworfen:
Embedded SQL Sie müssen den Prozeduraufruf mithilfe einer DESCRIBE-Anweisung beschreiben, nachdem der Cursor für die Ergebnismenge geöffnet wurde, aber bevor Zeilen zurückgegeben werden, damit die richtige Form der Ergebnismenge bezogen wird. Die Klausel CURSOR cursor-name in der DESCRIBE-Anweisung ist erforderlich.
ODBC, OLE DB, ADO.NET Prozeduren mit variablen Ergebnismengen können von Anwendungen verwendet werden, die diese Schnittstellen benutzen. Die richtige Beschreibung der Ergebnismengen wird vom Treiber oder Provider vorgenommen.
Open Client-Anwendungen Prozeduren mit variablen Ergebnismengen können von Open Client-Anwendungen verwendet werden.
Wenn Ihre Prozedur nur eine Ergebnismenge zurückgibt, sollten Sie eine RESULT-Klausel verwenden. Das Vorhandensein dieser Klausel verhindert, dass ODBC- und Open Client-Anwendungen die Ergebnismenge noch einmal beschreiben, nachdem der Cursor geöffnet wurde.
Um mehrere Ergebnismengen verarbeiten zu können, muss ODBC den aktuell ausgeführten Cursor beschreiben, nicht die definierte Ergebnismenge der Prozedur. Deshalb beschreibt ODBC die Spaltennamen nicht immer so, wie sie in der RESULT-Klausel der gespeicherten Prozedur definiert sind. Um dieses Problem zu vermeiden, verwenden Sie Spaltenaliasnamen in der SELECT-Anweisung, die die Ergebnismenge erzeugt.
NO RESULT SET-Klausel Deklariert, dass von dieser Prozedur keine Ergebnismenge zurückgegeben wird. Diese Deklaration kann zu einer Performanceverbesserung führen.
DYNAMIC RESULT SETS-Klausel Verwenden Sie diese Klausel mit LANGUAGE CLR- und LANGUAGE JAVA-Aufrufen. Die DYNAMIC RESULT SETS-Klausel wird verwendet, um die Anzahl der dynamischen Ergebnismengen anzugeben, die von der Prozedur zurückgegeben werden. Wenn eine RESULT-Klausel angegeben ist, nicht aber die Klausel DYNAMIC RESULT SETS, wird angenommen, dass die Anzahl der dynamischen Ergebnismengen 1 ist. Wenn weder die RESULT- noch die DYNAMIC RESULT SETS-Klausel angegeben sind, wird keine Ergebnismenge erwartet und ein Fehler gemeldet, wenn eine Ergebnismenge generiert wird.
Die externen Umgebungen C_ESQL32, C_ESQL64, C_ODBC32 und C_ODBC64 können auch Ergebnismengen zurückgeben, wie z.B. CLR und JAVA, sind aber auf nur eine dynamische Ergebnismenge beschränkt.
Prozeduren, die externe Funktionen in Perl oder PHP (LANGUAGE PERL, LANGUAGE PHP) aufrufen, können keine Ergebnismengen zurückgeben. Prozeduren, die native Funktionen aufrufen, die vom Datenbankserver geladen werden, können ebenfalls keine Ergebnismengen zurückgeben.
SQL SECURITY-Klausel Die SQL SECURITY-Klausel legt fest, ob die Prozedur als INVOKER (der Benutzer, der die Prozedur aufruft) oder als DEFINER (der Eigentümer der Prozedur) 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 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. Beispiel: Der Benutzer user1 erstellt die folgende Prozedur:
CREATE PROCEDURE user1.myProcedure() RESULT( columnA INT ) SQL SECURITY INVOKER BEGIN SELECT columnA FROM table1; END; |
Wenn der Benutzer user2 versucht, diese Prozedur auszuführen und eine 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-Klausel Eine Prozedur, 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 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. Es folgt ein formelles Beispiel.
CREATE PROCEDURE mystring( IN instr 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 PROCEDURE mystring( IN instr 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.
Hinweis zur Syntax bei Verwendung von operating-system: Wenn Sie operating-system nicht festlegen, dann wird angenommen, dass die Prozedur auf allen Plattformen läuft. Wenn Sie Unix für einen der Aufrufe festlegen, dann wird angenommen, dass der andere Aufruf für Windows vorgesehen ist.
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.
Nachstehend wird ein Beispiel für eine Prozedurdefinition angeführt.
CREATE PROCEDURE ODBCinsert( IN ProductName CHAR(30), IN ProductDescription CHAR(50) ) NO RESULT SET 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 Prozedurschnittstelle 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 PROCEDURE clr_interface( IN p1 INT, IN p2 UNSIGNED SMALLINT, OUT p3 LONG VARCHAR) NO RESULT SET EXTERNAL NAME 'CLRlib.dll::CLRproc.Run( int, ushort, out string )' LANGUAGE CLR; |
EXTERNAL NAME 'perl-call' LANGUAGE PERL-Klausel Um eine Perl-Funktion in einer externen Umgebung aufzurufen, wird die Prozedurschnittstelle 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).
Nachstehend wird ein Beispiel für eine Prozedurdefinition angeführt.
CREATE PROCEDURE PerlWriteToConsole( IN str LONG VARCHAR) NO RESULT SET 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 Prozedurschnittstelle 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 Prozedurdefinition angeführt.
CREATE PROCEDURE PHPPopulateTable() NO RESULT SET 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 Prozedurschnittstelle 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).
Nachstehend wird ein Beispiel für eine Prozedurdefinition angeführt.
CREATE PROCEDURE HelloDemo( IN name LONG VARCHAR ) NO RESULT SET 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 Klassenname; | Eine Instanz der Klasse Klassenname. 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 PROCEDURE-Anweisung erstellt eine Prozedur in der Datenbank. Sie können Prozeduren für andere Benutzer erstellen, indem Sie einen Eigentümer angeben. Eine Prozedur wird mit einer CALL-Anweisung aufgerufen.
Wenn eine gespeicherte Prozedur eine Ergebnismenge zurückgibt, kann sie nicht zusätzlich Ausgabeparameter setzen oder einen Rückgabewert zurückgeben.
Bei der Referenzierung einer temporären Tabelle durch mehrere Prozeduren kann ein Problem entstehen, wenn die Definitionen der temporären Tabelle nicht konsistent sind und Anweisungen, die die Tabelle referenzieren, im Cache abgelegt sind.
Sie müssen die CREATE PROCEDURE-Systemprivileg haben, um externe Prozeduren erstellen zu können, deren Eigentümer Sie sind.
Sie müssen das CREATE ANY PROCEDURE-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg haben, um externe Prozeduren erstellen zu können, deren Eigentümer andere Benutzer sind.
Automatisches Festschreiben (Autocommit).
SQL/2008 CREATE PROCEDURE 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 SQL/2008-Sprachenfunktion T324.
Die Möglichkeit zum Übergeben eines LONG VARCHAR-, LONG NVARCHAR- oder LONG BINARY-Werts an eine externe Prozedur ist SQL/2008-Sprachenfunktion T041.
Die Möglichkeit, ein Schema-Objekt innerhalb einer externen Prozedur mit Anweisungen wie CREATE TABLE und DROP TRIGGER zu erstellen oder zu ändern, ist SQL/2008-Sprachenfunktion T653.
Die Möglichkeit zum Verwenden einer Dynamic-SQL-Anweisung innerhalb einer externen Prozedur, einschließlich der Anweisungen CONNECT, EXECUTE IMMEDIATE, PREPARE und DESCRIBE, ist SQL/2008-Sprachenfunktion T654.
Externe JAVA-Prozeduren stellen SQL/2008-Sprachenfunktion J621 dar.
Einige Klauseln der CREATE PROCEDURE-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. Der SQL/2008-Standard unterstützt "C" als environment-name (optionale Sprachenfunktion B122).
Das Format von external_call wird durch die Implementierung festgelegt.
Die Klauseln RESULT und NO RESULT SET sind Erweiterungen des Herstellers. Der SQL/2008-Standard verwendet die RETURNS-Klausel.
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 PROCEDURE für eine externe Routine wird von Adaptive Server Enterprise unterstützt. Adaptive Server Enterprise unterstützt externe Routinen für die Programmiersprachen C und Java.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |