SQL の delete に関する考慮事項

SQL のコンテキストで delete 文を使用する場合、この文はデータベースから行を除去します。 forUpdate オプションを指定した get 文または open 文を使用して、レコードをあらかじめ取り出しておく必要があります。

EGL は、SQL レコード変数の情報を使用して、現在行 (カーソルが指している行) を参照するコードに SQL DELETE 文を作成します。 以下の SQL は、EGL の delete 文に相当します。
  DELETE FROM tableName
    WHERE CURRENT OF cursor
#sql ディレクティブを使用してこの文を再書き込みするオプションはありません。 カスタム SQL DELETE 文を作成するには、EGL execute 文を使用します。

単一の EGL delete 文を使用して、 複数の SQL テーブルから行を除去することはできません。

構文

delete 文の構文図
SQLRecordVariable
EGL が単一データベース行から取り出した情報の保存先となったメモリー領域を参照します。
SQLDynamicArray
この変数は、SQL レコード変数によって構成される動的配列に名前を付けます。 EGL delete は、動的配列全体を削除します。delete ステートメントで with #sql{ExplicitCode} を使用することはできません。カーソル位置は、open または get position ステートメントを使用して設定されている必要があります。
SQLDynamicArrayElement
動的配列の要素を指定できます。EGL delete は、動的配列内の指定された行を削除します。delete ステートメントで with #sql{ExplicitCode} を使用することはできません。カーソル位置は、open または get position ステートメントを使用して設定されている必要があります。
explicitCode
独自の SQL DELETE 文を組み込むことで、EGL が生成する暗黙のコードをオーバーライドできます。
deleteOptions
以下のオプションを使用して、EGL が生成する暗黙の SQL コードを制御することができます。
cursor
EGL に WHERE CURRENT OF cursorID 文節を作成するよう通知します。 get 文または open 文を使用して結果セットを作成しておく必要があります。 EGL ではこれらの文が作成したカーソルに直接アクセスできないためです。 EGL は、SQL レコード変数名を使用してこの cursorID を見つけます。 これはデフォルト・オプションです。
nocursor
このオプションは標準的な WHERE 文節を生成します。 keyItems プロパティーを含む明示的な SQL ステートメントまたはレコードも指定する必要があります。検証では、 nocursorusingKeys を同じステートメントに指定することは許可されていません。
usingKeys
このオプションは、SQLRecordVariable のフィールドを指定して、SQL WHERE 文節の条件を指定します。 これらのフィールドは、削除対象のデータベース行の対応する列と一致する必要があります。
注: 複数行操作の場合、EGL は usingKeys をサポートしません。
from resultSetID
次の各条件が true である場合は、前の EGL get 文または open 文から結果セット ID を指定する必要があります。
  • 組み込み SQL 文 (#sql ディレクティブを使用して) を使用して、結果セットを作成した。
  • コードが、EGL が生成した暗黙の SQL の列セットとは異なる、更新用列セットを取り出した。
EGL が通常この SQL レコード変数用に作成するデフォルトの結果セット以外のものを使用する場合には、結果セット ID を指定します。

以下に、SQL の delete 文の例を示します。

  try
    get dept forUpdate;
    dept.description = "Test Engineers";
    delete dept;
    commit();
  onException(sqlEx SQLException)
    sqlFailure();     
  end 

次の例は、複数行に対する delete ステートメントを示しています。

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]; //this deletes the second row in the row set using 
//“WHERE CURRENT OF CS1”
i int = 2;
Delete employees[i]; //the index could be a variable
Delete employees;    //this deletes the whole row set from current cursor

互換性

表 1. delete の互換性に関する考慮事項
プラットフォーム 問題
COBOL 生成 COBOL のパフォーマンスを最適にするために、delete ステートメントには常に from resultSet 文節を組み込んでください。
SQL Server 複数行の delete lastget last を同時に使用することはできません。両方のステートメントを一度に実行すると、結果セットは閉じられます。
DB2® for i5/OS™ ジャーナル処理を使用可能にするか、接続ストリングに transation isolation=none を追加する必要があります。

フィードバック