Prozeduren: CREATE PROCEDURE [ Eigentümer.]Prozedurname ( [ Parameter, ... ] ) { [ RESULT ( Ergebnisspalte, ... ) ] [ ON EXCEPTION RESUME ] AS SQL-Anweisung | AT Speicherort | EXTERNAL NAME Bibliotheksaufruf | [ DYNAMIC RESULT SETS Ganzzahlausdruck ] [ EXTERNAL NAME Java-Aufruf LANGUAGE JAVA ] } oder CREATE PROCEDURE [ Eigentümer.]Prozedurname ( [ Parameter, ... ] ) AS SQL-Anweisung Parameter: Parametermodus Parametername Datentyp DEFAULT Ausdruck ] | SQLCODE | SQLSTATE Parametermodus: IN | OUT | INOUT Ergebnisspalte: Spaltenname Datentyp Bibliotheksaufruf: '[Betriebssystem:][email protected]; ...' Betriebssystem: Windows95 | WindowsNT | NetWare | UNIX Java-Aufruf: '[Paketname.]Klassenname.Methodenname Methodensignatur' Methodensignatur: ( [ Felddeskriptor, ... ] ) Rückgabedeskriptor Felddeskriptor: Z | B | S | I | J | F | D | C | V | [Deskriptor | LKlassenname; Rückgabedeskriptor: Felddeskriptor CREATE PROCEDURE-Klausel Parameternamen müssen den Regeln für andere Datenbank-Bezeichner, wie z.B. Spaltennamen, entsprechen. Sie müssen einen gültigen SQLDatentyp haben, und es muss ihnen eines der folgenden Schlüsselwörter vorangehen: IN, OUT oder 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, welche der Prozedur einen Wert zur Verfügung stellt, und der von der Prozedur ein neuer Wert gegeben werden kann. Wenn Prozeduren mit der CALL-Anweisung ausgeführt werden, brauchen nicht alle Parameter angegeben zu werden. Wenn in der CREATE PROCEDURE-Anweisung ein Standardwert bereitgestellt wird, wird einem fehlenden Parameter der Standardwert zugeordnet. Falls in der CALL-Anweisung kein Argument angegeben und kein Standardwert gesetzt ist, wird ein Fehler ausgegeben. SQLSTATE und SQLCODE sind spezielle Parameter, die den SQLSTATE- oder SQLCODE-Wert ausgeben, wenn die Prozedur endet (es handelt sich um OUT-Parameter). Unabhängig davon, ob die Parameter SQLSTATE und SQLCODE angegeben werden oder nicht, können die Spezialwerte SQLSTATE und SQLCODE immer sofort nach einem Prozeduraufruf überprüft werden, um den Rückgabestatus der Prozedur zu testen. Die Werte der Spezialwerte SQLSTATE und SQLCODE werden durch die nächste SQLAnweisung geändert. Indem SQLSTATE oder SQLCODE als Prozedurargumente bereitgestellt werden, kann die Rückmeldung in einer Variablen gespeichert werden. 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 CALLAnweisung beschrieben wird. Einige Prozeduren können 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 unter anderen nur eine Spalte zurück. CREATE PROCEDURE names( IN formal char(1)) BEGIN IF formal = 'n' THEN SELECT emp_fname FROM employee ELSE SELECT emp_lname,emp_fname FROM employee 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 mit einem DESCRIBE versehen, 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: Variable Ergebnismengen-Prozeduren können von ODBC-Anwendungen verwendet werden. Die richtige Beschreibung der Ergebnismengen wird vom ODBCTreiber vorgenommen. Open Client-Anwendungen: Variable Ergebnismengen-Prozeduren 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 ClientAnwendungen die Ergebnismenge noch einmal beschreiben, nachdem der Cursor geöffnet wurde. Um mehrfache Ergebnismengen verarbeiten zu können, muss ODBC den aktuell ausgeführten Cursor beschreiben, und nicht die von der Prozedur definierte Ergebnismenge. Deshalb bezeichnet ODBC die Spaltennamen nicht immer so, wie sie in der RESULT-Klausel der gespeicherten Prozedur definiert sind. Verwenden Sie Spaltenaliasnamen in der SELECTAnweisung, die die Ergebnismenge erzeugt, um dieses Problem zu vermeiden. ON EXCEPTION RESUME-Klausel Diese Klausel aktiviert Transact-SQL - wie eine Fehlerbehandlung, die innerhalb einer Prozedur in Watcom SQL-Syntax verwendet wird. Wenn Sie ON EXCEPTION RESUME verwenden, übernimmt die Prozedur eine Aktion, die von der Einstellung der Option ON_TSQL_ERROR abhängt. Wenn ON_TSQL_ERROR auf CONDITIONAL (Standardwert) gesetzt ist, wird die Ausführung fortgesetzt, falls die nächste Anweisung den Fehler behebt. Andernfalls wird die Ausführung beendet. Anweisungen für die Fehlerbehandlung enthalten folgende Elemente: IF CALL SELECT @variable = EXECUTE CASE SIGNAL LOOP RESIGNAL LEAVE DECLARE CONTINUE SET VARIABLE Einen expliziten Fehlerbehandlungscode sollten Sie nicht mit der Klausel ON EXCEPTION RESUME verwenden. EXTERNAL NAME-Klausel Eine Funktion, welche die EXTERNAL NAME-Klausel verwendet, dient als Behälter für den Aufruf einer Funktion in einer externen Bibliothek. Eine gespeicherte Prozedur, die EXTERNAL NAME verwendet, kann keine anderen Klauseln haben, die der Parameterliste folgen. AT Standort-Klausel Erstellt eine gespeicherte Proxyprozedur in der aktuellen Datenbank für eine entfernte Prozedur, die durch Speicherort angegeben ist. Die AT-Klausel unterstützt das Semikolon (;) als Feldbegrenzer in Speicherort. Wenn kein Semikolon vorhanden ist, gilt der Punkt als Feldbegrenzer. Damit können Dateinamen oder Erweiterungen in den Datenbank- und Eigentümerfeldern verwendet werden. Die folgende Anweisung erstellt z.B. eine Proxy-Prozedur (remotewho), die die Prozedur dbo.sp_who in der Master-Datenbank auf dem Server bostonase aufruft: CREATE PROCEDURE remotewho () AT 'bostonase.master.dbo.sp_who Entfernte Prozeduren können nur bis zu 254 Zeichen in Ausgabevariablen zurückgeben. DYNAMIC RESULT SETS-Klausel Diese Klausel ist bei Prozeduren hilfreich, die Behälter für Javamethoden sind. Wenn die Klausel DYNAMIC RESULT SETS nicht angegeben ist, wird angenommen, dass von der Methode keine Ergebnismengen zurückgegeben werden. EXTERNAL NAME LANGUAGE JAVA-Klausel Eine Prozedur, die EXTERNAL NAME mit einer LANGUAGE JAVA-Klausel verwendet, ist ein Behälter für eine JavaMethode. Wenn die Anzahl der Parameter geringer ist als die in der Methodensignatur angegebene Zahl, muss der Unterschied gleich der Zahl sein, die in DYNAMIC RESULT SETS angegeben wurde. Jeder Parameter in der Methodensignatur, der nicht in der Parameterliste für die Prozedur enthalten ist, muss die Methodensignatur [Ljava/SQL/ResultSet; haben. Eine Javamethodensignatur ist die kompakte Zeichendarstellung der Typen der Parameter und der Typen der Ergebniswerte. Der Felddeskriptor und der Rückgabedeskriptor haben folgende Bedeutung: Feldtyp B C D F I J Lklassenname; S V Z [ Javadatentyp byte char double float int long Eine Instanz der Klasse Klassenname. Die Klasse muss voll qualifiziert sein und alle Punkte im Namen müssen durch das Zeichen / ersetzt werden. Beispiel: java/lang/String short void Boolescher Ausdruck Verwenden Sie jeweils eine für jede Felddimension. Zum Beispiel: double some_method( boolean a, int b, java.math.BigDecimal c, byte [][] d, java.SQL.ResultSet[] rs ) { } Dies hätte folgende Signatur: '(ZILjava/math/BigDecimal;[[B[Ljava/SQL/ResultSet;)D' Einsatzbereich: 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 CALLAnweisung aufgerufen. Berechtigungen: RESSOURCE-Berechtigung ist erforderlich. Sie müssen über DBA-Berechtigung für externe Prozeduren oder zum Erstellen einer Prozedur für einen anderen Benutzer verfügen. Nebenwirkungen: Automatisches Festschreiben Beispiele: Die folgende Prozedur verwendet eine CASE-Anweisung, um die Ergebnisse einer Abfrage zu klassifizieren. CREATE PROCEDURE ProductType (IN product_id INT, OUT type CHAR(10)) BEGIN DECLARE prod_name CHAR(20); SELECT name INTO prod_name FROM "DBA"."product" WHERE id = product_id; CASE prod_name WHEN 'Tee Shirt' THEN SET type = 'Shirt' WHEN 'Sweatshirt' THEN SET type = 'Shirt' WHEN 'Baseball Cap' THEN SET type = 'Hat' WHEN 'Visor' THEN SET type = 'Hat' WHEN 'Shorts' THEN SET type = 'Shorts' ELSE SET type = 'UNKNOWN' END CASE; END Die folgende Prozedur verwendet einen Cursor oder Schleifen über die Zeilen des Cursors, um einen Einzelwert zurückzugeben. CREATE PROCEDURE TopCustomer (OUT TopCompany CHAR(35), OUT TopValue INT) BEGIN DECLARE err_notfound EXCEPTION FOR SQLSTATE '02000'; DECLARE curThisCust CURSOR FOR SELECT company_name, CAST( sum(sales_order_items.quantity * product.unit_price) AS INTEGER) VALUE FROM customer LEFT OUTER JOIN sales_order LEFT OUTER JOIN sales_order_items LEFT OUTER JOIN product GROUP BY company_name; DECLARE ThisValue INT; DECLARE ThisCompany CHAR(35); SET TopValue = 0; OPEN curThisCust; CustomerLoop: LOOP FETCH NEXT curThisCust INTO ThisCompany, ThisValue; IF SQLSTATE = err_notfound THEN LEAVE CustomerLoop; END IF; IF ThisValue > TopValue THEN SET TopValue = ThisValue; SET TopCompany = ThisCompany; END IF; END LOOP CustomerLoop; CLOSE curThisCust; END Prozeduren in Transact-SQL [T-SQL] Die folgende Teilmenge der Transact-SQL CREATE PROCEDURE-Anweisung wird in Adaptive Server Anywhere unterstützt. CREATE PROCEDURE [Eigentümer.]Prozedurname [ [ ( ] @Parametername Datentyp [ = Standardwert ] [ OUTPUT ], ... [ ) ] ] [ WITH RECOMPILE ] AS Anweisungsliste Im Folgenden werden Unterschiede zwischen Transact-SQL- und Adaptive Server AnywhereAnweisungen (Watcom SQL) aufgelistet, um denjenigen zu helfen, die in beiden Dialekten schreiben. Variablennamen mit Präfix @: Das Zeichen "@" bezeichnet einen Transact-SQLVariablennamen. Eine Watcom SQL-Variable kann jedoch jeder gültige Bezeichner sein, und der Präfix @ ist optional. Eingabe- und Ausgabeparameter: In Watcom SQL werden Prozedurparameter als IN, OUT oder INOUT angegeben, während in Transact-SQL Prozedurparameter standardmäßig INPUT-Parameter sind oder als OUTPUT angegeben werden können. Die Parameter, welche in Adaptive Server Anywhere als INOUT oder als OUT deklariert werden, müssen in Transact-SQL mit OUTPUT deklariert werden. Standardwerte für Parameter: In Watcom SQL werden Prozedurparameter mit dem Schlüsselwort DEFAULT Standardwerte zugewiesen. In Transact-SQL wird ein Gleichheitszeichen (=) verwendet, um den Standardwert bereitzustellen. Hauptteil einer Prozedur Der Hauptteil einer Transact-SQL-Prozedur besteht aus einer Liste von Transact-SQL-Anweisungen, denen das Schlüsselwort AS als Präfix vorausgeht. Der Hauptteil einer Watcom SQL-Prozedur ist eine zusammengesetzte Anweisungen, die von den beiden Schlüsselwörtern BEGIN und END umschlossen wird. Rückgabe von Ergebnismengen: Watcom SQL verwendet eine RESULT-Klausel, um zurückgegebene Ergebnismengen anzugeben. In Transact-SQL-Prozeduren werden die Spaltennamen oder Aliasnamen der ersten Abfrage der aufrufenden Umgebung zurückgegeben. Die folgende Transact-SQL-Prozedur veranschaulicht, wie Ergebnismengen von gespeicherten Prozeduren in Transact-SQL zurückgegeben werden: CREATE PROCEDURE showdept @deptname varchar(30) AS SELECT employee.emp_lname, employee.emp_fname FROM department, employee WHERE department.dept_name = @deptname AND department.dept_id = employee.dept_id Im Folgenden wird die entsprechende Watcom SQL-Prozedur aufgeführt: CREATE PROCEDURE showdept(in deptname varchar(30) ) RESULT ( lastname char(20), firstname char(20)) ON EXCEPTION RESUME BEGIN SELECT employee.emp_lname, employee.emp_fname FROM department, employee WHERE department.dept_name = deptname AND department.dept_id = employee.dept_id END Berechtigungen: RESSOURCE-Berechtigung ist erforderlich. Nebenwirkungen: Automatisches Festschreiben Wenn die optionale Transact-SQL-Klausel WITH RECOMPILE angegeben wird, wird sie ignoriert. Adaptive Server Anywhere rekompiliert Prozeduren, wenn sie beim Start der Datenbank zum ersten Mal ausgeführt werden, und speichert die kompilierte Prozedur, bis die Datenbank angehalten wird. Prozedurgruppen werden nicht unterstützt. Funktionen: CREATE FUNCTION [ Eigentümer.]Funktionsname ( [ Parameter, ... ] ) RETURNS Datentyp { EXTERNAL NAME Bibliotheksaufruf | EXTERNAL NAME Java-Aufruf LANGUAGE JAVA | [ ON EXCEPTION RESUME ] } SQL-Anweisung Parameter: IN Parametername Datentyp Bibliotheksaufruf: '[Betriebssystem:][email protected]; ...' Betriebssystem: Windows95 | WindowsNT | NetWare | UNIX Java-Aufruf: '[Paketname.]Klassenname.Methodenname Methodensignatur' Methodensignatur: ( [ Felddeskriptor, ... ] ) Rückgabedeskriptor Felddeskriptor: Z | B | S | I | J | F | D | C | V | [Deskriptor | LKlassenname; Rückgabedeskriptor: Felddeskriptor CREATE FUNCTION-Klausel Parameternamen müssen den Regeln für Datenbank-Bezeichner folgen. Sie müssen einen gültigen SQL-Datentyp haben, und das Schlüsselwort IN muss ihnen vorangestellt sein, was bedeutet, dass das Argument ein Ausdruck ist, welcher der Funktion einen Wert zur Verfügung stellt. EXTERNAL NAME-Klausel Eine Funktion, welche die EXTERNAL NAME-Klausel verwendet, dient als Behälter für den Aufruf einer Funktion in einer externen Bibliothek. Eine Funktion, die EXTERNAL NAME verwendet, kann keine anderen Klauseln haben, die der RETURNS-Klausel folgen. EXTERNAL NAME LANGUAGE JAVA-Klausel Eine Funktion, die EXTERNAL NAME mit einer LANGUAGE JAVA-Klausel verwendet, ist ein Behälter für eine Java-Methode. ON EXCEPTION RESUME-Klausel (siehe: Prozeduren!) . Transact-SQL-ähnliche Fehlerbehandlung verwenden. Beispiel: CREATE FUNCTION VollerName ( Vorname CHAR(30), Nachname CHAR(30) ) RETURNS CHAR(61) BEGIN DECLARE Name CHAR(62); SET Name = Vorname || ' ' || Nachname; RETURN (Name); END Anwendungen: SELECT VollerName ('Sabine','Sauer')as Name Name Sabine Sauer SELECT VollerName (Name, Vornamen) as Person FROM Spieler WHERE Verb_nr is NULL Person Wiegand GWS Bischof D Kohl C Mueller P