Im Kontext von SQL erstellt die EGL-Anweisung 'open' eine Ergebnismenge auf Basis einer relationalen Datenbank sowie einen Cursor, mit dessen Hilfe Sie die Liste durchsuchen können.
EGL ermöglicht Ihnen keinen direkten Zugriff auf diesen Cursor. Stattdessen werden positionsgebundene Optionen mit der Anweisung 'get' bereitgestellt (siehe Überlegungen zu 'get' mit SQL). Nach Ausführung der Anweisung 'open' zeigt der Cursor auf die erste Zeile (den ersten Datensatz) in der Ergebnismenge.

Cursor, für die Sie die Option 'hold' angeben, werden bei einem Commit nicht geschlossen. Bei einem Rollback oder einer Datenbankverbindung werden hingegen alle Cursor geschlossen. Geben Sie die Option 'hold' nicht an, wenn Sie die Cursorposition bei einem Commit nicht beizubehalten brauchen.
Weitere Informationen finden Sie unter 'Kompatibilität' in diesem Thema.
Wenn Sie keine Klausel 'usingKeys' angeben, basiert die Schlüssel/Wert-Komponente der impliziten Anweisung auf dem SQL-Datensatzabschnitt, der in der Anweisung 'open' referenziert wird.
Wenn Sie das Schlüsselwort 'forUpdate' angeben, werden die den Schlüsselelementen zugeordneten Spalten aus den in der SQL-Klausel FOR UPDATE OF aufgelisteten Spalten ausgeschlossen. Wenn Sie das Schlüsselwort 'forUpdate' nicht angeben, werden nur die den Schlüsselelementen zugeordneten Spalten in die Liste der Spalten in der SQL-Klausel ORDER BY eingeschlossen.
Wenn Sie eine eingebettete SQL-Anweisung angeben, wird jeder implizite Code ignoriert, den EGL ansonsten möglicherweise generiert.
customer CustomerRecordPart{};
get customer with #sql{
select MySCHEMA.CUSTOMER.Column01
from MYSCHEMA.CUSTOMER
where MYSCHEMA.Column02 = "AZ"};
Record CustomerRecordPart type SQLRecord {tableNames = [["MYSCHEMA.CUSTOMER"]]}
customerNumber INT {column = "MYSCHEMA.CUSTOMER.Column01"};
...
end
In der zuvor beschriebenen Anweisung 'get' oder 'open' muss die für einen Spaltennamen in der SQL-Klausel SELECT verwendete Qualifizierung mit der Qualifizierung übereinstimmen, die für das entsprechende Feld im Datensatzabschnitt verwendet wird.
SELECT Spalte01,
Spalte02, ...
SpalteNN
INTO :Datensatzfeld01,
:Datensatzfeld02, ...
:DatensatzfeldNN
FROM Tabellenname
WHERE Schlüsselspalte01 = :Schlüsselfeld01
FOR UPDATE OF
Spalte01,
Spalte02, ...
SpalteNN
Sie können die Standardanweisung überschreiben, indem Sie eine eingebettete SQL-Anweisung in der EGL-Anweisung 'open' angeben (mithilfe der Direktive #sql).
Die folgenden Beispiele setzen eine SQL-Datensatzvariable namens 'myCustomer' voraus:
open myCustomerResults forUpdate for myCustomer;
open x1 with
#sql{
SELECT customer_number,
customer_name,
customer_balance
FROM Customer
WHERE customer_number >= :myCustomer.customerNumber
FOR UPDATE OF
:myCustomer.customerNumber,
:myCustomer.customerName,
:myCustomer.customerBalance
}
open x2 with
#sql{
SELECT customer_name, customer_balance
FROM Customer
WHERE customer_number = :myCustomer.customerNumber
}
for myCustomer;
open x3 with
#sql{
call aResultSetStoredProc(:parameter)
}
Wenn Sie 'hold' nicht angeben, schlägt die erste Ausführung des vierten Teils von Schritt 3 fehl, da der Cursor nicht mehr offen ist.
Jedes Managementsystem für relationale Datenbanken (RDBMS) verfügt über eine eigene SQL-Version. Nicht alle SQL-Befehle sind in jeder Implementierung verfügbar. Bevor Sie eine eingebettete SQL-Anweisung codieren, lesen Sie die Dokumentation für Ihr Managementsystem für relationale Datenbanken.
| Plattform | Problem |
|---|---|
| Java-Generierung | Die Option 'hold' ist für Java-Programme nur dann verfügbar, wenn der JDBC-Treiber JDBC ab Version 3.0 unterstützt. |
| CICS | Wenn das Programm im Segmentmodus ausgeführt wird, beendet eine Anweisung 'converse' die CICS-Transaktion und verhindert, dass das Programm eine Datei- oder Datenbankposition beibehält, und zwar auch dann, wenn Sie das Schlüsselwort 'hold' in der Anweisung 'open' verwenden. |
| IMS/VS | Jede Anweisung 'converse' wird im Segmentmodus ausgeführt. Eine solche Anweisung beendet die IMS-Transaktion und verhindert, dass das Programm eine Datei- oder Datenbankposition beibehält, und zwar auch dann, wenn Sie das Schlüsselwort 'hold' in der Anweisung 'open' verwenden. |
| Cloudscape- oder Derby-Datenbanken | EGL unterstützt keine Anweisung 'open', die sowohl das Flag 'scroll' als auch das Flag 'forUpdate' verwendet. Sie können in der Anweisung immer nur eines der Flags verwenden. |