DELETE ステートメント

DELETE ステートメントは、表またはビューから行を削除します。 ビューから行を削除すると、このビューに対して INSTEAD OF DELETE トリガーが定義されていない場合、ビューの基になっている表から行が削除されます。 そのようなトリガーが定義されている場合、代わりにトリガーが活動化されます。

表またはビューは、現行サーバー、または現行サーバーが接続を確立できる任意の Db2 サブシステムにすることができます。

このステートメントには、以下の 2 つの形式があります。

  • 検索 DELETE 形式は、検索条件により任意に決定 される 1 つ以上の行を削除します。
  • 位置付け DELETE は、現行カーソル位置に対応する 1 つ以上の行を削除するように指定します。

呼びかけ DELETE

このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 位置付け DELETE は、アプリケーション・プログラムに組み込まれます。 組み込み形式および対話形式 の両方とも、動的に準備される実行可能ステートメントです。

承認 DELETE

必要な権限は、このステートメントで指定するオブジェクトが、ユーザー定義の 表、カタログ表、またはビューのいずれであるのか、およびステートメントが検索 DELETE であるかどうか、さらに SQL 標準規則が有効かどうかによって異なります。

カタログ表以外の表を指定する場合: 特権セットには、 少なくとも次のいずれかが含まれていなければいけません。

  • 表に対する DELETE 特権
  • 表の所有権
  • 表を含むデータベースに対する DBADM 権限
  • SYSADM 権限

データベースが暗黙的に作成される場合、データベース特権は暗黙的なデータベースまたは DSNDB04 上になければなりません。

カタログ表を指定する場合: 特権セットには、 少なくとも次のいずれかが含まれていなければいけません。

  • カタログ・データベースに対する DBADM 権限
  • SYSCTRL 権限
  • SYSADM 権限

ビューを指定する場合: 特権セットには、 少なくとも次のいずれかが含まれていなければいけません。

  • ビューに対する DELETE 特権
  • SYSADM 権限
検索 DELETE の中の search-condition に表またはビューの列への参照が含まれている場合、または assignment-clause の中の expression に表またはビューの列への参照が含まれている場合、特権セットには次の特権のうち少なくとも 1 つが含まれている必要があります。
  • 表またはビューに対する SELECT 特権
  • 表またはビューの所有権
  • 表を含むデータベースに対する DBADM 権限 (ターゲットが表であり、かつカタログ表ではない場合)
  • DATAACCESS
  • SYSADM 権限

検索されたDELETE の検索条件にサブクエリが含まれる場合、または代入節に スカラー型フルセレクトまたは行型フルセレクトが含まれる場合は、必要な権限の説明については、 クエリの権限を参照してください。

ビューの所有者は、表の所有者とは異なり、そのビューに対する DELETE 権限 を持っていない場合があります (あるいは、DELETE 権限を持っていても、他 の人にその権限を付与できない場合もあります)。 ビューの中には、それ自体が持っている性質のために、DELETE の オブジェクトとして使用できないものもあります。 詳細はCREATE VIEW文の権限の説明を参照してください。

アプリケーション・プログラムにこの ステートメントを組み込む場合、特権セットは、プランまたはパッケージの所有者が持つ特権となります。 ステートメントが動的に準備された場合、権限セットは、DYNAMICRULESの動作(実行、バインド、定義、または呼び出し)によって決定され、 表1 にまとめられています。 (これらの動作の詳細については、それらを決定するDYNAMICRULESバインドオプション値の一覧を含め、「Authorization IDs and dynamic SQL」 を参照してください。)

変更の開始FL 509 ステートメントが改ざん防止監査ポリシーの対象である SYSIBM.SYSAUDITPOLICIES カタログ・テーブルの行を削除しようとする場合、追加の RACF® 認証が必要です。 ステートメントの実行中、 RACF の改ざん防止監査ポリシープロファイルへのアクセス権限は、プライマリ認証IDまたはプライマリ認証IDに関連付けられたグループのいずれかが有していなければなりません。 認証ルールに関する詳細情報は、 Db2 の監査ポリシー をご覧ください。変更の終わり

検索削除:

構文図を読むビジュアルシンタックスダイアグラムをスキップする DELETE FROM table-nameview-name period-clause1correlation-nameインクルードカラムSETassignment-clauseWHEREsearch-conditionfetch-clause2isolation-clauseSKIP LOCKED DATAQUERYNO整数
注:
  • 1 期間指定節が指定されている場合、 フェッチ節は指定できません。
  • 2 同一の条項は、複数回指定してはならない。

位置指定削除:

構文図を読むビジュアルシンタックスダイアグラムをスキップする DELETE FROM table-nameview-name correlation-name WHERE CURRENT OF cursor-name FOR ROWhost-variable整数定数OF ROWSET

period-clause:

構文図を読むビジュアルシンタックスダイアグラムをスキップする FOR PORTION OF BUSINESS_TIME FROMvalue1TOvalue2BETWEENvalue1ANDvalue2

カラムを含む:

構文図を読むビジュアルシンタックスダイアグラムをスキップする INCLUDE ( ,カラム名Data-type )

データ・タイプ:

構文図を読むビジュアルシンタックスダイアグラムをスキップするbuilt-in-typedistinct-type

built-in-type:

構文図を読むビジュアルシンタックスダイアグラムをスキップするSMALLINTINTEGERINTBIGINTDECIMALDECNUMERIC(5,0)( 整数,0, 整数)FLOAT(53)( 整数)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( 整数)CHARACTERCHARVARYINGVARCHAR( 整数)FOR BIT DATAGRAPHIC(1)( 整数)VARGRAPHIC( 整数)BINARY(1)( 整数)BINARY VARYINGVARBINARY( 整数)DATETIMETIMESTAMP(6)(整数)WITHOUT TIME ZONEWITH TIME ZONE

割り当て句:

構文図を読むビジュアルシンタックスダイアグラムをスキップする,カラム名=NULL(,カラム名)=(,1NULL行全選択2)
注:
  • 1 とNULLキーワードの数は、 カラム名の数と一致していなければなりません。
  • 2 選択リストの列数は、 列名の数と一致していなければなりません。

分離句:

構文図を読むビジュアルシンタックスダイアグラムをスキップする WITH RRRSCS

説明の対象: DELETE

FROM テーブル名または ビュー名
削除する行がある表またはビューを指定します。 名前は、暗黙的または明示的に指定された場所名によって識別される Db2 サブシステムに存在するテーブルまたはビューを特定する必要があります。 以下のものを示す名前であってはなりません。
  • 補助表
  • 削除を行うことが認められていないカタログ表
  • 上記のカタログ表のビュー
  • 変更の開始ディレクトリー表変更の終わり
  • 読み取り専用のビュー (CREATE VIEW ステートメントを参照)
  • 変更の開始fetch-clause が指定されている場合、INSTEAD OF トリガーで定義されたビュー変更の終わり
  • 変更の開始fetch-clause が指定されている場合、作成されたグローバル一時表変更の終わり
  • 変更の開始fetch-clause が指定されている場合、アクセラレーターのみの表変更の終わり
  • システム管理のマテリアライズ照会表
  • XML 列用に暗黙的に作成される表。
  • アーカイブ対応表 (SYSIBMADM.GET_ARCHIVE グローバル変数が Y に設定され、ARCHIVESENSITIVE バインド・オプションが YES に設定され、操作が位置付け DELETE である場合)
IMS または CICS® アプリケーションでは、識別されたテーブルまたはビューを含む Db2 サブシステムは、2相コミットをサポートするリモートサーバーでなければなりません。
期間条項
期間節が削除操作のターゲットに適用されることを指定します。 同じ期間名を複数回指定することはできません。 削除操作の対象がビューの場合:
  • ビュー定義の外部全選択の FROM 節には、 アプリケーション期間テンポラル表への直接または間接的な参照を含める必要があります。
  • そのビューに関して INSTEAD OF トリガーが定義されていてはなりません。
FOR PORTION OF BUSINESS_TIME
period 文節に指定されている行の BUSINESS_TIME 期間部分の行値のみ削除が適用されることを指定します。 BUSINESS_TIME は、表に対して定義されている期間でなければなりません。

BUSTIMESENSITIVE バインド・オプションが YES に設定されている際に、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターの値が NULL でない場合には、FOR PORTION OF BUSINESS_TIME を指定してはなりません。

FROM value1 TO value2
value1 から value2 までの期間の行に削除操作が適用されることを指定します。 value1value2 以上である場合、または value1value2 が NULL 値である場合、行は削除されません。

変更の開始この文節は、inclusive-inclusive 期間には指定してはなりません。 変更の終わり

指定された期間条件について、 FROM value1 TO value2、削除の対象テーブルの行で period-name で指定された期間:

  • 開始列の値が value1 より小さく、終了列の値が value1 より大きい場合には、指定期間の開始点をオーバーラップしています。
  • 終了列の値が value2 以上で、開始列の値が value2 より小さい場合には、指定期間の終了点をオーバーラップしています。
  • 行の period-name の開始列の値が value1 以上で、行の対応する終了列の値が value2 以下の場合には、指定期間内に完全に含まれています。
  • 指定期間の開始または指定期間の終了に行がオーバーラップする場合には、指定期間の一部が含まれます。
  • 行の期間が指定期間の開始および指定期間の終了とオーバーラップする場合には、指定期間と完全にオーバーラップします。
  • period-name の両方の列が value1 以下、または value2 以上の場合には、この期間に含まれません。

行の期間 period-name が指定された期間に含まれない場合、行は削除されません。 それ以外の場合、削除操作は、PORTION OF 節の指定、および period-name の列の値が指定された期間とどのようにオーバーラップしているか (以下を参照) に基づいて適用されます。

  • 行の期間 period-name が指定された期間に完全に含まれる場合、行は削除されます。
  • 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の開始とオーバーラップする場合:
    • その行は削除されます。
    • 行の元の値を使用して行が挿入されます。ただし、終了列は value1 に設定され、他の生成列では新しい値が使用されます。
  • 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の終了とオーバーラップする場合:
    • その行は削除されます。
    • 行の元の値を使用して行が挿入されます。ただし、開始列は value2 に設定され、他の生成列では新しい値が使用されます。
  • 行の期間 period-name が指定された期間と完全にオーバーラップする場合:
    • その行は削除されます。
    • 行の元の値を使用して行が挿入されます。ただし、終了列は value1 に設定され、DATA CHANGE OPERATION として定義された列は 'I' に設定され、他の生成列では新しい値が使用されます。
    • 行の元の値を使用して行が挿入されます。ただし、開始列は value2 に設定され、DATA CHANGE OPERATION として定義された列は 'I' に設定され、他の生成列では新しい値が使用されます。

削除される行に対して既存の削除トリガーがアクティブになり、暗黙的に挿入される行に対して既存の挿入トリガーがアクティブになります。

変更の開始BETWEEN value1 AND value2変更の終わり
変更の開始FL 500 削除操作が value1 から value2 までの指定された期間の行に適用されることを指定します。 value1value2 より大きいか、value1 または value2 が NULL 値である場合、行は削除されません。 この文節は、inclusive-exclusive 期間には指定してはなりません。

BETWEEN value1 AND value2 で指定される期間文節の場合、削除のターゲットの行にある期間 period-name は、以下のいずれかの範囲を対象とします。

  • 開始列の値が value1 より小さく、終了列の値が value1 以上の場合には、指定期間の開始点をオーバーラップしています。
  • 終了列の値が value2 より大きく、開始列の値が value2 以下の場合には、指定期間の終了点をオーバーラップしています。
  • 行の period-name の開始列の値が value1 以上で、行の対応する終了列の値が value2 以下の場合には、指定期間内に完全に含まれています。
  • 指定期間の開始または指定期間の終了のいずれか一方にのみ行がオーバーラップする場合には、指定期間に一部が含まれます。
  • 行の期間が指定期間の開始および指定期間の終了とオーバーラップする場合には、指定期間と完全にオーバーラップします。
  • period-name の両方の列が value1 より小さいか、value2 より大きい場合には、この期間に含まれません。

行の期間 period-name が指定された期間に含まれない場合、行は削除されません。 そうでない場合、削除操作は以下の項目に基づいています。

  • PORTION OF 文節の指定。
  • period-name の列の値が指定期間とどのようにオーバーラップしているか。
  • spu (最小期間単位)。次のように期間の列のデータ・タイプによって異なります。
    • DATE 列を含む期間の場合、spu は 1 日です。
    • TIMESTAMP(6) 列を含む期間の場合、spu は 1 マイクロ秒です。

上記の項目に基づき、削除操作は次のように適用されます。

  • 行の期間 period-name が指定された期間に完全に含まれる場合、行は削除されます。
  • 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の開始とオーバーラップする場合:
    • その行は削除されます。
    • 行の元の値を使用して行が挿入されます。ただし、終了列は value1 - spu に設定され、他の生成列では新しい値が使用されます。
  • 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の終了とオーバーラップする場合:
    • その行は削除されます。
    • 行の元の値を使用して行が挿入されます。ただし、開始列は value2 + spu に設定され、他の生成列では新しい値が使用されます。
  • 行の期間 period-name が指定された期間と完全にオーバーラップする場合:
    • その行は削除されます。
    • 行の元の値を使用して行が挿入されます。ただし、終了列は value1 - spu に設定され、他の生成列では新しい値が使用されます。
    • 追加行の元の値を使用して行が挿入されます。ただし、開始列は value2 + spu に設定され、他の生成列では新しい値が使用されます。
変更の終わり
value1, value2
組み込みデータ・タイプの値を戻す式を指定します。 各式の結果は、指定される期間の列のデータ・タイプと比較可能である必要があります。 代入と比較で説明されている比較ルールを参照してください。 各式には、以下のサポートされているオペランドを含めることができます。
  • 定数
  • 特殊レジスター
  • 変数
  • 配列エレメント指定
  • 引数がサポートされるオペランドである組み込みスカラー関数
  • CAST 指定 (キャスト・オペランドが、サポートされるオペランドであること)
  • 算術演算子およびオペランドを使用する式

いずれの式も、期間の列の精度を超えるタイム・スタンプ精度を含んでいてはなりません。

期間の開始列と終了列が TIMESTAMP WITHOUT TIME ZONE として定義されている場合、各式はタイム・ゾーン付きのタイム・スタンプの値を戻してはなりません。

変更の開始ビューの period 文節に、非型付きパラメーター・マーカーを含めてはなりません。変更の終わり

相関名
search-condition の中で表またはビューを指定するために使用できる代替名を指定します。 (相関名の説明については、「相関名」 を参照してください。)
インクルードカラム
DELETE ステートメントが副選択、SELECT ステートメント、あるいは SELECT INTO ステートメントで使用されている外部全選択の FROM 文節でネストされている場合に、その DELETE ステートメントの結果表の中に table-nameview-name の列と一緒に組み込まれる列セットを指定します。 組み込み列は、table-name または view-name で識別される列のリストの最後に追加されます。 include-column で指定される列に値がなにも割り当てられないと、その列には NULL 値が戻されます。
INCLUDE
DELETE ステートメントの結果表に組み込まれる列のリストを指定します。 組み込み列は、DELETE ステートメントが SELECT ステートメントや SELECT INTO ステートメントの FROM 文節でネストされる場合にのみ有効です。
列名
DELETE ステートメントの結果表の列に対して名前を指定します。この名前は、table-name または view-name に指定される表またはビュー内の他組み込み列の名前と同じでなく、また、その表やビューにある列の名前とも同じではありません。
Data-type
組み込み列のデータ・タイプを指定します。 組み込み列は NULL 可能です。
built-in-type
組み込みデータ・タイプを指定します。 各組み込み型の説明についてはCREATE TABLE文を参照してください。

CCSID 1208 文節および CCSID 1200 文節を、INCLUDE 列に指定することはできません。

distinct-type
特殊タイプを指定します。 この列に対するどの長さ、精度、または位取りの各属性も、CREATE TYPE ステートメントを使用して指定された特殊タイプのソース・タイプの長さ、精度、または位取りの属性です。
SET
列への値の割り当てを設定します。
代入節
assignment-clause は、1 つ以上の column-names のリストと列に割り当てられる値のリストを設定します。 column-names で指定できるのは、assignment-clause を使用して設定できる列のみです。
列名
INCLUDE 列を指定します。

組み込み列への割り当てが処理されるのは、DELETE ステートメントが SELECT ステートメントや SELECT INTO ステートメントの FROM 文節でネストされる場合に限ります。 INCLUDE 文節で名前が付けられる列は、SET 文節を使用して設定できる列のみです。 明示的な SET 文節を使用して設定しない組み込み列には、NULL 値が戻されます。

列の新しい値を指定します。 式は 、Expressionsで説明されているタイプの式です。 集約関数を含めてはなりません。

式の中の column-name は、表またはビューの列を示すものでなければなりません。 削除される各行ごとに、式の中の列の値は、行が削除される前にその行に入っていた列の値となります。

ヌル
列の新しい値として NULL 値を指定します。 NULL 可能列にのみ NULL を指定します。
ローフルセレクト
単一行を返す全選択を指定します。 列の値はそれぞれ該当 する column-names に割り当てられます。 全選択が行を戻さない場合、各列には NULL 値が割り当てられ、削除される列が NULL 可能でない場合にはエラーが発生します。 結果に複数の行がある場合も、エラーが発生します。

削除される列を全選択が参照すると、全選択の中のそのような列の値は、その行が削除 される前にその行に入っていた列の値になります。

WHERE
削除する行を指定します。 この文節は省略しても構いません。また、指定する場合は、検索条件 またはカーソルの指定ができます。 作成済みの一時表または作成済みの一時表のビューの場合 、この文節を省略しなければなりません。 この文節が省略されると、表またはビューのすべての行が削除されます。
検索条件
SQLの言語要素に記載されている検索条件はありますか。 検索条件の中の column-name は、 副照会に含まれている列名を除いて、それぞれ表またはビューの列を示すものでなければなりません。

表またはビューの各行に検索条件が適用され、検索条件の 結果が真となった行が削除されます。

検索条件に副照会が含まれる場合、その副照会は、 検索条件が 1 つの行に適用されるたびに実行され、 その結果は検索条件の適用に使用されるものと見なされます。 実際に、相関参照を持たない副照会が実行されるのは 1 回だけ なのに対し、相関参照を持つ副照会は、1 行ごとに 1 回ずつの 実行が必要となります。

T2 が DELETE ステートメントのオブジェクト表、T1 は、そのステートメントの副照会の FROM 文節で参照される表であるとします。 T1 は、T2 で DELETE を行うことにより影響を受ける表であってはなりません。 この場合は、以下の規則が適用されます。

  • DELETE アクションの実行前に副照会結果のマテリアライズが行われていない限り、削除規則が CASCADE または SET NULL である関係において、T1 が T2 の従属表であってはなりません。
  • T2 の削除が T3 にカスケードする場合は、削除規則が CASCADE また は SET NULL である関係において、T1 が T3 の従属表であってはなりません。
変更の開始取得節変更の終わり
変更の開始FL 500 削除の影響を、対象となる行のサブセットに制限します。 詳細はフェッチ句を参照してください。変更の終わり
カーソル名の電流値
削除操作で使用するカーソルを指定します。 cursor-nameはDECLARE CURSOR文の説明で説明されているように、宣言されたカーソルを識別する必要があります。 DELETE ステートメントをプログラムに組み込む場合、 DECLARE CURSOR ステートメントには、ステートメント名ではなく、 SELECT ステートメント を入れなければなりません。

指定した表またはビューを、カーソルの SELECT ステートメントの FROM 文節にも指定しなければなりません。また、カーソルの結果表は削除可能であることが必要です。 読み取り専用結果テーブルの説明については、「読み取り専用カーソル」 を参照してください。 DELETE ステートメントのオブジェクトは、カーソルの SELECT ステートメントの WHERE 文節に指定されている副照会のオブジェクトとして指定してはいけません。

カーソルが曖昧で、プランまたはパッケージが CURRENTDATA(NO) と結合されている場合、 Db2 は、以下のいずれかで DELETE WHERE CURRENT OF が試行された場合、アプリケーションにエラーを返す可能性があります

  • ブロック・フェッチを使用しているカーソル
  • 照会並列処理を使用しているカーソル
  • このアプリケーション・プロセスまたはほかのアプリケーション・プロセスで 修正された行に位置付けられたカーソル

DELETE ステートメントを実行するときには、カーソルがオープンしていて、結果表の行または行セットに置かれている必要があります。

  • カーソルが単一行に置かれている場合は、その 1 行が削除され、削除後にカーソルはその結果表の次にある行の前に置かれます。 次の行がない場合、カーソルは最後の行の後ろに置かれます。
  • カーソルが行セットに置かれている場合は、現在行セットの行に対応する行がすべて削除され、削除後にカーソルはその結果表の次にある行セットの前に置かれます。 次の行セットがない場合、カーソルは最後の行セットの後ろに置かれます。

ビューが更新可能ビューであっても、そこに INSTEAD OF DELETE トリガーが定義されているビューを参照するカーソルに対して、位置付け DELETE を指定することはできません。

FOR ROW n OF ROWSET
現在行セットのどの行を削除するか指定します。 行セットの対応する行が削除され、カーソルは現在行セットに置かれたままになります。 行セットが単一行の場合、または行セットにある他の行が既にすべて削除されている場合、カーソルは結果表の次にある行セットの前に置かれます。 次の行セットがない場合、カーソルは最後の行セットの後ろに置かれます。

ホスト変数 または 整数定数 は、整数値 Kに割り当てられます。 ホスト変数が指定される場合、それは小数点以下ゼロ桁の正確な数値型でなければならず、インジケータ変数を含んではならず、 kは 1~32767の範囲でなければなりません。 カーソルは行セットに置かれている必要があり、指定値はカーソルによって最後に取り出された行セットに有効な値であることが必要です。

指定した行を削除することができない場合は、エラーが戻されます。 指定した行が最新に要求された行セットの境界内にあっても、現在行セットに含まれる行数が、行セットの設定時に暗黙的または明示的に要求された行数よりも少ない可能性があります。

現在行セットの特定の行を指定するセンシティブ静的カーソルを対象に位置付け DELETE を行う場合に、その行が削除ホール (つまり、結果表の行に対応する行が基本表から削除されている) として識別されていると、エラーが戻されます。

現在行セットの特定の行を指定するセンシティブ静的カーソルを対象に位置付け DELETE を行う場合に、その行が更新ホール (つまり、結果表の行に対応する行が更新されたために、SELECT ステートメントの述部の条件を満たさなくなった) として識別されていると、エラーが戻されます。

別のアプリケーション・プロセスが、SELECT ステートメントの基本表の行を削除したために、カーソルの指定している行に対応する行が基本表になくなる可能性があります。 このような行を削除しようとすると、エラーが発生します。

FOR ROW n OF ROWSET 文節を指定しない場合は、カーソルの現在位置によってステートメントの影響を受ける行が次のように決まります。

  • カーソルが単一行に置かれている場合は、その 1 行が削除されます。 その行が削除された後、カーソルはその結果表の次にある行の前に置かれます。 次の行がない場合、カーソルは最後の行の後ろに置かれます。
  • カーソルが行セットに置かれている場合は、現在行セットの行に対応する行がすべて削除されます。 その行が削除された後、カーソルはその結果表の次にある行セットの前に置かれます。 次の行セットがない場合、カーソルは最後の行セットの後ろに置かれます。
孤立化条項
ステートメントによって削除する行を見つけるときに 使用する分離レベルを指定します。
WITH
分離レベルを指定します。次のいずれかを指定できます。
RR
反復可能読み取り
RS
読み取り固定
CS
カーソル固定

ステートメントのデフォルト分離レベルは、ステートメントがバインドされているパッケージまたは プランの分離レベルです。なお、パッケージの分離がプランの分離よりも優先します。 パッケージの分離を指定しない場合、プランの分離がデフォルトになります。

SKIP LOCKED DATA
SKIP LOCKED DATA 文節では、他トランザクションが行に対して非互換ロックを保持している場合に、その行がスキップされることを示します。 これらの行は、このステートメントで指定されたどのアクセス対象の表に属していても構いません。 SKIP LOCKED DATA を使用できるのは、CS 分離または RS 分離が有効な場合に限定され、行レベル・ロックまたはページ・レベル・ロックにのみ適用されます。

DELETE ステートメントの場合、SKIP LOCKED DATA を指定できるのは、検索形式の DELETE ステートメントの中だけです。 SKIP LOCKED DATA は、有効な分離レベルが反復可能読み取り (WITH RR) または非コミット読み取り (WITH UR) であるときに指定されると、それは無視されます。 ステートメントのデフォルト分離レベルは、ステートメントが バインドされているパッケージまたはプランの分離レベルによって決まります。なお、パッケージの分離がプランの分離よりも優先します。 パッケージの分離を指定しない場合、プランの分離がデフォルトになります。

QUERYNO integer
EXPLAIN 出力とトレース・レコード内でこの SQL ステートメントに使用する番 号を指定します。 この番号は、この SQL ステートメントに関する情報が含まれる行のプラン表 の QUERYNO 列に使用されます。 この番号は、SYSIBM.SYSSTMT と SYSIBM.SYSPACKSTMT の カタログ表の QUERYNO 列でも使用されます。

この文節を省略すると、その SQL ステートメントに関連付けられる番号は、プリコンパ イル時に割り当てられたステートメント番号となります。 したがって、アプリケーション・プログラムを変更してからプリコンパイルした場合、 ステートメント番号が変更される可能性があります。

QUERYNO 文節を使用してプログラム内の SQL ステートメントに固有の番号を割り当てると、次のことに役立ちます。

  • アクセス・パスを選択するための最適化ヒントの使用を単純化する
  • SQL ステートメント・テキストとプラン表内の EXPLAIN 出力とを相関させる

最適化ヒントの有効化と使用方法の詳細については、「アクセスパスの選択に影響を与える 」を参照してください

計画表へのアクセス方法については、「EXPLAIN を使用した SQL パフォーマンスの調査 」を参照してください。

注釈 DELETE

削除操作のエラー:
削除操作の実行中にエラーが発生した場合は、変更は行われません。 位置付け DELETE の実行中にエラーが発生した場合、カーソルの位置は変わりません。 ただし、エラーのためにカーソルの位置が無効なものとなる可能性もあります。この場合、カーソルはクローズされます。 また、削除操作が原因でロールバックが行われることもあります。その場合も、カーソルはクローズされます。
カーソルの位置:
アプリケーション・プロセスが、そのいずれかのカーソルが置かれている行を削除した場合は、そのカーソルは結果表の次の行の前に置かれます。 C をカーソルとし、それが (OPEN、C による DELETE、その他の何らかのカーソルによる DELETE、 または検索 DELETE の結果として) 行 R の前の位置にあるとします。 R の派生元の基本表に影響を与える SQL データ変更ステートメントが存在する場合、C を参照する次の FETCH 操作は、必ずしも R 上の C の位置にあるとは限りません。 たとえば、操作でCをR'に配置できます。ここで R'は新しい行であり、結果テーブルの次の行になります。
ロッキング:
該当のロックがまだ存在していなければ、正常な削除操作の実行中に、1 つ以上の排他ロックが獲得されます。 コミット操作またはロールバック操作によってロックが解除されるまでは、 削除操作の効果を認知できるのはその削除を行ったアプリケーション・プロセスだけなので、ロックがかけられると、他のアプリケーション・プロセスはその表に対する操作を行うことができなくなります。 宣言済み一時表から行が削除される際には、 すべての行が削除されない限り (DELETE FROM T)、ロックは獲得されません。 宣言済み一時表からすべての行が削除されると、 その表のページに対してセグメント化表ロックが獲得され、表スペース内の他の表は影響を受けません。
トリガー:
削除操作によって、トリガーが活動化される場合があります。 トリガーによって、別のステートメントが実行されたり、削除される行に応じてエラー条件が発生したりすることがあります。 あるビューに対する DELETE ステートメントによって INSTEAD OF トリガーが活動化されると、そのトリガー内で行われる更新に対して参照保全性が検査され、トリガーを活動化させるビューの基礎表に対しては参照保全性が検査されません。
行アクセス制御または列アクセス制御も実施されている表で定義されているトリガー
行権限と列マスクは、遷移変数と遷移表の初期値には適用されません。 また、トリガー表で実施される行アクセス制御と列アクセス制御も、トリガー本体で参照されるか、またはトリガー本体で呼び出されるユーザー定義関数に引数として渡される遷移変数または遷移表で無視されます。 (遷移変数および遷移表にある機密データへのアクセスなど) トリガー・アクションで SQL ステートメントにセキュリティー上の懸念がないようにするには、トリガーを保護する必要があります。 トリガの保護に関する情報は、「CREATE TRIGGER ステートメント(基本トリガ )」および 「ALTER TRIGGER ステートメント(基本トリガ )」を参照してください。
参照保全:
指定した表、または指定したビューの基本表が親である場合、削除規則 RESTRICT または NO ACTION を指定した関係の中で、選択された行に従属行があってはなりません。 また、削除規則 RESTRICT または NO ACTION を指定した関係の中で従属行をもつ下層行に対し、削除操作のカスケードが生じないようにする必要があります。

削除操作が RESTRICT または NO ACTION の削除規則によって禁止されていない場合には、 選択された行が削除され、選択された行に従属する行もすべて削除されます。

  • 削除規則が SET NULL である関係の中で従属行になっている行にある、外部キーの NULL 可能列は NULL 値に設定されます。
  • 削除規則が CASCADE である関係において従属行になっている行は削除さ れ、これらの規則が適用されます。

NO ACTION と RESTRICT の唯一の違いは、 参照制約が強制される時期です。 RESTRICT ( IBM SQL ルール) は即時にルールを適用し、NO ACTION (SQL 標準ルール) はステートメントの最後にルールを適用します。 この相違は、複数の行を削除する自己参照制約を 組み込んでいる検索 DELETE の場合にのみ 問題となります。 NO ACTION を使用すると RESTRICT (使用できる場合) が DELETE を妨げる所では、 DELETE が正常終了するようになります。

チェック制約:
SET NULL の削除規則との関連において従属関係がある場合、 検査制約によって、親表内の行の削除を防ぐことができます。 親表内で行を削除すると従属表内の列が NULL 値に設定される場合に、列は NULL 値としてはならないというチェック制約が指定されていれば、その行は削除されません。
行アクセス制御または列アクセス制御が実施されている表で定義されている参照制約
行アクセス制御および列アクセス制御は、参照制約に影響しません。
ユーザー定義関数またはストアード・プロシージャーのネスト:
DELETE ステートメントは、暗黙的または明示的にユーザー定義関数またはストアード・プロシージャーを参照できます。 これは、SQL ステートメントのネスト として知られています。 DELETE 内でネストされているユーザー定義関数またはストアード・プロシージャーは、行を削除している表にアクセスしてはいけません。
VARBINARY 列での索引:
指定した表が VARBINARY 列に索引を持つ場合、または VARBINARY データ・タイプに基づく特殊タイプの列に索引を持つ場合、その索引列では DESC 属性を指定できません。 指定した表で SQL データ変更操作を使用するには、索引をドロップするか、列のデータ・タイプを BINARY に変更して索引を再作成します。
削除される行の数:
次に説明するものを除いて、削除操作により、SQLCA の SQLERRD(3) は削除された行数に設定されます。 この数には、CASCADE 削除規則あるいはトリガーの結果として削除された行は含まれません。

