4.12.1 DELETE文 形式2の形式と規則
(1) 機能
表から,指定した探索条件を満足する行を削除します。配列形式の埋込み変数を指定して,複数回の削除処理を一括して実行できます。
(2) 使用権限
表に対するDELETE権限を持つユーザが,その表の行を削除できます。
ただし,探索条件中に副問合せを指定する場合は,その副問合せ指定の表に対してSELECT権限が必要です。
(3) 形式<埋込み変数配列を指定して,複数回の削除を実行>
FOR :埋込み変数 DELETE FROM 〔認可識別子.〕表識別子 〔IN (RDエリア名指定)〕〔〔AS〕相関名〕 〔使用インデクスのSQL最適化指定〕 WHERE 探索条件 〔WITH ROLLBACK〕 〔WRITE IMMEDIATE〕
(4) オペランド
FOR,IN (RDエリア名指定),探索条件以外のオペランド,及びオペランド規則については,「DELETE文 形式1(行削除)」を参照してください。
(a) FOR :埋込み変数
埋込み変数配列を使用して削除を行う回数を設定した埋込み変数を指定します。SMALLINT型の埋込み変数を指定してください。設定値は1から4,096までの範囲で,かつ埋込み変数配列,及び標識変数配列の要素数以下にしてください。0及び負の値は設定できません。範囲外の値を設定した場合は実行時にエラーとなります。
- 埋込み変数配列
-
配列形式で宣言した埋込み変数です。NULL値以外の値で探索条件として使用するための配列変数を指定します。探索条件として使用する値を埋込み変数配列の各要素に設定してください。探索条件として使用する値にNULL値を含む場合は,埋込み変数配列と標識変数配列を両方指定します。
- 標識変数配列
-
配列形式で宣言した標識変数です。埋込み変数配列の各要素の値がNULL値かどうかを示す値を,標識変数配列の対応する要素に設定してください。設定する値については,「標識変数の値の設定」を参照してください。
(b) 〔IN (RDエリア名指定)〕
RDエリア名指定を埋込み変数で指定する場合は,埋込み変数配列で指定してください。配列でない埋込み変数を指定した場合はエラーとなります。そのほかのオペランド規則については,「DELETE文 形式1(行削除)」を参照してください。
(c) WHERE探索条件
- 探索条件
-
削除する行を選択する条件を指定します。探索条件に配列形式でない埋込み変数は指定できません。
(5) 共通規則
-
FOR句以外に埋込み変数配列を一つ以上指定してください。指定しない場合はエラーとなります。
-
FOR句以外に配列形式でない埋込み変数を指定するとエラーとなります。
-
埋込み変数配列のデータ型は対応する列のデータ型,又は変換できるデータ型にしてください。
-
埋込み変数配列,及び標識変数配列の要素数は1から4,096までの範囲にしてください。範囲外の値を指定した場合はエラーとなります。また,”FOR :埋込み変数”で指定する要素数の最大値以上になるようにしてください。
-
各埋込み変数配列,及び標識変数配列で1回の削除処理によって評価される要素は同じ要素番号の要素となります。
-
DELETE文形式2は埋込み変数配列,及び標識変数配列を含むため,PREPARE文で前処理することはできません。動的に実行する場合については,「EXECUTE文 形式2(配列を使用したSQLの実行)」を参照してください。
-
配列を使用したDELETEは手続きの中では使えません。
-
配列を使用したDELETEでは,BLOB型,最大長が32,001バイト以上のBINARY型及び抽象データ型は扱えません。
-
DELETE文が正常に実行された場合は,SQL連絡領域のSQLERRD[2]領域に削除した行数が設定されます。
-
削除の対象になる行がない場合は,次のリターンコードが設定されます。
-
SQL連絡領域のSQLCODE領域に100
-
SQLCODE変数に100
-
SQLSTATE変数に’02000’
-
-
表が改竄防止表であり,かつ指定した探索条件を満足する行の中に削除禁止期間の行がある場合は,探索条件を満足するすべての行を削除しないでエラーとなります。
-
削除するどれかの行でエラーが発生した場合,ロールバックされます。
-
WITHOUT ROLLBACKを指定した表に対して,DELETE文を実行する場合,インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE(表定義)」のWITHOUT ROLLBACKの規則を参照してください。
-
共用表の行を削除する場合,事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表の行を削除削除しようとすると,エラーとなり行を削除できません。共用表に対する更新については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文(表の排他制御)」の留意事項を参照してください。
-
RDエリア名指定を指定した場合,分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は,分割数が表の分割数と等しいインデクスを定義してください。
(6) 参照制約に関する規則
-
被参照表,参照表の行を削除する場合の規則は「CREATE TABLE(表定義)」の参照動作を参照してください。
-
制約動作がRESTRICTで定義された被参照表の行を削除する場合,削除対象になる行中の主キー構成列の値が参照表の外部キー構成列の値に含まれるかどうかを確認するため,参照表を検索します。このとき,参照表の検索時のデータ保証レベルは共用モードになります。そのため,制約動作がRESTRICTで定義された被参照表の行を削除するときに,ほかのトランザクションによって参照表に対する操作が行われていると,そのトランザクションが決着するまでその行削除は待ち状態になります。
-
次の条件が重なった場合,参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また,制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。参照制約に関する規則については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
-
参照表の行を削除するトランザクションと,被参照表の行を更新,又は削除するトランザクションが異なる
-
上記二つのトランザクションが同時に実行される
-
参照表で削除する行の主キー構成列の値と,被参照表で更新,又は削除する行の外部キー構成列の値と同じである
-
参照表の行を削除するトランザクションをコミット,被参照表の行を更新,又は削除するトランザクションをロールバックする
-
(7) 使用例
-
C言語の配列変数に設定した商品コード(SCODE)の値別に,在庫表(ZAIKO)の行の削除を複数回分一括して実行します。
XDELETE_NUM = 5; EXEC SQL FOR :XDELETE_NUM DELETE FROM ZAIKO WHERE SCODE = :XSCODE:ISCODE;