Erstellt eine Schnittstelle zu einer nativen oder externen Prozedur. Hinweise zum Erstellen einer SQL-Prozedur finden Sie unter CREATE PROCEDURE-Anweisung.
CREATE [ OR REPLACE ] PROCEDURE [ Eigentümer.]Prozedurname ( [ Parameter[, ... ] ] ) [ RESULT ( Ergebnisspalte [, ... ] ) | NO RESULT SET ][ DYNAMIC RESULT SETS Ganzzahlausdruck ] [ SQL SECURITY { INVOKER | DEFINER } ] { EXTERNAL NAME 'Nativer_Aufruf' | EXTERNAL NAME 'c-Aufruf' LANGUAGE { C_ESQL32 | C_ESQL64 | C_ODBC32 | C_ODBC64 } | EXTERNAL NAME 'clr-Aufruf' LANGUAGE CLR | EXTERNAL NAME 'perl-Aufruf' LANGUAGE PERL | EXTERNAL NAME 'php-Aufruf' LANGUAGE PHP | EXTERNAL NAME 'java-Aufruf' LANGUAGE JAVA }
Parameter : [ Parametermodus ] Parametername Datentyp [ DEFAULT Ausdruck ] | SQLCODE | SQLSTATE
Parametermodus : IN | OUT | INOUT
Nativer_Aufruf : [ Betriebssystem:]Funktionsname@Bibliothek
Ergebnisspalte : Spaltenname Datentyp
c-Aufruf : [Betriebssystem:]Funktionsname@Bibliothek; ...
clr-Aufruf : dll-Name::Funktionsname( param-type-1[, ... ] )
perl-Aufruf : <file=perl-Datei> $sa_perl_return = perl-Unterroutine( $sa_perl_arg0[, ... ] )
php-Aufruf : <file=php-Datei> print php-Funktion( $argv[1][, ... ] )
java-Aufruf : [ Paketname.]Klassenname.Methodenname Methodensignatur
Betriebssystem :
Unix
Methodensignatur : ( [ Felddeskriptor, ... ] ) Rückgabedeskriptor
Felddeskriptor und Rückgabedeskriptor : { Z | B | S | I | J | F | D | C | V | [Deskriptor | LKlassenname; }
CREATE PROCEDURE 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.
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.
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 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 kein Argument in der CALL-Anweisung 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 bestehende Berechtigungen 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. Eine Liste der Datentypen finden Sie unter SQL-Datentypen.
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 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 Cursorname 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.
Weitere Hinweise zum Zurückgeben von Ergebnismengen aus Prozeduren finden Sie unter Ergebnisse aus Prozeduren zurückgeben.
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. Wenn die Klausel DYNAMIC RESULT SETS nicht angegeben ist, wird angenommen, dass von der Methode keine Ergebnismengen zurückgegeben werden.
Beachten Sie, dass Prozeduren, die externe Funktionen in Perl oder PHP (LANGUAGE PERL, LANGUAGE PHP) aufrufen, keine Ergebnismengen zurückgeben können. 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 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 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 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.
Hinweis zur Syntax bei Verwendung von Betriebssystem: Wenn Sie Betriebssystem 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.
Weitere Hinweise zu nativen Bibliotheksaufrufen finden Sie unter SQL Anywhere-Schnittstelle für externe Aufrufe.
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 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; |
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 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).
Nachstehend wird ein Beispiel für eine Prozedurdefinition angeführt.
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; |
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 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; |
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 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; |
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 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; |
Weitere Hinweise finden Sie unter Die externe Java-Umgebung.
Die CREATE PROCEDURE-Anweisung erstellt eine Prozedur in der Datenbank. Benutzer mit DBA-Berechtigung 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. Siehe Temporäre Tabellen innerhalb von Prozeduren referenzieren.
Sie müssen über RESOURCE-Datenbankberechtigungen verfügen, es sei denn, Sie erstellen eine temporäre Prozedur.
Für externe Prozeduren oder zum Erstellen einer Prozedur für einen anderen Benutzer müssen Sie über die DBA-Berechtigung verfügen.
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 Umgebungsname (optionale Sprachenfunktion B122).
Das Format von externer_Aufruf 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 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |