Deklariert einen Cursor.
DECLARE Cursorname [ UNIQUE ] [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR FOR { SELECT-Anweisung | Anweisungsname | CALL-Anweisung }
DECLARE Cursorname [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR { FOR SELECT-Anweisung | FOR CALL-Anweisung | USING Variablenname }
Cursorname : Bezeichner
Anweisungname : Bezeichner | Hostvariable
Variablenname : Bezeichner
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. Siehe Asensitive 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. Siehe Asensitive 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. Bei einem wertempfindlichen Cursor kann ein nachfolgendes FETCH für eine vorher mit FETCH abgerufene Ergebniszeile eine Warnung oder einen Fehler zurückgeben, wenn die zugrunde liegende Zeile geändert oder gelöscht wurde. Siehe Wertsensitive 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. Ein FETCH-Abruf aus einem INSENSITIVE-Cursor berücksichtigt nicht die Auswirkungen anderer INSERT-, UPDATE- oder DELETE-Anweisungen aus gleichzeitig ausgeführten Transaktionen sowie anderer UPDATE-Vorgänge innerhalb derselben Transaktion. INSENSITIVE-Cursor können nicht aktualisiert werden. Siehe Insensitive Cursor.
SENSITIVE-Klausel Ein als SENSITIVE (empfindlich) deklarierter Cursor erkennt Änderungen der Zugehörigkeit oder der Ergebnismengenwerte. Siehe Sensitive Cursor.
FOR Anweisungsname Anweisungen werden mit der PREPARE-Anweisung benannt. Cursor können nur für eine vorbereitete SELECT- oder CALL-Anweisung deklariert werden. Die in der PREPARE-Anweisung angegebene Cursor-Aktualisierbarkeit wird für den Cursor verwendet, es sei denn, die SQL-Präprozessoroption -m HISTORICAL ist angegeben. Siehe SQL-Präprozessor.
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; CLOSE crsr; 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; |
Cursor sind das wichtigste Instrument, um die Ergebnisse von Abfragen zu beeinflussen. Die DECLARE CURSOR-Anweisung deklariert einen Cursor mit dem angegebenen Namen für eine SELECT- oder 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 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/2008 DECLARE CURSOR ist eine Kernfunktion des SQL/2008-Standards. Die Möglichkeit zum Angeben von FOR UPDATE mit SCROLL oder NO SCROLL ist die optionale SQL-Sprachenfunktion F831 (vollständige Cursoraktualisierung). Die Verwendung von DECLARE CURSOR in einem Embedded SQL-Programm ist die optionale SQL-Sprachenfunktion B031. Einige Cursortypen sind auch optionale SQL-Funktionen. Es handelt sich dabei um die folgenden:
INSENSITIVE-Cursor sind die optionale SQL-Sprachenfunktion F791 des SQL/2008-Standards.
SENSITIVE-Cursor sind die optionale SQL-Sprachenfunktion F231 des SQL/2008-Standards.
SCROLL-Cursor sind die optionale SQL-Sprachenfunktion F431 des SQL/2008-Standards.
SQL Anywhere unterstützt eine Reihe von Erweiterungen des Herstellers zu DECLARE CURSOR, einschließlich der folgenden:
SQL Anywhere unterstützt mehrere Erweiterungen zur FOR UPDATE-Klausel, die SQL/2008 als Klausel der DECLARE CURSOR-Anweisung definiert. Siehe FOR UPDATE- oder FOR READ ONLY-Klausel, SELECT-Anweisung.
WITH HOLD wird als Klausel der OPEN-Anweisung angegeben statt als Klausel der DECLARE CURSOR-Anweisung, wie in SQL/2008 definiert. Siehe OPEN-Anweisung [ESQL] [SP].
Der SQL/2008 Standard trennt zwischen Cursorempfindlichkeit und SCROLL-Fähigkeit, während SQL Anywhere beides aus historischen Gründen kombiniert. In SQL Anywhere sind alle Cursor vorwärts und rückwärts abrollend, außer denjenigen, die als NO SCROLL deklariert wurden.
DYNAMIC SCROLL und UNIQUE sind Erweiterungen des Herstellers. DYNAMIC SCROLL weist ein ähnliches Verhalten auf wie Cursor, die im SQL/2008-Standard als ASENSITIVE deklariert wurden.
Die Möglichkeit zum Deklarieren eines Cursors über eine CALL-Anweisung, oder mit einer USING-Klausel, ist eine Erweiterung des Herstellers.
Transact-SQL DECLARE CURSOR wird von Adaptive Server Enterprise unterstützt, aber im Verhalten gibt es mehrere Unterschiede. Adaptive Server Enterprise unterscheidet, wie in SQL/2008, zwischen SCROLL-Fähigkeit und Empfindlichkeit. In Adaptive Server Enterprise sind die Cursorempfindlichkeitsoptionen SEMI-SENSITIVE, INSENSITIVE oder DEFAULT (ähnlich ASENSITIVE). In Adaptive Server Enterprise sind NO SCROLL-Cursor die Standardeinstellung und alle SCROLL-fähigen Cursor sind schreibgeschützt. Einige Funktionen der DECLARE CURSOR-Anweisung werden von Adaptive Server Enterprise nicht unterstützt. Es handelt sich dabei um die folgenden:
Adaptive Server Enterprise unterstützt die Cursorparallelitätsklausel von SQL Anywhere nicht. Siehe FOR UPDATE- oder FOR READ ONLY-Klausel, SELECT-Anweisung.
Um eine Sperre auf eine abgerufene Zeile zu setzen, müssen Sie den HOLDLOCK-Tabellen-Hint verwenden. Siehe WITH Tabellen-Hint-Klausel, FROM-Klausel.
Adaptive Server Enterprise unterstützt keine DYNAMIC SCROLL- oder UNIQUE-Cursor. DYNAMIC SCROLL ist ähnlich dem Standard-Cursorverhalten von Adaptive Server Enterprise.
Die Möglichkeit zum Deklarieren eines Cursors über eine CALL-Anweisung, oder mit einer USING-Klausel, wird von Adaptive Server Enterprise nicht unterstützt.
In Adaptive Server Enterprise können Transact-SQL-Prozeduren und -Funktionen mehrere DECLARE CURSOR-Anweisungen mit demselben Cursornamen enthalten. In Adaptive Server Enterprise wird die DEALLOCATE CURSOR-Anweisung verwendet, um einen Cursor aus dem aktuellen Bereich zu eliminieren, damit eine nachfolgende OPEN-Anweisung den richtigen, zuvor deklarierten Cursor referenzieren kann. Diese Funktion wird in SQL Anywhere nicht unterstützt. In SQL Anywhere müssen alle Cursor in einem gegebenen Bereich eindeutige Namen haben. Wenn eine Transact-SQL-Dialektprozedur mehrere Cursordeklarationen mit demselben Namen enthält, wird die Prozedur ohne Fehler syntaktisch analysiert. Wenn jedoch zur Ausführungszeit eine zweite DECLARE CURSOR-Anweisung mit demselben Cursornamen ausgeführt wird, tritt ein Fehler auf.
Beachten Sie, dass das TDS Wire Protocol für Open Client- und jConnect-Verbindungen keine tatsächlich SCROLL-fähigen Ergebnismengen implementiert. Wenn Sie rückwärts durch einen Cursor blättern müssen, kann die FETCH-Anforderung sofort erfüllt werden, sofern die gewünschte Zeile sich in einem Fenster mit vorab abgerufenen Zeilen befindet, die bereits vom TDS-Client abgerufen wurden. Wenn die gewünschte Zeile außerhalb dieses Fensters liegt, kann jedoch die SELECT-Anweisung des Cursors erneut ausgeführt werden.
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'FOR READ ONLY; 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.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |