Hinweise 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:
- Alle Zeilen wurde abgerufen.
- Eine Anweisung 'exit' wird ausgeführt.
- Es tritt ein permanenter oder sporadischer Fehler auf.
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

- 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