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 - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere Embedded SQL » Daten abrufen

 

Cursor in Embedded SQL verwenden

Ein Cursor wird benutzt, um Zeilen aus einer Abfrage abzurufen, die mehrere Zeilen in ihrer Ergebnismenge hat. Ein Cursor ist ein Handle oder ein Name (identifier) für die SQL-Abfrage und eine Position innerhalb der Ergebnismenge.

Eine Einführung zu Cursor finden Sie unter Mit Cursor arbeiten.

♦  So verwalten Sie einen Cursor in Embedded SQL
  1. Deklarieren Sie einen Cursor für eine bestimmte SELECT-Anweisung mit der DECLARE-Anweisung.

  2. Öffnen Sie den Cursor mit der Anweisung OPEN.

  3. Rufen Sie die Ergebnisse Zeile für Zeile mit der FETCH-Anweisung aus dem Cursor ab.

  4. Wiederholen Sie das Abrufen der Zeilen, bis die Warnung Zeile nicht gefunden zurückgegeben wird.

    Fehler und Warnungen werden in der SQLCA-Struktur zurückgegeben. Weitere Hinweise finden Sie unter SQL-Kommunikationsbereich (SQLCA).

  5. Schließen Sie den Cursor mit der CLOSE-Anweisung.

Als Voreinstellung werden Cursor automatisch am Ende der Transaktion geschlossen (bei COMMIT oder ROLLBACK). Cursor, die mit einer WITH HOLD-Klausel geöffnet werden, bleiben für folgende Transaktionen geöffnet, bis sie explizit geschlossen werden.

Das folgende einfache Beispiel zeigt den Gebrauch von Cursor:

void print_employees( void )
{
  EXEC SQL BEGIN DECLARE SECTION;
  char name[50];
  char Sex;
  char birthdate[15];
  short int ind_birthdate;
  EXEC SQL END DECLARE SECTION;
  EXEC SQL DECLARE C1 CURSOR FOR
    SELECT GivenName || ' ' || Surname,
      Sex, BirthDate
    FROM Employees;
  EXEC SQL OPEN C1;
  for( ;; ) 
  {
    EXEC SQL FETCH C1 INTO :name, :Sex, 
        :birthdate:ind_birthdate;
    if( SQLCODE == SQLE_NOTFOUND ) 
    {
      break;
    } 
    else if( SQLCODE < 0 ) 
    {
      break;
    }

    if( ind_birthdate < 0 ) 
    {
      strcpy( birthdate, "UNKNOWN" );
    }
    printf( "Name: %s Sex: %c Birthdate:
         %s.n",name, Sex, birthdate );
  }
  EXEC SQL CLOSE C1;
}

Vollständige Beispiele für Cursor finden Sie unter Beispiel für statischen Cursor und Beispiel für dynamischen Cursor.

Cursor positionieren

Ein Cursor wird an einer von drei Stellen positioniert:

  • Auf einer Zeile

  • Vor der ersten Zeile

  • Nach der letzten Zeile

Zeilen der Ergebnismenge werden nummeriert von null bis n + 1 auf der linken Seite und von -n - 1 bis null auf der rechten Seite angezeigt

Wird ein Cursor geöffnet, ist er vor der ersten Zeile positioniert. Die Cursorposition kann mit der FETCH-Anweisung verschoben werden. Er kann absolut positioniert werden, entweder bezogen auf den Anfang oder auf das Ende des Abfrageergebnisses. Er kann auch relativ zur aktuellen Cursorposition verschoben werden. Weitere Hinweise finden Sie unter FETCH-Anweisung [ESQL] [SP].

Mit speziellen positionierten Versionen der Anweisungen UPDATE und DELETE können Sie die Zeile an der aktuellen Cursorposition aktualisieren oder löschen. Wenn der Cursor vor der ersten oder hinter der letzten Zeile positioniert ist, wird ein Fehler zurückgegeben, der angibt, dass es keine entsprechende Zeile im Cursor gibt.

Die Anweisung PUT kann verwendet werden, um eine Zeile in einen Cursor einzufügen. Weitere Hinweise finden Sie unter PUT-Anweisung [ESQL].

Probleme mit der Cursorpositionierung

Einfügungen und einige Aktualisierungen zu DYNAMIC SCROLL-Cursorn können Probleme bei der Cursorpositionierung verursachen. Der Datenbankserver platziert eingefügte Zeilen an unvorhersehbaren Positionen innerhalb eines Cursors, falls die SELECT-Anweisung keine ORDER BY-Klausel hat. In einigen Fällen erscheint die eingefügte Zeile überhaupt nicht, bis der Cursor geschlossen und wieder geöffnet wurde.

Bei SQL Anywhere tritt dies auf, wenn zum Öffnen eines Cursors eine temporäre Tabelle erstellt werden musste.

Eine Beschreibung finden Sie unter Arbeitstabellen in der Abfrageverarbeitung verwenden ("Alle Zeilen" als Optimierungsziel verwenden).

Die UPDATE-Anweisung kann bewirken, dass sich eine Zeile im Cursor verschiebt. Das passiert, wenn der Cursor eine ORDER BY-Klausel hat, die einen vorhandenen Index benutzt (es wird keine temporäre Tabelle erstellt).