Eine Datenbankprozedur kann auch eine SELECT-Anweisung enthalten. Die Prozedur wird mit einer RESULT-Klausel deklariert, um Anzahl, Name und Typen der Spalten in der Ergebnismenge zu spezifizieren. Die Spalten einer Ergebnismenge unterscheiden sich von den Ausgabeparametern. In einer Prozedur mit Ergebnismenge kann die CALL-Anweisung anstelle der SELECT-Anweisung in der Cursordeklaration verwendet werden:
EXEC SQL BEGIN DECLARE SECTION; char hv_name[100]; EXEC SQL END DECLARE SECTION; EXEC SQL CREATE PROCEDURE female_employees() RESULT( name char(50) ) BEGIN SELECT GivenName || Surname FROM Employees WHERE Sex = 'f'; END; EXEC SQL PREPARE S1 FROM 'CALL female_employees()'; EXEC SQL DECLARE C1 CURSOR FOR S1; EXEC SQL OPEN C1; for(;;) { EXEC SQL FETCH C1 INTO :hv_name; if( SQLCODE != SQLE_NOERROR ) break; printf( "%s\\n", hv_name ); } EXEC SQL CLOSE C1; |
In diesem Beispiel wurde die Prozedur mit einer OPEN-Anweisung statt einer EXECUTE-Anweisung aufgerufen. Nach der OPEN-Anweisung wird die Prozedur ausgeführt, bis sie eine SELECT-Anweisung erreicht. Zu diesem Zeitpunkt ist C1 ein Cursor für die SELECT-Anweisung innerhalb der Datenbankprozedur. Sie können alle Arten der FETCH-Anweisung verwenden (rückwärts und vorwärts scrollen), solange Sie sie benötigen. Die CLOSE-Anweisung stoppt die Ausführung der Prozedur.
Nach der SELECT-Anweisung wird in der Prozedur keine weitere Anweisung ausgeführt. Verwenden Sie zur Ausführung von Anweisungen nach dem SELECT die Anweisung RESUME Cursorname. Die RESUME-Anweisung gibt entweder die Warnung SQLE_PROCEDURE_COMPLETE zurück oder SQLE_NOERROR, und zeigt damit an, dass es noch einen weiteren Cursor gibt. Das folgende Beispiel zeigt eine zweifache Auswahlprozedur:
EXEC SQL CREATE PROCEDURE people() RESULT( name char(50) ) BEGIN SELECT GivenName || Surname FROM Employees; SELECT GivenName || Surname FROM Customers; END; EXEC SQL PREPARE S1 FROM 'CALL people()'; EXEC SQL DECLARE C1 CURSOR FOR S1; EXEC SQL OPEN C1; while( SQLCODE == SQLE_NOERROR ) { for(;;) { EXEC SQL FETCH C1 INTO :hv_name; if( SQLCODE != SQLE_NOERROR ) break; printf( "%s\\n", hv_name ); } EXEC SQL RESUME C1; } EXEC SQL CLOSE C1; |
Diese Beispiele haben statische Cursor verwendet. Dynamische Cursor können auch für die CALL-Anweisung verwendet werden.
Eine Beschreibung von dynamischen Cursor finden Sie unter Die dynamische SELECT-Anweisung.
Die DESCRIBE-Anweisung funktioniert ohne Einschränkung für Prozeduraufrufe. DESCRIBE OUTPUT erzeugt einen SQLDA-Bereich mit einer Beschreibung für jede Spalte der Ergebnismenge.
Hat die Prozedur keine Ergebnismenge, enthält der SQLDA-Bereich eine Beschreibung für jeden INOUT- oder OUT-Parameter der Prozedur. Eine DESCRIBE INPUT-Anweisung erzeugt einen SQLDA-Bereich mit einer Beschreibung für jeden IN- oder INOUT-Parameter der Prozedur.
DESCRIBE ALL beschreibt IN-, INOUT-, OUT- und RESULT-Parameter. DESCRIBE ALL benutzt die Indikatorvariablen im SQLDA-Bereich, um zusätzliche Information zu liefern.
Die Bits für DT_PROCEDURE_IN und DT_PROCEDURE_OUT werden in den Indikatorvariablen gesetzt, wenn eine CALL-Anweisung beschrieben wird. DT_PROCEDURE_IN gibt einen IN- oder INOUT-Parameter an, und DT_PROCEDURE_OUT gibt einen INOUT- oder OUT-Parameter an. In RESULT-Spalten von Prozeduren sind beide Bits bereinigt.
Nach einem Beschreibungs-OUTPUT können diese Bits benutzt werden, um zwischen Anweisungen zu unterscheiden, die Ergebnismengen umfassen (müssen OPEN, FETCH, RESUME, CLOSE verwenden), und Anweisungen, die keine Ergebnismengen umfassen (müssen EXECUTE verwenden).
Eine vollständige Beschreibung finden Sie unter DESCRIBE-Anweisung [ESQL].
Haben Sie eine Prozedur, die mehrere Ergebnismengen zurückgibt, müssen Sie sie nach jeder RESUME-Anweisung neu beschreiben, falls sich die Form der Ergebnismengen ändert.
Sie müssen den Cursor beschreiben, nicht die Anweisung, um die aktuelle Position des Cursors neu zu beschreiben.
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 |