Überlegungen zu 'forEach' mit SQL

Die EGL-Anweisung 'forEach' liest eine SQL-Ergebnismenge durch und führt EGL-Anweisungen für sämtliche Zeilen aus. Sie müssen die Ergebnismenge zuvor mithilfe einer EGL-Anweisung 'open' oder 'get' erstellt haben. Wenn die Ergebnismenge nicht verfügbar ist, kann die Anweisung nicht verarbeitet werden, und es tritt ein permanenter E/A-Fehler auf. Die Schleife wird so lange fortgesetzt, bis eines der folgenden Ereignisse eintritt:

In den meisten Fällen gibt die EGL-Laufzeit nach der letzten Iteration der Schleife eine implizite SQL-Anweisung CLOSE aus. Da diese implizite Anweisung die SQL-Systemvariablen ändert, müssen Sie die Werte der SQL-Systemvariablen im Hauptteil der Anweisung 'forEach' speichern.

Die EGL-Laufzeit führt die SQL-Anweisung CLOSE nicht aus, wenn die Anweisung 'forEach' aufgrund eines anderen Fehlers als 'noRecordFound' (kein Datensatz gefunden) beendet wird.

Syntax

Syntaxdiagramm für die Anweisung 'forEach'
Bezeichnung
Eine Bezeichnung, gefolgt von einem Doppelpunkt, auf die eine Anweisung vom Typ 'continue' oder 'exit' verweisen kann. Weitere Informationen finden Sie unter Bedingte Anweisungen und Schleifenanweisungen.
SQL-Datensatz
Die SQL-Datensatzvariable, auf die Sie in der Anweisung 'open' oder 'get' verwiesen haben, mit der die Ergebnismenge erstellt wurde. Sie müssen entweder einen SQL-Satz oder eine ID einer Ergebnismenge angeben.
Ergebnismengen-ID
Eine Kennung Ihrer Wahl, die Sie in der Anweisung 'open' oder 'get' angegeben haben, mit der die Ergebnismenge erstellt wurde, die gelesen werden soll.
Ziel
Die von EGL generierte SQL-Klausel INTO verwendet die hier angegebenen Informationen. Dies sind die EGL-Hostvariablen, die Werte von der SQL-Anweisung FETCH empfangen, die die Anweisung 'forEach' für jede Zeile in der Ergebnismenge generiert. Wenn Sie einen Datensatznamen angeben, verwendet EGL alle Felder in dem Datensatz. Stellen Sie dem Namen einer Hostvariablen keinen Doppelpunkt voran (siehe Hostvariablen).

Durch das Erstellen einer INTO-Klausel in diesem Kontext werden alle INTO-Klauseln aus der zugehörigen Anweisung 'open' außer Kraft gesetzt.

Anweisung
Eine EGL-Anweisung, die für jede Zeile der Ergebnismenge ausgeführt werden soll.

Beispiel

Das folgende Beispiel veranschaulicht die Vorgehensweise zum Ändern eines Datenbankdatensatzes in die Datei für einen Kunden (Customer):
vgVar.handleHardIOErrors  = 1;

try
  open myResults for myCustomer
    with #sql{
      SELECT customer_number, customer_name
      FROM Customer
      WHERE customer_number >= :myCustomer.customerNumber
      FOR UPDATE OF customer_name
    }
    into myCustomer.customerNumber, myCustomer.customerName;
onException(sqlEx SQLException)
  meinFehlerHandler(6);    // beendet das Programm
end

try 
  forEach (from myResults)
    // Nachname kommt zuerst
    reverseName(myCustomer.customerName);

    try
      execute
        #sql{
          UPDATE Customer
          SET customer_name = :myCustomer.customerName
          WHERE CURRENT OF myResults
        };
    onException(sqlEx SQLException)
      meinFehlerHandler(10);    // beendet das Programm
    end
  end  
  
onException(sqlEx SQLException)
  meinFehlerHandler(8);    // beendet das Programm
end

sysLib.commit();

Fehlerbedingungen

Der SQLCODE 100 gibt an, dass keine übereinstimmenden Daten gefunden wurden. Bei diesem Fehler wird der forEach-Block normal beendet. In diesem Fall führt EGL keinen onException-Block im Zusammenhang mit 'forEach' aus. Sie brauchen einen onException-Block nicht mit einem Test wie dem im folgenden Beispiel zu beginnen:
onException(sqlEx SQLException)
  if (sqlcode != 100)  // unnötiger Test

Feedback