ヘッダーをスキップ
Oracle® Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

DELETE

用途

DELETE文を使用すると、次の表から行を削除できます。

  • 非パーティション表またはパーティション表

  • ビューの非パーティション実表またはパーティション実表

  • 書込み可能なマテリアライズド・ビューの非パーティション・コンテナ表またはパーティション・コンテナ表

  • 更新可能なマテリアライズド・ビューの非パーティション・マスター表またはパーティション・マスター表

前提条件

表から行を削除する場合、その表が自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、その表に対するDELETEオブジェクト権限が必要です。

更新可能なマテリアライズド・ビューから行を削除する場合、そのマテリアライズド・ビューが自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、そのマテリアライズド・ビューに対するDELETEオブジェクト権限が必要です。

ビューの実表から行を削除する場合、そのビューが含まれるスキーマの所有者には、その実表に対するDELETEオブジェクト権限が必要です。また、他のスキーマ内にビューが存在している場合は、そのビューに対するDELETEオブジェクト権限が必要です。

DELETE ANY TABLEシステム権限を持っている場合、任意の表、表パーティションまたは任意のビューの実表から行を削除できます。

次の場合は、削除するオブジェクトに対するSELECTオブジェクト権限も必要です。

  • オブジェクトがリモート・データベースに存在する。

  • 初期化パラメータSQL92_SECURITYTRUEに設定され、DELETE操作が表列(where_clause内の列など)を参照する。

表のファンクション索引が無効な状態にあるとき、表から行を削除できません。まず、ファンクション索引を検証する必要があります。

セマンティクス

hint

文の実行計画を選択する場合に、オプティマイザに指示を与えるためのコメントを指定します。


関連項目:

ヒントの構文および説明については、「ヒント」を参照してください。

from_clause

FROM句を使用すると、行を削除するデータベース・オブジェクトを指定できます。

ONLY構文は、ビューのみに関連します。FROM句のビューがビューの階層に属し、そのいずれのサブビューからも行を削除しない場合は、ONLY句を使用します。

DML_table_expression_clause

この句を使用すると、データを削除するオブジェクトを指定できます。

schema

表またはビューが含まれているスキーマを指定します。schemaを指定しない場合、表またはビューは自分のスキーマにあるとみなされます。

table | view | materialized view | subquery

行を削除する表、ビュー、マテリアライズド・ビュー、列または副問合せの結果の列の名前を指定します。

更新可能なビューから行を削除すると、実表から行が削除されます。

読取り専用マテリアライズド・ビューからは行を削除できません。書込み可能なマテリアライズド・ビューから行を削除する場合、基礎となるコンテナ表から行が削除されます。ただし、その削除は次のリフレッシュ操作で上書きされます。マテリアライズド・ビュー・グループ内の更新可能なマテリアライズド・ビューから行を削除する場合、マスター表の対応する行も削除されます。

tableviewの実表またはmaterialized_viewのマスター表に、1列以上のドメイン索引列が含まれる場合は、この文によって適切な索引タイプの削除ルーチンが実行されます。


関連項目:

これらのルーチンの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

表に対してDELETE文を実行すると、その表に定義されているDELETEトリガーが起動されます。

行の削除によって解放される表や索引のすべての領域は、表および索引によって引き続き保持されます。

partition_extension_clause

オブジェクト内にある削除対象のパーティションまたはサブパーティションの名前またはパーティション・キー値を指定します。

パーティション・オブジェクトから値を削除する場合、そのパーティション名を指定する必要はありません。ただし、パーティション名を指定した方が、複雑なwhere_clauseより効率が上がることがあります。

dblink

オブジェクトが格納されているリモート・データベースへのデータベース・リンクの完全名または部分名を指定します。Oracle Databaseの分散機能を使用している場合にのみ、リモート・オブジェクトから行を削除できます。


関連項目:

データベース・リンクの参照方法の詳細は、「リモート・データベース内のオブジェクトの参照」および「リモート・データベースの行の削除例:」参照してください。

dblinkを省略した場合、オブジェクトがローカル・データベース上にあるとみなされます。

subquery_restriction_clause

