Wiederholt die Ausführung einer Anweisungsliste einmal für jede Zeile in einem Cursor.
[ statement-label : ] FOR for-loop-name AS cursor-name [ cursor-type ] CURSOR { FOR statement [ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ] | USING variable-name } DO statement-list END FOR [ statement-label ]
cursor-type : NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE
cursor-concurrency : BY { VALUES | TIMESTAMP | LOCK }
variable-name : identifier
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.
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 Die Werte und die Zugehörigkeit eines als INSENSITIVE deklarierten Cursors werden über dessen gesamte Anwendungsdauer hinweg festgelegt. Die Ergebnismenge der SELECT-Anweisung wird beim Öffnen des Cursors materialisiert. Ein FETCH-Abruf aus einem INSENSITIVE-Cursor berücksichtigt nicht die Auswirkungen anderer INSERT-, UPDATE-, MERGE-, PUT- oder DELETE-Anweisungen aus allen Verbindungen, einschließlich der Verbindung, die den Cursor geöffnet hat.
SENSITIVE-Klausel Ein als SENSITIVE (empfindlich) deklarierter Cursor erkennt Änderungen der Zugehörigkeit oder der Ergebnismengenwerte.
FOR UPDATE-Klausel 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.
FOR READ ONLY-Klausel Ein als FOR READ ONLY deklarierter Cursor kann nicht in (positionsbasierten) UPDATE- und DELETE- sowie in PUT-Anweisungen verwendet werden. 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, es sei denn, die Datenbankoption ansi_update_constraints ist auf OFF gesetzt. 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.
Die FOR-Anweisung ist eine Steueranweisung, die es Ihnen ermöglicht, eine Liste von SQL-Anweisungen einmal für jede Zeile in einem Cursor auszuführen. Die FOR-Anweisung entspricht einer zusammengesetzten Anweisung aus einer DECLARE-Anweisung für den Cursor und einer DECLARE-Anweisung für eine Variable für jede Spalte in der Ergebnismenge des Cursors, gefolgt von einer Schleife, die eine Zeile aus dem Cursor in die lokalen Variablen abruft und die statement-list einmal für jede Zeile im Cursor ausführt.
Gültige Cursortypen sind Dynamic scroll (Standardwert), Scroll, No scroll, Sensitive und Insensitive.
Name und Datentyp jeder lokalen Variablen werden aus der im Cursor verwendeten statement abgeleitet. Mit einer SELECT-Anweisung werden die Datentypen verwendet, die in den Ausdrücken der Auswahlliste aufgeführt sind. Die Namen sind die Aliasnamen der Auswahllistenelemente, wenn diese vorhanden sind. Andernfalls werden die Namen der Spalten verwendet. Jedes Auswahllistenelement, das keine einfache Spaltenreferenz ist, muss ein Alias haben. Bei einer CALL-Anweisung werden die Namen und Datentypen der RESULT-Klausel in der Prozedurdefinition entnommen.
Die LEAVE-Anweisung kann verwendet werden, um die Ausführung bei der ersten Anweisung nach END FOR wieder aufzunehmen. Wenn das statement-label am Ende angegeben ist, muss es mit dem statement-label am Anfang übereinstimmen.
Der durch eine FOR-Anweisung erstellte Cursor wird implizit als WITH HOLD geöffnet, sodass innerhalb der Schleife ausgeführte Anweisungen, die ein COMMIT verursachen, nicht den Cursor schließen.
Keine.
Keine.
SQL/2008 Die FOR-Anweisung ist Teil der optionalen SQL/2008-Sprachenfunktion P002 (Verarbeitungsvollständigkeit). Die USING-Klausel der FOR-Anweisung ist eine Erweiterung des Herstellers. Wie bei der DECLARE CURSOR-Anweisung ist die Verwendung von cursor-concurrency (Cursorparallelität) eine Erweiterung des Herstellers, ebenso die Kombinationen aus Optionen für Cursorempfindlichkeit und SCROLL-Fähigkeit.
Das folgende Fragment veranschaulicht die Verwendung einer FOR-Schleife.
FOR names AS curs INSENSITIVE CURSOR FOR SELECT Surname FROM Employees DO CALL search_for_name( Surname ); END FOR; |
Dieses Fragment veranschaulicht die Verwendung einer FOR-Schleife.
BEGIN FOR names AS curs SCROLL CURSOR FOR SELECT EmployeeID, GivenName FROM Employees where EmployeeID < 130 FOR UPDATE BY VALUES DO MESSAGE 'emp: ' || GivenName; END FOR; END |
Im folgenden Beispiel wird gezeigt, wie eine FOR-Schleife in einer Prozedur namens myproc verwendet wird, die die ersten 10 Mitarbeiter aus der Employees-Tabelle basierend auf der Sortierreihenfolge zurückgibt, die beim Aufruf der Prozedur angegeben wurde (asc für aufsteigend und desc für absteigend).
CALL sa_make_object( 'procedure', 'myproc' ) ; ALTER PROCEDURE myproc ( IN @order_by VARCHAR(20) DEFAULT NULL ) RESULT ( Surname person_name_t ) BEGIN DECLARE @sql LONG VARCHAR; DECLARE @msg LONG VARCHAR; DECLARE LOCAL TEMPORARY TABLE temp_names( surnames person_name_t ); SET @sql = 'SELECT TOP(10) * FROM Employees AS t ' ; CASE @order_by WHEN 'asc' THEN SET @sql = @sql || 'ORDER BY t.Surname ASC'; SET @msg = 'Sorted ascending by last name: '; WHEN 'desc' THEN SET @sql = @sql || 'ORDER BY t.Surname DESC'; SET @msg = 'Sorted ascending by last name: '; END CASE; FOR loop_name AS SCROLL CURSOR USING @sql DO INSERT INTO temp_names( surnames ) VALUES( Surname ); MESSAGE( @msg || Surname ) ; END FOR; SELECT * FROM temp_names; END ; |
Der Aufruf der Prozedur myproc und die Angabe von asc (z.B. CALL myproc( 'asc' );
) gibt folgende Ergebnisse zurück:
Surname |
---|
Ahmed |
Barker |
Barletta |
Bertrand |
Bigelow |
Blaikie |
Braun |
Breault |
Bucceri |
Butterfield |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |