Benutzen Sie diese Anweisung, um einen Cursor zu deklarieren. Cursor sind das wichtigste Instrument, um die Ergebnisse von Abfragen zu beeinflussen.
DECLARE Cursorname [ UNIQUE ] [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR FOR { SELECT_Anweisung | Anweisungsname [ FOR { UPDATE [ Cursorparallelität ] | READ ONLY } ] | CALL_Anweisung }
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 }
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.
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).
Keine.
Keine.
SQL/2003 Kernfunktion.
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 |
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 |