Überlegungen 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

Syntaxdiagramm für die Anweisung 'delete'
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.
Wenn Sie nicht mit der Standardergebnismenge arbeiten, die EGL normalerweise für diese SQL-Datensatzvariable erstellt, geben Sie eine Ergebnismengen-ID an.

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

Tabelle 1. Hinweise zur Kompatibilität für Löschen
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.

Feedback