Deklariert einen Cursor.
DECLARE cursor-name [ UNIQUE ] [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR FOR { select-statement | statement-name | call-statement }
DECLARE cursor-name [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR { FOR select-statement | FOR call-statement | USING variable-name }
cursor-name : identifier
statement-name : identifier | hostvar
variable-name : identifier
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.
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.
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 wertsensitiven Cursor kann ein nachfolgendes Abrufen einer zuvor abgerufenen Ergebniszeile eine Warnung oder einen Fehler zurückgeben, wenn die zugrunde liegende Zeile geändert oder gelöscht wurde.
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.
SENSITIVE-Klausel Ein als SENSITIVE (empfindlich) deklarierter Cursor erkennt Änderungen der Zugehörigkeit oder der Ergebnismengenwerte.
FOR statement-name-Klausel 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.
USING variable-name-Klausel 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 beim Verarbeiten der DECLARE-Anweisung verfügbar sein und muss deshalb entweder ein Parameter für die Prozedur sein oder innerhalb einer anderen BEGIN…END-Anweisung verschachtelt werden, nachdem der Variablen ein Wert zugeordnet wurde.
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).
Wenn eine einzige Anweisung verarbeitet wird, müssen alle DECLARE CURSOR-Anweisungen unterschiedliche Namen verwenden, auch wenn die Cursor in nicht überlappenden Bereichen deklariert werden. Der Cursor kann jedoch nur innerhalb der zusammengesetzten Anweisung verwendet werden, die ihn deklariert.
Der Typ des Cursors in einer DECLARE CURSOR-Anweisung kann den Ausführungsplan festlegen, der vom Abfrageoptimierer für diese Anweisung ausgewählt wird. Beispiel: Ein INSENSITIVE-Cursor über einer SELECT-Anweisung erfordert die vollständige Materialisierung von der Ergebnismenge der SELECT-Anweisung, wenn der Cursor geöffnet wird. Die Art des Cursors muss mit den Merkmalen der zugrunde liegenden Anweisung übereinstimmen. Wenn es keine Übereinstimmung zwischen dem Cursortyp und der Anweisung gibt, kann der Cursortyp automatisch geändert werden. Beispiel: Ein INSENSITIVE-Cursor steht mit einer aktualisierbaren SELECT-Anweisung in Konflikt, die FOR UPDATE angibt, weil per definitionem die INSENSITIVE-Cursor schreibgeschützt sind. In diesem Fall wird der Cursortyp automatisch von INSENSITIVE auf einen aktualisierbaren, wertempfindlichen Cursor geändert, wenn der Cursor geöffnet wird.
Wenn die Aktualisierbarkeit einer SELECT-Anweisung, die in eine Cursordeklaration eingebettet ist, nicht angegeben wird, wird sie aus der Einstellung der Option ansi_update_constraints ermittelt.
Keine.
Wenn der Cursortyp geändert werden muss, um die Anforderungen der zugrunde liegenden Anweisung zu erfüllen, wird beim Öffnen des Cursors eine Warnung zurückgegeben.
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.
Scrollfähige 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.
WITH HOLD wird als Klausel der OPEN-Anweisung angegeben statt als Klausel der DECLARE CURSOR-Anweisung, wie in SQL/2008 definiert.
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 scrollfähig, 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 scrollfä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.
Um eine Sperre auf eine abgerufene Zeile zu setzen, müssen Sie den HOLDLOCK-Tabellen-Hint verwenden.
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 scrollfä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 GROUPO.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 GROUPO.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 GROUPO.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 |
Dieses Beispiel zeigt, wie die USING-Klausel als Parameter für die Prozedur verwendet wird:
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; |
Dieses Beispiel zeigt, wie die USING-Klausel innerhalb einer BEGIN…END-Anweisung verschachtelt wird, nachdem variable-name ein Wert zugewiesen wurde.
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; |
Im folgenden Beispiel wird ein Fehler zurückgegeben, da die beiden Cursornamen in der Anweisung nicht eindeutig sind:
BEGIN BEGIN DECLARE MyCursor DYNAMIC SCROLL CURSOR FOR SELECT 1; END; BEGIN DECLARE MYCursor DYNAMIC SCROLL CURSOR FOR SELECT 2; END; END; |
Im folgenden Beispiel wird ein Fehler zurückgegeben, da der Cursor nicht innerhalb der Anweisung deklariert wurde, die versucht, ihn zu öffnen.
BEGIN BEGIN DECLARE MyCursor DYNAMIC SCROLL CURSOR FOR SELECT 1; END; BEGIN OPEN MyCursor; END; END; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |