4.11.1 DELETE文 形式1の形式と規則
(1) 機能
表から指定した探索条件を満足する行,又はカーソルが指している行を削除します。
(2) 使用権限
表に対するDELETE権限を持つユーザが,その表の行を削除できます。
ただし,探索条件中に副問合せを指定する場合は,その副問合せ指定の表に対してSELECT権限が必要です。
(3) 形式
DELETE FROM 〔認可識別子.〕表識別子 〔IN (RDエリア名指定)〕〔〔AS〕相関名〕 〔使用インデクスのSQL最適化指定〕 〔WHERE {探索条件|CURRENT OF {カーソル名|拡張カーソル名}}〕 〔WITH ROLLBACK〕 〔WRITE IMMEDIATE〕
(4) オペランド
(a) 〔認可識別子.〕表識別子
- 認可識別子
-
表を所有するユーザの認可識別子を指定します。
認可識別子に,"MASTER"は指定できません。認可識別子を省略した場合については,「名前の修飾」を参照してください。
- 表識別子
-
削除する行がある表を指定します。
表識別子についての規則を次に示します。
-
読み込み専用のビュー表は,行の挿入,更新,及び削除ができません。
-
読み込み専用のビュー表については,「CREATE 〔PUBLIC〕VIEW(ビュー定義,パブリックビュー定義)」の共通規則を参照してください。
-
ビュー表からの行の削除を指定した場合は,そのビュー表の操作の対象の基になる実表から行を削除します。
-
表名の有効範囲はDELETE文全体です。
-
(b) 〔IN (RDエリア名指定)〕
- IN
-
アクセス対象のRDエリアを指定します。なお,表識別子に指定した表が一時表の場合は指定できません。
- RDエリア名指定::=値指定
-
表識別子に指定した表を格納しているRDエリアのうち,アクセスするRDエリアの名称をVARCHAR型,CHAR型,MVARCHAR型,又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ(,)で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については,「名前の指定」を参照してください。また,値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符(")で囲んだ場合は,引用符(")の外側の空白だけを無視します。
カーソル名又は拡張カーソル名の指定がある場合は,カーソル宣言で宣言したカーソルで指定したRDエリアと同じRDエリアの集合を指定してください(順不同)。指定しない場合はエラーとなります。
インナレプリカ機能を適用しているRDエリアを指定する場合,オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は,カレント切り替えコマンド(pddbchgコマンド),又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。
(c) 〔AS〕相関名
削除対象の表に対して相関名を使用する場合に指定します。
相関名の有効範囲はDELETE文全体です。削除対象の表識別子は有効範囲を持ちません。
(d) 使用インデクスのSQL最適化指定
使用インデクスのSQL最適化指定については,「SQL最適化指定」を参照してください。
(e) WHERE{探索条件|CURRENT OF {カーソル名|拡張カーソル名}}
- WHERE
-
WHERE句を省略すると,指定した表のすべての行が削除されます。SQL連絡領域のSQLWARN4領域に警告フラグ”W”が設定されます。
- 探索条件
-
削除する行を選択する条件を指定します。
探索条件中に埋込み変数,?パラメタ,SQL変数,又はSQLパラメタを指定できます。ただし,PREPARE文で前処理されるDELETE文の探索条件中では,?パラメタだけ指定できます。
SQL手続き中では,SQL変数,又はSQLパラメタを使用します。Java手続き中の指定値については,マニュアル「HiRDB UAP開発ガイド」のJDBCドライバ又はSQLJを参照してください。
探索条件については,「探索条件」を参照してください。
- カーソル名
-
削除する行を指すカーソルの名称を指定します。
カーソル名で指定するカーソルは,カーソル宣言で宣言されたカーソルです。
カーソル名で指定するカーソルは,OPEN文で開き,FETCH文で削除する行に位置づけてください。なお,そのカーソルに対するOPEN文,FETCH文,CLOSE文及びDELETE文は,同一トランザクション内で実行してください(ただし,ホールダブルカーソルの場合を除く)。
カーソル名で指定するカーソルは,DELETE文実行後は,指している行がありません。削除した行より後の行を更新,又は削除する場合は,そのカーソルに対してFETCH文を実行して,カーソルを移動させてください。
- 拡張カーソル名
-
削除する行を指すカーソルを識別する拡張カーソル名を指定します。
ALLOCATE CURSOR文で割り当てられたカーソルを識別している拡張カーソル名を指定してください。ただし,結果集合カーソルは指定できません。
拡張カーソル名が識別するカーソルは,開いた状態であり,かつ削除する行に位置づけられている必要があります。
拡張カーソル名が識別するカーソルは,DELETE文実行後は指している行がありません。削除した行より後の行を更新,又は削除する場合は,そのカーソルに対してFETCH文を実行して,カーソルを移動させてください。
拡張カーソル名を指定する場合は,FOR UPDATE句の指定のある問合せに対する拡張カーソルを指定しなければなりません。FOR UPDATE句については,「動的SELECT文 形式1(動的検索)」のオペランド規則のFOR UPDATE句を参照してください。
拡張カーソル名については,「拡張カーソル名」を参照してください。
(f) WITH ROLLBACK
削除する表がほかのユーザで使用されているとき,トランザクションを取り消して無効にする場合に指定します。
WITH ROLLBACKを省略した場合は,削除する表がほかのユーザのトランザクションで使用されているとき,そのトランザクションが終了してから実行します。
(g) WRITE IMMEDIATE
表オプションにWITHOUT ROLLBACKの指定がある表に対する更新処理で,更新完了時にシステムログを書き出す場合,このオプションを指定してください。WITHOUT ROLLBACK指定のない表に対して,このオプションを指定しても無効になります。
更新完了時にシステムログを書き出す効果については,マニュアル「HiRDB UAP開発ガイド」の採番業務で使用する表を参照してください。
(5) 共通規則
-
DELETE文が正常に実行された場合は,SQL連絡領域のSQLERRD[2]領域に削除した行数が設定されます。
-
削除の対象になる行がない場合は,次のリターンコードが設定されます。
-
SQL連絡領域のSQLCODE領域に100
-
SQLCODE変数に100
-
SQLSTATE変数に’02000’
-
-
LOB列又はLOB属性を格納するユーザLOB用RDエリアが更新凍結状態の場合,そのLOB列又はLOB属性は削除できません(削除しようとすると凍結済みエラーとなります)。
-
表が改竄防止表であり,かつ指定した探索条件を満足する行の中に削除禁止期間の行がある場合は,探索条件を満足するすべての行を削除しないでエラーとなります。
-
表が改竄防止表であり,かつ指定したカーソルが指している行が削除禁止期間である場合,行を削除しないでエラーとなります。
-
WITHOUT ROLLBACKを指定した表に対して,DELETE文を実行する場合,インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE(表定義)」のWITHOUT ROLLBACKの規則を参照してください。
-
共用表の行を削除する場合,事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表の行を削除しようとすると,エラーとなり行を削除できません。共用表に対する更新については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文(表の排他制御)」の留意事項を参照してください。
-
RDエリア名指定を指定した場合,分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は,分割数が表の分割数と等しいインデクスを定義してください。
(6) 参照制約に関する規則
-
被参照表,参照表の行を削除する場合の規則は「CREATE TABLE(表定義)」の参照動作を参照してください。
-
制約動作がRESTRICTで定義された被参照表の行を削除する場合,削除対象になる行中の主キー構成列の値が参照表の外部キー構成列の値に含まれるかどうかを確認するため,参照表を検索します。このとき,参照表の検索時のデータ保証レベルは共用モードになります。そのため,制約動作がRESTRICTで定義された被参照表の行を削除するときに,ほかのトランザクションによって参照表に対する操作が行われていると,そのトランザクションが決着するまでその行削除は待ち状態になります。
-
次の条件が重なった場合,参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また,制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。参照制約に関する規則については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
-
参照表の行を削除するトランザクションと,被参照表の行を更新,又は削除するトランザクションが異なる
-
上記二つのトランザクションが同時に実行される
-
参照表で削除する行の主キー構成列の値と,被参照表で更新,又は削除する行の外部キー構成列の値と同じである
-
参照表の行を削除するトランザクションをコミット,被参照表の行を更新,又は削除するトランザクションをロールバックする
-
(7) 留意事項
-
カーソル名は,埋込み変数名と同様に,コンパイル単位のモジュール内で有効な名前であり,同じカーソルに対する複数のSQLを,複数のモジュールにわたって使用できません。
-
表が改竄防止表であり,かつ削除禁止期間を指定している場合,削除対象行の挿入日付と削除禁止期間の和が9999年12月31日を超えるとオーバフローが発生します。
(8) 使用例
-
在庫表(ZAIKO)から商品コード(SCODE)列が302Sの行を削除します。
DELETE FROM ZAIKO WHERE SCODE = ‘302S’
-
在庫表(ZAIKO)から埋込み変数(:XSCODE)に読み込まれた商品コード(SCODE)列の行を削除します。
DELETE FROM ZAIKO WHERE SCODE = :XSCODE
-
在庫表(ZAIKO)からカーソル(CR1)で指定した行を削除します。
DELETE FROM ZAIKO WHERE CURRENT OF CR1