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 (E-O)

 

FOR-Anweisung

Mit dieser Anweisung wiederholen Sie die Ausführung einer Anweisungsliste einmal für jede Zeile in einem Cursor.

Syntax
[ Anweisungsbez : ]
FOR FOR_Schleifenname AS Cursorname [ Cursortyp ] CURSOR
 { FOR Anweisung [ FOR { UPDATE Cursorparallelität | FOR READ ONLY } ]
   | USING Variablenname }
    DO Anweisungsliste
END FOR [ Anweisungsbez ]
Cursortyp : 
NO SCROLL
   | DYNAMIC SCROLL
   | SCROLL
   | INSENSITIVE
   | SENSITIVE
  

Cursorparallelität :
  BY { VALUES | TIMESTAMP | LOCK }
Variablenname :  Bezeichner
Parameter
  • 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 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 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.

  • READ ONLY-Klausel   Ein Cursor, der als FOR READ ONLY deklariert wurde, kann weder in einem (positionsbasierten) UPDATE- noch in einem (positionsbasierten) DELETE-Vorgang 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. 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.

Bemerkungen

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 Anweisungsliste einmal für jede Zeile im Cursor ausführt.

Gültige Cursortypen sind Dynamic scroll (default), Scroll, No scroll, Sensitive und Insensitive.

Name und Datentyp jeder lokalen Variablen werden aus der im Cursor verwendeten Anweisung 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 Anweisungslabel am Ende angegeben ist, muss es mit dem Anweisungslabel am Anfang übereinstimmen.

Berechtigungen

Keine.

Nebenwirkungen

Keine.

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Persistent Stored Module-Funktion.

Beispiel

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