Hinweise zu 'delete' mit SQL
Wenn Sie die Anweisung 'delete' im Kontext von SQL verwenden, entfernt diese Anweisung eine Zeile aus einer Datenbank. Sie müssen den Datensatz zuvor mithilfe einer Anweisung 'get' oder 'open' mit der Option 'forUpdate' abgerufen haben.
EGL verwendet die Informationen in Ihrer SQL-Datensatzvariablen, um eine SQL-Anweisung DELETE in Ihrem Code zu erstellen, der die
aktuelle Zeile (auf die der Cursor zeigt) referenziert. Die folgende SQL-Anweisung ist äquivalent zur EGL-Anweisung
'delete':
DELETE FROM Tabellenname
WHERE CURRENT OF Cursor
Sie haben nicht die Möglichkeit, diese Anweisung mithilfe der Direktive
'#sql' neu zu schreiben. Verwenden Sie die EGL-Anweisung 'execute', um eine angepasste SQL-Anweisung DELETE
zu schreiben.Eine einzelne EGL-Anweisung 'delete' kann nicht zum Entfernen von Zeilen aus mehreren SQL-Tabellen verwendet werden.
Syntax

- SQL-Datensatzvariable
- Verweist auf einen Speicherbereich, in dem EGL abgerufene Informationen aus einer einzelnen Datenbankzeile gespeichert hat.
- dynamische_SQL-Feldgruppe
- Diese Variable benennt eine dynamische Feldgruppe, die sich aus SQL-Datensatzvariablen zusammensetzt. Mit der EGL-Anweisung 'delete' wird die gesamte dynamische Feldgruppe gelöscht. Mit der Anweisung 'delete' kann nicht with #sql{expliziter_Code} verwendet werden. Die Cursorposition muss mithilfe einer Anweisung 'open' oder 'get position' erstellt worden sein.
- Element_in_dynamischer_SQL-Feldgruppe
- Sie können ein Element einer dynamischen Feldgruppe angeben. Mit der EGL-Anweisung 'delete' wird die angegebene Zeile in der dynamischen Feldgruppe gelöscht. Mit der Anweisung 'delete ' kann nicht with #sql{expliziter_Code} verwendet werden. Die Cursorposition muss mithilfe einer Anweisung 'open' oder 'get position' erstellt worden sein.
- expliziter_Code
- Sie können Ihre eigene SQL-Anweisung DELETE einbetten, um den von EGL generierten impliziten Code zu überschreiben.
- Löschoptionen
- Mit den folgenden Optionen können Sie den von EGL generierten impliziten Code steuern:
- cursor
- Weist EGL an, eine Klausel vom Typ WHERE CURRENT OF Cursor-ID zu erstellen. Sie müssen zuvor eine Ergebnismenge mithilfe von 'get' oder 'open' erstellt haben, da EGL keinen direkten Zugriff auf den Cursor bereitstellt, der von diesen Anweisungen erstellt wird. EGL verwendet den Namen der SQL-Datensatzvariablen, um diese Cursor-ID zu suchen. Dies ist die Standardoption.
- nocursor
- Diese Option generiert eine Standardklausel WHERE. Darüber hinaus müssen Sie entweder eine explizite SQL-Anweisung angeben oder einen Datensatz, der die Eigenschaft 'keyItems' einschließt. Für die Auswertung dürfen Sie 'nocursor' und 'usingKeys' nicht in derselben Anweisung angeben.
- usingKeys
- Diese Option liefert die Bedingungen für eine SQL-Klausel WHERE, indem die Felder aus 'SQL-Datensatzvariable' angegeben werden. Diese
Felder müssen mit den entsprechenden Spalten in den zu löschenden Datenbankzeilen übereinstimmen.Anmerkung: Bei Multiple-Row-Operationen wird 'usingKeys' von EGL nicht unterstützt.
- from Ergebnismengen-ID
- Sie müssen die Ergebnismengen-ID aus einer vorherigen EGL-Anweisung 'get' oder 'open' angeben, wenn die folgenden
Bedingungen zutreffen:
- Sie haben eingebettete SQL-Anweisungen (mithilfe der Direktive '#sql') verwendet, um die Ergebnismenge zu erstellen.
- Dieser Code hat andere Gruppen von Spalten für die Aktualisierung abgerufen als die Gruppen in der impliziten SQL-Anweisung, die von EGL generiert wurde.
Beispiel
Das folgende Beispiel zeigt die Anweisung 'delete' für SQL:
try
get dept forUpdate;
dept.description = "Test Engineers";
delete dept;
commit();
onException(sqlEx SQLException)
sqlFailure();
end
Das folgende Beispiel zeigt die Anweisung 'delete' für eine Multiple-Row-Operation:
employees Employee[0]{rowsetsize=10};
Open resultset1 forUpdate with #sql{
select eID, uName, PASSWORD, fName, lName, office, sex, EMail
from EMPLOYEETEST
} for employees;
Get Next employees;
Delete employees[2]; //Hierduch wird die zweite Zeile in der Zeilengruppe mit
//“WHERE CURRENT OF CS1” gelöscht.
i int = 2;
Delete employees[i]; //Der Index könnte eine Variable sein.
Delete employees; //Hierdurch wird die gesamte Zeilengruppe des aktuellen Cursors gelöscht.
Kompatibilität
| Plattform | Problem |
|---|---|
| COBOL-Generierung | In COBOL wird die beste Leistung erzielt, wenn stets die Klausel 'from Ergebnismenge' in die Anweisung 'delete' eingeschlossen wird. |
| SQL Server | Die Anweisungen 'delete last' und 'get last' für Multiple-Row-Funktionen können nicht zusammen verwendet werden. Die Ergebnismenge wird geschlossen, wenn beide Anweisungen einmal ausgeführt werden. |
| DB2 for i5/OS | Die Journalfunktion muss aktiviert sein, oder 'transaction isolation=none' muss der Verbindungszeichenfolge hinzugefügt werden. |