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

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » Embedded SQL » Einfache gespeicherte Prozeduren in Embedded SQL

 

Gespeicherte Prozeduren mit Ergebnismengen

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;
 Dynamische Cursor für CALL-Anweisungen
 DESCRIBE ALL
 Mehrfache Ergebnismengen
 Siehe auch