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)

 

DECLARE CURSOR-Anweisung [ESQL] [SP]

Benutzen Sie diese Anweisung, um einen Cursor zu deklarieren. Cursor sind das wichtigste Instrument, um die Ergebnisse von Abfragen zu beeinflussen.

Syntax 1 [ESQL]
DECLARE Cursorname
[ UNIQUE ]
[   NO SCROLL
  | DYNAMIC SCROLL
  | SCROLL
  | INSENSITIVE
  | SENSITIVE
]
CURSOR FOR
{ SELECT_Anweisung
| Anweisungsname [ FOR { UPDATE [ Cursorparallelität ] | READ ONLY } ]
| CALL_Anweisung }
Syntax 2 [SP]
DECLARE Cursorname
[   NO SCROLL
  | DYNAMIC SCROLL
  | SCROLL
  | INSENSITIVE
  | SENSITIVE
]
CURSOR
{ FOR  Select-Anweisung [ FOR { UPDATE [ Cursor-Mehrbenutzerbetrieb READ ONLY]
| FOR Aufruf-Anweisung
| USING Variablenname }
Cursorname :  Bezeichner
Anweisungname : Bezeichner | Hostvariable
Variablenname :  Bezeichner

Cursorparallelität :
  BY { VALUES | TIMESTAMP | LOCK }
Parameter
  • UNIQUE-Klausel   Wenn ein Cursor als UNIQUE deklariert wird, ist die Abfrage gezwungen, alle Spalten zurückzugeben, die für eine eindeutige Identifizierung jeder einzelnen Zeile notwendig sind. Meist bedeutet dies, dass alle Spalten im Primärschlüssel oder eine Eindeutigkeits-Integritätsregel für die Tabelle zurückgegeben werden. Spalten, die erforderlich sind, aber in der Abfrage nicht angegeben wurden, werden der Ergebnismenge hinzugefügt.

    Eine DESCRIBE-Anweisung für einen UNIQUE-Cursor legt die folgenden zusätzlichen Optionen in den Indikatorvariablen fest:

    • DT_KEY_COLUMN   Die Spalte ist Teil des Schlüssels für die Zeile.

    • DT_HIDDEN_COLUMN   Die Spalte wurde der Abfrage hinzugefügt, weil sie erforderlich war, um die Zeilen eindeutig zu identifizieren.

  • NO SCROLL-Klausel   Ein als NO SCROLL deklarierter Cursor ist auf die Vorwärtsbewegung durch die Ergebnismenge mit den Suchvorgängen FETCH NEXT und FETCH RELATIVE 0 beschränkt.

    Da er nicht mehr zu der Zeile zurückkehren kann, wenn der Cursor die Zeile verlassen hat, gibt es keine Sensitivitätseinschränkungen für den Cursor. Wenn ein NO SCROLL-Cursor angefordert wird, liefert SQL Anywhere den wirksamsten Cursor, nämlich einen asensitiven Cursor. Weitere Hinweise finden Sie unter Nicht-empfindliche Cursor.

  • DYNAMIC SCROLL-Klausel   DYNAMIC SCROLL ist der Standard-Cursortyp. DYNAMIC SCROLL-Cursor können alle Formate der FETCH-Anweisung verwenden.

    Wenn ein DYNAMIC SCROLL-Cursor angefordert wird, liefert SQL Anywhere einen asensitiven Cursor. Wenn Sie Cursor verwenden, muss immer zwischen Effizienz und Konsistenz abgewogen werden. Asensitive Cursor bieten eine hohe Performance, allerdings bei geringerer Konsistenz. Weitere Hinweise finden Sie unter Nicht-empfindliche Cursor.

  • SCROLL-Klausel   Ein als SCROLL deklarierter Cursor kann alle Formate der FETCH-Anweisung verwenden. Wenn ein SCROLL-Cursor angefordert wird, liefert SQL Anywhere einen wertsensitiven Cursor Weitere Hinweise finden Sie unter Wertempfindliche Cursor.

    SQL Anywhere muss wertsensitive Cursor so ausführen, dass die Zugehörigkeit zur Ergebnismenge garantiert ist. DYNAMIC SCROLL-Cursor haben einen höheren Wirkungsgrad und sollten benutzt werden, wenn nicht ein konsistentes Verhalten von SCROLL-Cursors erforderlich ist.

  • INSENSITIVE-Klausel   Ein als INSENSITIVE deklarierter Cursor hat beim Öffnen eine feste Zugehörigkeit; eine temporäre Tabelle wird mit einer Kopie aller Originalzeilen erstellt. Der Abruf (FETCH) aus einem INSENSITIVEN Cursor berücksichtigt nicht die Auswirkungen aller anderen INSERT-, UPDATE- oder DELETE-Anweisungen oder aller anderen PUT-, UPDATE WHERE CURRENT-, DELETE WHERE CURRENT-Vorgänge auf einen anderen Cursor. Er berücksichtigt die Auswirkungen der Vorgänge PUT, UPDATE WHERE CURRENT, DELETE WHERE CURRENT auf denselben Cursor. Weitere Hinweise finden Sie unter Unempfindliche Cursor.

  • SENSITIVE-Klausel   Ein als SENSITIVE (empfindlich) deklarierter Cursor erkennt Änderungen der Zugehörigkeit oder der Ergebnismengenwerte. Weitere Hinweise finden Sie unter Empfindliche Cursor.

  • FOR Anweisungsname   Anweisungen werden mit der PREPARE-Anweisung benannt. Cursor können nur für eine vorbereitete SELECT- oder CALL-Anweisung deklariert werden.

  • FOR UPDATE | READ ONLY   Ein Cursor, der als FOR READ ONLY deklariert wurde, kann weder in einem (positionsbasierten) UPDATE- noch in einem (positionsbasierten) DELETE-Vorgang verwendet werden. FOR UPDATE ist der Standardwert.

    Cursor gelten standardmäßig als FOR UPDATE bei Ein-Tabellen-Abfragen ohne eine ORDER BY-Klausel bzw. wenn die Option ansi_update_constraints auf "Off" gesetzt ist. Wenn die Option ansi_update_constraints auf "Cursors" oder "Strict" gesetzt ist, gelten Cursor über einer Abfrage, die eine ORDER BY-Klausel enthält, standardmäßig als READ ONLY. Sie können jedoch Cursor explizit als aktualisierbar markieren, indem Sie die FOR UPDATE-Klausel verwenden. Da es kostenträchtig ist, Aktualisierungen über Cursor mit einer ORDER BY-Klausel oder einem Join zuzulassen, sind Cursor über eine Abfrage, die einen Join von zwei oder mehr Tabellen enthält, READ ONLY und können nicht aktualisierbar gemacht werden.

    Als Antwort auf eine Anforderung für einen FOR UPDATE-Cursor übergibt SQL Anywhere entweder einen wertsensitiven oder einen sensitiven Cursor. Insensitive und asensitive Cursor können nicht aktualisiert werden.

  • USING Variablenname   Nur für die Verwendung innerhalb von gespeicherten Prozeduren. Die Variable ist eine Zeichenfolge, die eine SELECT-Anweisung für den Cursor enthält. Die Variable muss verfügbar sein, wenn die DECLARE-Anweisung verarbeitet wird, was Folgendes bedingt:

    Sie muss ein Parameter der Prozedur sein. Zum Beispiel:

    CREATE FUNCTION GetRowCount( IN qry LONG VARCHAR)
    RETURNS INT
    BEGIN
      DECLARE crsr CURSOR USING qry;
      DECLARE rowcnt INT;
    
      SET rowcnt = 0;
      OPEN crsr;
      lp: LOOP
        fetch crsr;
        IF SQLCODE <> 0 THEN LEAVE lp END IF;
        SET rowcnt = rowcnt + 1;
      END LOOP;
      RETURN rowcnt;
    END;

    Verschachtelt innerhalb einer anderen BEGIN … END-Anweisung, nachdem der Variablen ein Wert zugewiesen wurde. Zum Beispiel:

    CREATE PROCEDURE get_table_name(
      IN id_value INT, OUT tabname CHAR(128)
    )
    BEGIN
      DECLARE qry LONG VARCHAR;
    
      SET qry = 'SELECT table_name FROM SYS.SYSTAB ' ||
                'WHERE table_id=' || string(id_value);
      BEGIN
        DECLARE crsr CURSOR USING qry;
        OPEN crsr;
        FETCH crsr INTO tabname;
        CLOSE crsr;
      END
    END;

  • BY VALUES | TIMESTAMP | LOCK-Klauseln   In Embedded SQL kann eine Parallelitätsangabe gesetzt werden, indem Syntax in die SELECT-Anweisung selbst oder in die Cursordeklaration aufgenommen wird. Pessimistische oder optimistische Parallelität kann auf der Cursorebene ausgewählt werden, und zwar entweder mittels DECLARE CURSOR- bzw. FOR-Anweisungen, oder mittels der Parallelitätseinstellungs-API bei spezifischen Programmierschnittstellen. Wenn eine Anweisung aktualisierbar ist und der Cursor keinen bestimmten Parallelitätssteuerungsmechanismus angibt, wird die Angabe der Anweisung verwendet. Die Syntax lautet wie folgt:

  • FOR UPDATE BY LOCK-Klausel   Der Datenbankserver erwirbt Absichtszeilensperren für mit FETCH abgerufene Zeilen der Ergebnismenge. Dies sind langfristige Sperren, die bis zum COMMIT oder ROLLBACK der Transaktion gehalten werden..

  • FOR UPDATE BY { VALUES | TIMESTAMP }   Der Datenbankserver verwendet einen keyset-driven Cursor, damit die Anwendung benachrichtigt werden kann, wenn Zeilen geändert oder gelöscht werden, während die Ergebnismenge durchlaufen wird.

Bemerkungen

Die DECLARE CURSOR-Anweisung deklariert einen Cursor mit dem angegebenen Namen für eine SELECT- oder eine CALL-Anweisung. In einer Prozedur, einem Trigger oder einem Batch in Watcom-SQL muss eine DECLARE CURSOR-Anweisung mit anderen Deklarationen auftreten, und zwar unmittelbar nach dem BEGIN-Schlüsselwort. Cursornamen müssen außerdem eindeutig sein.

Wenn ein Cursor in einer zusammengesetzten Anweisung deklariert wird, besteht er nur für die Dauer dieser zusammengesetzten Anweisung (ganz gleich, ob die zusammengesetzte Anweisung in Watcom-SQL oder Transact-SQL geschrieben wurde).

Berechtigungen

Keine.

Nebenwirkungen

Keine.

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Kernfunktion.

Beispiel

Das folgende Beispiel veranschaulicht, wie ein Scroll-Cursor in Embedded SQL deklariert wird:

EXEC SQL DECLARE cur_employee SCROLL CURSOR
FOR SELECT * FROM Employees;

Das folgende Beispiel veranschaulicht, wie ein Cursor für eine vorbereitete Anweisung in Embedded SQL deklariert wird:

EXEC SQL PREPARE employee_statement
FROM 'SELECT Surname FROM Employees';
EXEC SQL DECLARE cur_employee CURSOR
FOR employee_statement;

Das folgende Beispiel veranschaulicht die Cursorverwendung in einer gespeicherten Prozedur:

BEGIN
  DECLARE cur_employee CURSOR FOR
      SELECT Surname
      FROM Employees;
  DECLARE name CHAR(40);
  OPEN cur_employee;
  lp: LOOP
    FETCH NEXT cur_employee INTO name;
    IF SQLCODE <> 0 THEN LEAVE lp END IF;
    ...
  END LOOP;
  CLOSE cur_employee;
END