Im Kontext von SQL ruft die Anweisung 'get' Datensatzdaten aus einer Ergebnismenge ab.
EGL erstellt eine SQL-Anweisung SELECT in Ihrem generierten Code auf Basis Ihrer Anweisung 'get' und der Eigenschaften der SQL-Datensatzvariablen in dieser Anweisung. Weitere Informationen zu diesem impliziten SQL-Code finden Sie unter SQL-Datenzugriff. Alternativ können Sie eine Direktive vom Typ '#sql' verwenden, um Ihren eigenen eingebetteten SQL-Code zu schreiben (siehe sql (Direktive)). Sie können SQL-Code auch zur Ausführungszeit assemblieren, indem Sie eine EGL-Anweisung 'prepare' verwenden und anschließend diesen Code über Ihre Anweisung 'get' referenzieren. Weitere Informationen zu dieser Verwendung von dynamischem SQL-Code finden Sie unter SQL-Datenzugriff.
Wenn Sie die Option 'singleRow' angeben, steht die SQL-Anweisung SELECT für sich allein. Wenn Sie 'singleRow' nicht angeben, wird die SQL-Anweisung SELECT zu einer Klausel in einer Cursordeklaration (einer SQL-Anweisung OPEN). Weitere Informationen zu dem von EGL generierten SQL-Code finden Sie unter SQL-Datenzugriff.
EGL stellt eine Reihe von Positionsoptionen mit der Anweisung 'get' bereit (wie beispielsweise 'absolute' und 'next'), die es Ihnen ermöglichen, einen bestimmten Datensatz relativ zur aktuellen Position in der Ergebnismenge abzurufen. Hierfür müssen Sie Ihre aktuelle Position mithilfe eines Cursors überwachen. Um auf die Ergebnismenge für Ihren Cursor zugreifen zu können, verwenden Sie die EGL-Anweisung 'open', bevor Sie die positionsgebundene Anweisung 'get' verwenden. Sie können auch eine Anweisung 'get...forUpdate' verwenden. Diese Vorgehensweise ist jedoch weniger üblich.
Wenn das Ziel der Anweisung 'get' eine einzelne SQL-Datensatzvariable ist, gibt die Anweisung den ersten Datensatz zurück, der den von Ihnen bereitgestellten Kriterien (implizit oder eingebettet) entspricht. Sie können auch eine dynamische Feldgruppe aus SQL-Datensatzvariablen als Ziel der Anweisung angeben. In diesem Fall gibt die Anweisung 'get' jede übereinstimmende Zeile als Element in der Feldgruppe zurück.

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
CASE
WHEN address1 <> '' THEN address1
WHEN address2 <> '' THEN address2
END...
SELECT COLUMN01 || 10 + COLUMN02 * 5
Record MyRecordPart type SQLRecord
myField int { column = "COLUMN01 || 10 + COLUMN02 * 5" };
end
Im letzten Fall sollten Sie darüber nachdenken, Ihre eigene INTO-Klausel zu schreiben, anstatt die Eigenschaft 'column' zu setzen. Dies hat folgenden Grund: Wenn Sie eine EGL-Anweisung 'add' oder 'replace' codieren, die auf einen komplexen Wert der Eigenschaft 'column' zugreift, sind die für Sie generierten SQL-Anweisungen INSERT und UPDATE möglicherweise nicht gültig.
Schreiben Sie die INTO-Klausel in EGL, nicht in SQL. Beginnen Sie die Namen der Variablen in der Klausel nicht mit Doppelpunkten, wie es für Hostvariablen in einer SQL-Anweisung möglich ist. Weitere Informationen finden Sie unter Hostvariablen.
get myCustomer usingKeys myCustomer.customerName;
Sie
können die Suche auch auf Basis eines Felds aus einem gänzlich anderen Datensatz durchführen:get myCustomer usingKeys myOrders.customerName;
Das Feld (oder die Felder), das Sie mit 'usingKeys' angeben, wird in die WHERE-Klausel in der impliziten SQL-Anweisung integriert, die EGL aus der Anweisung 'get' generiert. Folgt auf diese Anweisung ein eingebetteter SQL-Code, setzt dieser eingebettete Code den impliziten Code außer Kraft.
Im Falle einer dynamischen Feldgruppe dürfen die Felder in der Klausel 'usingKeys' (bzw. die Hostvariablen im SQL-Datensatz) nicht in der SQL-Datensatzvariablen vorhanden sein, auf der die dynamische Feldgruppe basiert.
Wenn Sie das Schlüsselwort 'forUpdate' angeben, werden die den Schlüsselelementen zugeordneten Spalten aus den in der Klausel FOR UPDATE OF aufgelisteten Spalten ausgeschlossen.
Die Positionsoption 'next' ist auch unter anderen Umständen verfügbar.
Die Anfangsposition des Cursors (oder des Positionszeiger) für eine Ergebnismenge liegt vor der ersten Zeile der Ergebnisse. Um die Ergebnisse zu iterieren, verwenden Programme üblicherweise eine Anweisung 'forEach' oder wiederholt die Anweisung 'get next'.
Wenn Sie eine SQL-Datensatzvariable in der Anweisung 'get', aber keine eingebettete SQL-Anweisung mit der Direktive '#sql' angeben, erstellen Sie einen impliziten SQL-Code. Die implizite SQL-Anweisung SELECT weist die folgenden Merkmale auf:
SELECT Spalte01,
Spalte02,
...
SpalteNN
FROM Tabellenname
WHERE Schlüsselspalte01 = :Schlüsselfeld01
FOR UPDATE OF
Spalte01,
Spalte02,
...
SpalteNN
INTO :Datensatzfeld01,
:Datensatzfeld02,
...
:DatensatzfeldNN
EGL leitet die SQL-Klausel INTO ab, wenn die SQL-Datensatzvariable von einer eingebetteten SQL-Anweisung SELECT begleitet wird, wenn Sie keine Klausel INTO angegeben haben. Die Felder in der abgeleiteten INTO-Klausel entsprechen denen, die den aufgelisteten Spalten in der SELECT-Klausel der SQL-Anweisung zugeordnet sind. (Die Zuordnungen zwischen Feldern und Spalten befinden sich in Ihrem angepassten SQL-Datensatzabschnitt; siehe Stereotyp 'SQLRecord'.) Eine EGL-Klausel INTO ist erforderlich, wenn eine Spalte keinem Feld zugeordnet ist.
Schlüsselspalte01 >= :Schlüsselfeld01 &
Schlüsselspalte02 >= :Schlüsselfeld02 &
...
SchlüsselspalteNN >= :SchlüsselfeldNN
try
get myCustomer singleRow into customerName with
#sql{
SELECT customer_name
FROM Cusomter
WHERE customer_number = :myCustomer.customerNumber
};
onException(sqlEx SQLException)
myErrorHandler(8);
end
try
get myCustomer forUpdate into customerName with
#sql{
SELECT customer_name
FROM Cusomter
WHERE customer_number = :myCustomer.customerNumber
};
onException(sqlEx SQLException)
myErrorHandler(8); // beendet das Programm
end
myCustomer.customerName = newName; // Benutzer hat Namensänderung eingegeben
try
replace myCustomer;
onException(sqlEx SQLException)
myErrorHandler(12);
end
employees Employee[0]{rowsetsize=10};
Open resultset1 scroll with #sql{
select eID, uName, PASSWORD, fName, lName, office, sex, EMail
from EMPLOYEETEST
} for employees;
Get Next employees; //Dadurch wird die Feldgruppe 'employees' geleert und
// mit bis zu 10 der nächsten Zeilen aus der Ergebnismenge gefüllt.
or
eIDs INT[0]{};
uNames CHAR(20)[10]{};
Get Next employees into eIDs, uNames;
or
DynamicEmployee DynamicEmployee;
Get Next employees into DynamicEmployee;
Record DynamicEmployee
eIDs INT[10];
uNames CHAR(20)[10];
end
or
structuredEmployee StructuredEmployee;
Get Next employees into structuredEmployee.eIDs, structuredEmployee.uNames; //
Get Next employees into structuredEmployee;
Record StructuredEmployee
1 eIDs INT[10];
1 uNames CHAR(20)[10];
end
Jedes Managementsystem für relationale Datenbanken (RDBMS) verfügt über eine eigene SQL-Version. Nicht alle SQL-Anweisungen sind in jeder Implementierung verfügbar. Lesen Sie vor dem Codieren von eingebetteten SQL-Anweisungen die Dokumentation für Ihr RDBMS.
| Plattform | Problem |
|---|---|
| iSeries COBOL | Die Option 'absolute' wird nicht unterstützt. |