subquery_restriction_clauseを使用すると、次のいずれかの方法で副問合せを制限できます。

WITH READ ONLY WITH READ ONLYを指定すると、表またはビューを更新禁止にできます。

WITH CHECK OPTION WITH CHECK OPTIONを指定すると、副問合せに含まれない行を生成する表またはビューの変更を禁止できます。この句をDML文の副問合せ内で使用する場合、FROM句内の副問合せには指定できますが、WHERE句内の副問合せには指定できません。

CONSTRAINT constraint CHECK OPTION制約の名前を指定します。この識別子を省略した場合は、Oracleによって自動的にSYS_Cnという形式の制約名が割り当てられます(nはデータベース内で制約名を一意にするための整数)。

table_collection_expression

table_collection_expressionを使用すると、問合せおよびDML操作で、collection_expression値を表として扱うことができます。collection_expressionには、副問合せ、列、ファンクションまたはコレクション・コンストラクタのいずれかを指定できます。その形式にかかわらず、集合値(ネストした表型またはVARRAY型の値)を戻す必要があります。このようなコレクションの要素抽出プロセスをコレクション・ネスト解除といいます。

TABLEコレクション式を親表と結合する場合は、オプションのプラス(+)には大きな意味があります。+を指定すると、その2つの外部結合が作成され、コレクション式がNULLの場合でも、外部表の行が問合せで戻されるようになります。


注意:

以前のリリースのOracleでは、collection_expressionが副問合せの場合、table_collection_expressionTHE subqueryと表現していました。現在、このような表現方法は非推奨になっています。

相関副問合せでtable_collection_expressionを使用すると、他の表に存在する値で行を削除できます。

collection_expression 削除するオブジェクトからネストした表の列を選択する副問合せを指定します。

dml_table_expression_clause句の制限事項: この句には、次の制限事項があります。

  • viewまたはmaterialized_viewtable(実表またはマスター表)にIN_PROGRESSまたはFAILEDのマークが付いたドメイン索引がある場合、この文は実行できません。

  • 関係する索引パーティションがUNUSABLEとマークされている場合は、パーティションに挿入できません。

  • DML_table_expression_clauseの副問合せでは、ORDER BY句を指定できません。

  • ビューを定義する問合せに次のいずれかの構造体が含まれている場合は、INSTEAD OFトリガーを使用する場合を除いて、ビューから行を削除できません。

    集合演算子
    DISTINCT演算子
    集計ファンクションまたは分析ファンクション
    GROUP BYORDER BYMODELCONNECT BYまたはSTART WITH
    SELECT構文のリストにあるコレクション式
    SELECT構文のリストにある副問合せ
    WITH READ ONLYが指定された副問合せ
    結合(一部の例外を除く。詳細は、『Oracle Database管理者ガイド』を参照してください。)

UNUSABLEのマークが付いている索引、索引パーティションまたは索引サブパーティションを指定する場合、SKIP_UNUSABLE_INDEXES初期化パラメータがtrueに設定されていないかぎり、DELETE文は正常に実行されません。


関連項目:

「ALTER SESSION」

where_clause

where_clauseを使用すると、条件を満たす行のみを削除できます。この条件は、行を削除するオブジェクトを参照したり、副問合せを含むことができます。Oracle Databaseの分散機能を使用している場合にのみ、リモート・オブジェクトから行を削除できます。conditionの構文は、第7章「条件」を参照してください。

この句がリモート・オブジェクトを参照するsubqueryを含む場合、参照がローカル・データベース上でオブジェクトにループバックしないかぎり、DELETEはパラレルで実行されます。ただし、DML_table_expression_clausesubqueryがリモート・オブジェクトを参照する場合は、DELETE操作はシリアルで実行されます。詳細は、「CREATE TABLE」のparallel_clauseを参照してください。

dblinkを省略した場合、表またはビューがローカル・データベース上にあるとみなされます。

where_clauseを省略した場合、オブジェクトのすべての行が削除されます。