WHERE 文節のない DELETE FROM T は、T のすべての行を削除します。 表 T がセグメント化表スペースに含まれていて、親表ではない場合、この削除は T にアクセスせずに実行されます。SQLERRD (3) フィールドは -1 に設定されます。 (SQLCAの完全な説明については、上記の例外事項も含め、 SQL通信領域(SQLCA )を参照してください。

SENSITIVE STATIC 両方向スクロール・カーソルを使用した位置付け DELETE の規則:
SENSITIVE STATIC 両方向スクロール・カーソルが宣言されている場合には、次の規則が適用されます。
  • 削除ホールまたは更新ホールに対する削除の試行。 SENSITIVE STATIC 両方向スクロール・カーソルに対して位置付け DELETE を使用して、 削除ホール (つまり、その対応する行が基本表から 削除されてしまったような結果表の行) として示された行を 削除しようとすると、エラーが発生します。

    更新ホール (つまり、その対応する行が更新されて、SELECT ステートメントの述部の条件を 満たさなくなったような結果表の行) として示された行を削除しようとすると、 エラーが発生します。

  • 削除操作。 SENSITIVE STATIC 両方向スクロール・カーソルを使用した位置付け DELETE 操作は、次のことを行います。
    1. カーソルの基本表のターゲット行にある SELECT リスト項目が、結果表の対応する 行の値と比較されます (つまり、結果表は、引き続き基本表と一致していなければなりま せん)。 値が同じでない 場合には、削除操作はリジェクトされ、エラーが発生します。 ターゲット行に対する FETCH SENSITIVE が正常に行われたら、操作を再試行できます。
    2. SELECT ステートメントの WHERE 文節が再評価されて、基本表の現行値が、引き続き検索基準を満たしているかどうかを判別します。 これらの値が変更されていないことを判別するために、SELECT リストの中の値が比較されます。 WHERE 文節が真と評価され、SELECT リストの値が変更されていない場合、 削除操作の処理が許可されます。 そうでない場合には、エラーが発生し、削除操作はリジェクトされ、更新ホールがカーソルで 示されます。
    3. 基本表の行が正常に削除されたら、一時結果表が更新され、 行は削除ホールとしてマークされます。
  • 削除ホールのロールバック。 削除ホールは、通常、永続的です。 いったん削除ホールが示されると、 カーソルがクローズされるまで、そのホールはそのままになります。 ただし、この カーソルを使用した位置付け DELETE が、実際に、ホールの作成 の原因であり (つまり、このカーソルを使用して、ホールができる原因となった変更が行われた場合)、 削除がその後ロールバックされた場合には、行は削除ホールと見なされなくなります。
  • 結果表。 SENSITIVE STATIC 両方向スクロール・カーソルが定義されている基本表の 行に対する位置付け DELETE または検索 DELETE による削除は、 両方向スクロール・カーソルを使用した位置付け UPDATE または位置付け DELETE を行おうとすると、 結果表に反映されます。 SENSITIVE STATIC 両方向スクロール・カーソルは、FETCH SENSITIVE を行おうと した際に、これらの削除を検出します。

FOR ROW n OF ROWSET 文節を指定しない場合は、指定したカーソルに対してデータを戻した、最新の FETCH ステートメントによって取り出された行セット全体が削除されます。

変更の開始更新される列を参照する:変更の終わり
変更の開始FETCH文を使用して、後で更新される列を取得する場合は、列を選択する際にFOR UPDATE OFを指定します。 次に、その後の UPDATE または DELETE 文で WHERE CURRENT OF を指定します。 これらの条項により、 Db2 が更新中の列のインデックス経由のアクセスを選択することができなくなり、そうでないと Db2 が同じ行を複数回読み込む可能性がある。

詳細は、「以前に取得したデータの更新 」を参照してください。

変更の終わり
マルチレベル・セキュリティーを使用する表からの行の削除:
多段階セキュリティが設定されたテーブルから行を削除する際、 Db2 はユーザーのセキュリティラベル(一次認証ID)と行のセキュリティラベルを比較します。 削除は、次の規則に従って行われます。
  • ユーザーのセキュリティー・ラベルと行のセキュリティー・ラベルが同等である場合は、行は削除されます。
  • ユーザーのセキュリティー・ラベルが、行のセキュリティー・ラベルより上位にある場合は、ユーザーのライトダウン特権 (write-down privilege) によって、DELETE ステートメントのセキュリティーの結果が次のように決まります。
    • ユーザーが write-down privilege (ライトダウン特権) を持っているか、または write-down control (ライトダウン制御) が使用可能にされていない場合は、行は削除されます。
    • ユーザーが write-down privilege (ライトダウン特権) を持っておらず、かつ write-down control (ライトダウン制御) が使用可能にされている場合は、行は削除されません。
  • 行のセキュリティー・ラベルがユーザーのセキュリティー・ラベルより上位になる場合は、行は削除されません。
行アクセス制御および列アクセス制御が実施されている表からの行の削除
DELETE ステートメントが、行アクセス制御が実施されている表に対して発行された場合、行の許可で指定されている規則が、行を削除できるかどうかに影響します。 通常、これらの規則は、プロセスの許可 ID またはロールに基づきます。

行アクセス制御が実施される表は、少なくとも 1 つの行の許可、表へのすべてのアクセスを防止するデフォルトの行の許可を持っています。 単一の表に対して複数の行の許可が定義され有効になっている場合、行アクセス制御検索条件は、有効になっている各許可の検索条件に対して論理 OR 演算子を使用することにより導出されます。 その行アクセス制御検索条件が表に適用されて、DELETE ステートメントの許可 ID またはロールでアクセス可能な行が決定されます。 WHERE 文節が DELETE ステートメントに指定されている場合、ユーザー指定の述部が、削除される行を決定するためにアクセス可能な行に適用されます。 WHERE 文節がない場合、アクセス可能な行が削除される行になります。

削除対象の行があり、表の DELETE トリガーがある場合、トリガーがアクティブ化されます。

DELETE ステートメントが、列アクセス制御が適用される表に対して発行される場合、列マスクは DELETE ステートメントに影響しません。

前述の規則は、include-columns には適用されません。 include-columns は、DELETE ステートメントのオブジェクト表の列ではないため、選択リストの規則に従います。

同じ作業単位内の他の SQL ステートメント:
同じ作業単位内で、次のステートメントを DELETE ステートメントの後で使用することはできません。
  • 列のデータ・タイプを変更する ALTER TABLE ステートメント (ALTER COLUMN SET DATA TYPE)
  • 可変長列を含む索引の埋め込み属性を変更する ALTER INDEX ステートメント (PADDED から NOT PADDED へ、またはその逆)
  • アクセラレーターのみの表を作成する CREATE TABLE ステートメント
  • 別のアクセラレーターからアクセラレーターのみの表を更新する INSERT、UPDATE、または DELETE ステートメント
システム期間テンポラル表に関する考慮事項:
DELETE ステートメントに履歴表を参照する (履歴表の名前の明示的な参照、または FROM 節での期間指定の使用による暗黙的な参照) 相関副照会が含まれる検索条件がある場合、履歴表として格納された削除行がそれらの行の削除操作で参照され、その後ステートメントで処理される可能性があります。

表がシステム期間テンポラル表として定義されている場合、検索条件を含まない DELETE ステートメントの場合は一括削除操作は使用されません。

CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターに NULL 以外の値が設定されている場合は、DELETE ステートメントの基礎ターゲットを、システム期間テンポラル表にすることはできません。 この制限は、システム期間テンポラル表への参照が直接か間接かにかかわらず適用されます。

履歴表に関する考慮事項:
システム期間テンポラル表の行が削除されるときに、その行の履歴コピーが対応する履歴表に挿入され、履歴行の終了タイム・スタンプがデータ変更操作の時刻に対応するシステム決定値の形式で収集されます。 変更の開始データ変更操作時の SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 組み込みグローバル変数の値が NULL の場合、テーブルの行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるワーク単位で最初のデータ変更ステートメントが実行された際の時刻の読み取り値を使用して値が生成されます。または、systemperiod テンポラリテーブルの行が削除されます。 それ以外の場合、データ変更操作時に SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 組み込みグローバル変数から値が割り当てられます。変更の終わり 競合するトランザクションがシステム期間のテンポラリ・テーブルの同じ行を更新しており、関連する履歴テーブルに挿入される行の最後の列の値が、対応する最初の列の値よりも大きい場合、エラーが返されます。
アプリケーション期間テンポラル表に関する考慮事項:
アプリケーション期間テンポラル表の FOR PORTION OF BUSINESS_TIME 文節を含んだ DELETE ステートメントは、指定された削除操作が有効な範囲を示す 2 つの時点を指定します。

変更の開始例えば、BUSINESS_TIMEの一部が指定され、行の期間値が指定された期間に一部のみ含まれる場合を想定します。 value1、または value2 または value1value2。 (行の期間値は、開始列と終了列の値によって指定されます。) この場合、この行が削除され、削除されていない行の部分を表すために 1 行または 2 行が自動的に挿入されます。 表の削除操作の結果として自動的に挿入される行ごとに、アプリケーション期間テンポラル表の各生成列に新しい値が生成されます。 ユニーク・キー、主キー、参照制約の親キー、またはユニーク索引の一部として生成列が定義される場合は、自動挿入が制約または索引に違反する可能性があります。 この場合は、エラーが返されます。変更の終わり

アプリケーション期間表が DELETE ステートメントのターゲットであり、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターに対して有効な値が NULL 値でない場合、Db2 は、ステートメントに以下の追加の述部を追加します。

変更の開始
  • inclusive-exclusive 期間:
        bt_begin <= CURRENT TEMPORAL BUSINESS_TIME AND
    bt_end > CURRENT TEMPORAL BUSINESS_TIME
  • inclusive-inclusive 期間:
        bt_begin <= CURRENT TEMPORAL BUSINESS_TIME AND
    bt_end >= CURRENT TEMPORAL BUSINESS_TIME
変更の終わり

前述のコードでは、bt_begin と bt_end は、DELETE ステートメントのターゲット表の BUSINESS_TIME 期間の開始列と終了列です。

アーカイブ対応表からの行の削除:
DELETE ステートメントのターゲットがアーカイブ対応表である場合、関連するアーカイブ表の既存の行は影響を受けません。

アーカイブ対応表の行が削除される場合、関連するアーカイブ表に対する影響は、SYSIBMADM.MOVE_TO_ARCHIVE グローバル変数の設定によって決まります。 グローバル変数が Y に設定される場合、削除される行のコピーが関連するアーカイブ表に挿入されます。 これ以外の場合、削除される行のコピーは関連するアーカイブ表に挿入されません。

データ変更ステートメントは、システム期間テンポラル表またはアプリケーション期間テンポラル表も参照される場合、アーカイブ対応表を参照できません。

代替構文:
他の SQL インプリメンテーションとの互換性のために、DELETE キーワードの直後の FROM キーワードを省略できます。

DELETE文の例

以下のステートメントは、従業員番号が000060であるNEWEMPテーブルの各行を削除します。

DELETE FROM NEWEMP
  WHERE EMPNO = '000060';

以下の例のステートメントは、 PL/I プログラムに組み込まれていると仮定する。

  • テーブル DSN8C10.EMP から、現在カーソル C1 が置かれている行を削除します。
      EXEC SQL DELETE FROM DSN8C10.EMP WHERE CURRENT OF C1;
  • テーブル DSN8C10.EMP から、部署 E11 と D21 のすべての行を削除します。
      EXEC SQL DELETE FROM DSN8C10.EMP
        WHERE WORKDEPT = 'E11' OR WORKDEPT = 'D21';
  • 従業員テーブルXから、欠勤日数が最も多い従業員を削除します。
      EXEC SQL DELETE FROM EMP X
        WHERE ABSENT = (SELECT MAX(ABSENT) FROM EMP Y
        WHERE X.WORKDEPT = Y.WORKDEPT);
  • カーソル CS1 がテーブル T1 の10行からなる行セット上に位置していると仮定すると、行セット内の10行すべてを削除します。
    EXEC SQL DELETE FROM T1 WHERE CURRENT OF CS1; 
  • カーソル CS1 がテーブル T1 の10行からなる行セット上に位置していると仮定し、行セットの4行目を削除します。
    EXEC SQL DELETE FROM T1 WHERE CURRENT OF CS1 FOR ROW 4 OF ROWSET;
  • T1 テーブルの行を削除します。 COL2 列の値が配列 INTA の要素数と一致する場合。 INTA 配列は、DELETE ステートメントの CARDINALITY 関数の引数として指定されます。
    CREATE TYPE INTARRAY AS INTEGER ARRAY[6];
    CREATE VARIABLE INTA AS INTARRAY;
    SET INTA = ARRAY[1, 2, 3, 4, 5];
    CREATE TABLE T1 (COL1 CHAR(7), COL2 INT);
    INSERT INTO T1 VALUES('abc', 10);
    DELETE FROM T1 WHERE COL2 = CARDINALITY(INTA);
    
  • テーブル T1 から、列 C2 の値が10より大きい行を3つだけ削除します。
    DELETE FROM T1
       WHERE C2 > 10
       FETCH FIRST 3 ROWS ONLY;