Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Anweisungen » SQL-Anweisungen (A-D)

 

CREATE PROCEDURE-Anweisung (externe Prozeduren)

Verwenden Sie diese Anweisung, um eine Schnittstelle zu einer nativen oder externen Prozedur zu erstellen. Hinweise zum Erstellen einer SQL-Prozedur finden Sie unter CREATE PROCEDURE-Anweisung.

Syntax
CREATE [ OR REPLACE ] PROCEDURE [ Eigentümer.]Prozedurname 
     ( [ Parameter, ... ] )
[ RESULT ( Ergebnisspalte, ... ) | NO RESULT SET ]
[ DYNAMIC RESULT SETS Ganzzahlausdruck ]
[ SQL SECURITY { INVOKER | DEFINER } ]
EXTERNAL NAME 'Externer_Aufruf' [ LANGUAGE Umgebungsname  ] 
Parameter :
  [ Parametermodus ] Parametername Datentyp [ DEFAULT Ausdruck ]
| SQLCODE
| SQLSTATE
Parametermodus : IN 
| OUT 
| INOUT
Ergebnisspalte : Spaltenname Datentyp
Umgebungsname : 
C_ESQL32
| C_ESQL64
| C_ODBC32
| C_ODBC64
| CLR
| JAVA
| PERL
| PHP
Parameter
  • 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, welcher 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 den fehlenden Parametern die Standardwerten zugeordnet. Falls in der CALL-Anweisung kein Argument angegeben 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 Informationen werden von Embedded SQL DESCRIBE oder ODBC SQLDescribeCol zurückgegeben, wenn eine CALL-Anweisung beschrieben wird. Eine Liste der Datentypen finden Sie unter SQL-Datentypen.

    Prozeduren, die externe Funktionen in Embedded SQL (LANGUAGE C_ESQL32, LANGUAGE C_ESQL64) or ODBC (LANGUAGE C_ODBC32, LANGUAGE C_ODBC64) aufrufen, können 0 oder 1 Ergebnismenge zurückgeben.

    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.

    Prozeduren die externe Funktionen in CLR oder Java (LANGUAGE CLR, LANGUAGE JAVA) aufrufen, 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 eine 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   Variable Ergebnismengenprozeduren können von Anwendungen verwendet werden, die diese Schnittstellen benutzen. Die richtige Beschreibung der Ergebnismengen wird vom Treiber oder Provider vorgenommen.

    • Open Client-Anwendungen   Variable Ergebnismengenprozeduren 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, und nicht die definierte Ergebnismenge der Prozedur. Deshalb bezeichnet 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 Informationen 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 Benutzer, dem die Prozedur 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 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 'Nativer_Aufruf'-Klausel  

    EXTERNAL NAME 'Nativer_Aufruf'
    Nativer_Aufruf :
    [Betriebssystem:]Funktionsname@Bibliothek; ...
    
    Betriebssystem : Unix
    

    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 eine 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.

    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  

    EXTERNAL NAME 'c-Aufruf' LANGUAGE C_ESQL32
    EXTERNAL NAME 'c-Aufruf' LANGUAGE C_ESQL64
    EXTERNAL NAME 'c-Aufruf' LANGUAGE C_ODBC32
    EXTERNAL NAME 'c-Aufruf' LANGUAGE C_ODBC64
    c-Aufruf :
    [Betriebssystem:]Funktionsname@Bibliothek; ...
    
    Betriebssystem : Unix
    

    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  

    EXTERNAL NAME 'clr-Aufruf' LANGUAGE CLR
    clr-Aufruf :
    dll-Name::Funktionsname( param-type-1, ... )
    

    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  

    EXTERNAL NAME 'perl-Aufruf' LANGUAGE PERL
    perl-Aufruf :
    <file=perl-Datei> $sa_perl_return = perl-Sub( $sa_perl_arg0, ... ) 
    

    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 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 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  

    EXTERNAL NAME 'php-Aufruf' LANGUAGE PHP
    php-Aufruf :
    <file=php-Datei> print php-Funktion( $argv[1], ... ) 
    

    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  

    EXTERNAL NAME 'java-Aufruf' LANGUAGE JAVA
    Java_Aufruf :
    [Paketname.]Klassenname.Methodenname Methodensignatur
    
    Methodensignatur : 
    ( [ Felddeskriptor, ... ] ) Rückgabedeskriptor
    
    Felddeskriptor and Rückgabedeskriptor :
    Z 
    | B 
    | S 
    | I 
    | J 
    | F 
    | D 
    | C 
    | V
    | [Deskriptor 
    | LKlassenname;
    

    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 Virtual Machine).

    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.

Bemerkungen

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. Weitere Hinweise finden Sie unter Temporäre Tabellen innerhalb von Prozeduren referenzieren.

Berechtigungen

Sie müssen über RESOURCE-Datenbankberechtigungen verfügen, es sei denn, Sie erstellen eine temporäre Prozedur.

Sie müssen über DBA-Berechtigungen für externe Prozeduren oder zum Erstellen einer Prozedur für einen anderen Benutzer verfügen.

Nebenwirkungen

Automatisches Festschreiben (Autocommit).

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Persistent Stored Module-Funktion. Die Syntaxerweiterungen für Java-Ergebnismengen werden wie in der optionalen J621-Funktion angegeben verwendet.