t_alias  文中で参照する表、ビュー、マテリアライズド・ビュー、副問合せまたはコレクション値の相関名を指定します。DML_table_expression_clauseがいずれかのオブジェクト型属性またはオブジェクト型メソッドを参照する場合、この別名が必要です。通常、別名は相関問合せを持つDELETE文で使用されます。

returning_clause

この句を使用すると、削除された列から値を戻すことができるため、DELETE文の後でSELECT文を実行する必要がなくなります。

この句を使用すると、DML文に影響される行を取り出すことができます。この句は、表、マテリアライズド・ビュー、および単一の実表を持つビューに指定できます。

returning_clauseを指定したDML文を単一行に実行すると、影響された行、ROWID、および処理された行へのREFを使用している列式が取り出され、ホスト変数またはPL/SQL変数に格納されます。

returning_clauseを指定したDML文を複数行に実行すると、式の値、ROWIDおよび処理された行に関連するREFがバインド配列に格納されます。

expr exprリストの各項目は、適切な構文で表す必要があります。

INTO INTO句を指定すると、変更された行の値を、data_itemリストに指定する変数に格納できます。

data_item data_itemはそれぞれ、取り出したexpr値を格納するためのホスト変数またはPL/SQL変数です。

RETURNINGリストの各式については、INTOリストに、対応する型に互換性があるPL/SQL変数またはホスト変数を指定する必要があります。

制限事項: RETURNING句には、次の制限事項があります。

  • exprに次の制限事項があります。

    • UPDATE文およびDELETE文の場合、各exprは、単純式または単一セットの集計ファンクション式である必要があります。1つのreturning_clause内に単純式と単一セットの集計ファンクション式を混在させることはできません。INSERT文の場合、各exprは単純式である必要があります。INSERT文のRETURNING句では、集計ファンクションはサポートされていません。

    • 単一セットの集計ファンクション式をDISTINCTキーワードに含めることはできません。

  • exprのリストに主キー列または他のNOT NULL列が含まれている場合は、表にBEFORE UPDATEトリガーが定義されていると、UPDATE文の実行に失敗します。

  • マルチテーブル・インサートではreturning_clauseを指定できません。

  • パラレルDMLまたはリモート・オブジェクトにはこの句を使用できません。

  • LONG型を取り出すことはできません。

  • INSTEAD OFトリガーが定義されたビューに対して指定することはできません。


関連項目:

  • BULK COLLECT句を使用してコレクション変数に複数の値を戻す場合は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

  • 「RETURNING句の使用例:」


error_logging_clause

error_logging_clauseDELETE文での動作は、INSERT文の場合と同じです。詳細は、「INSERT」文のerror_logging_clauseを参照してください。

行の削除例: 次の文は、language_id列の値がARの、サンプル表oe.product_descriptionsからすべての行を削除します。

DELETE FROM product_descriptions
   WHERE language_id = 'AR';

次の文は、サンプル表hr.employeesから歩合率が10%未満の購買係を削除します。

DELETE FROM employees
   WHERE job_id = 'SA_REP'
   AND commission_pct < .2;

次の文は前述の例と同じ結果を表しますが、副問合せを使用します。

DELETE FROM (SELECT * FROM employees)
   WHERE job_id = 'SA_REP'
   AND commission_pct < .2;

リモート・データベースの行の削除例: 次の文は、データベース・リンクremoteによってアクセス可能なデータベースの、ユーザーhrが所有するlocations表から指定した行を削除します。

DELETE FROM hr.locations@remote
   WHERE location_id > 3000;

ネストした表の行の削除例: ネストした表の行の削除例は、「表のコレクション例:」を参照してください。

パーティションの行の削除例: 次の例は、sh.sales表のパーティションsales_q1_1998から行を削除します。

DELETE FROM sales PARTITION (sales_q1_1998)
   WHERE amount_sold > 1000;

RETURNING句の使用例: 

次の例は、削除された行からsalary列を戻し、その結果をバインド配列:bnd1に格納します。バインド配列は事前に宣言しておく必要があります。

DELETE FROM employees
   WHERE job_id = 'SA_REP' 
   AND hire_date + TO_YMINTERVAL('01-00') < SYSDATE 
   RETURNING salary INTO :bnd1;