前提条件
表の値を更新する場合は、表が自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、その表に対するUPDATE
オブジェクト権限が必要です。
ビューの実表の値を更新する場合は、次の条件を満たす必要があります。
そのビューに対するUPDATE
オブジェクト権限を持っている。
そのビューが含まれているスキーマの所有者が、実表に対するUPDATE
オブジェクト権限を持っている。
UPDATE
ANY
TABLE
システム権限を持っている場合は、任意の表またはビューの実表の値を更新できます。
次の場合は、更新するオブジェクトに対するSELECT
オブジェクト権限も必要です。
オブジェクトがリモート・データベースに存在する。
SQL92_SECURITY
初期化パラメータがTRUE
に設定され、UPDATE
操作が表の列(where_clause
内の列など)を参照する。
構文
update::=
(DML_table_expression_clause::=、update_set_clause ::=、where_clause ::=、returning_clause::=、error_logging_clause::=を参照)
DML_table_expression_clause::=
(partition_extension_clause::=、subquery::=(「SELECT
」の項)、subquery_restriction_clause ::=、table_collection_expression ::=を参照)
partition_extension_clause::=
subquery_restriction_clause::=
table_collection_expression ::=
where_clause::=
セマンティクス
hint
文の実行計画を選択する場合に、オプティマイザに指示を与えるためのコメントを指定します。
UPDATE
キーワードの直後にパラレル・ヒントを指定した場合、基礎となるスキャンおよびUPDATE
操作の両方をパラレル化できます。
ONLY
句は、ビューのみに適用されます。UPDATE
句のビューが階層に属し、そのどのサブビューの行も変更しない場合は、ONLY
構文を指定します。
schema
更新するオブジェクトが含まれているスキーマを指定します。schema
を指定しない場合、オブジェクトは自分のスキーマ内にあるとみなされます。
table | view | materialized_view | subquery
更新する対象となる、表、ビュー、マテリアライズド・ビュー、または副問合せから戻された列の名前を指定します。表に対してUPDATE
文を実行した場合、その表に対応付けられたUPDATE
トリガーが起動します。
view
を指定した場合、ビューの実表が更新されます。ビューを定義する問合せに次のいずれかの要素が含まれる場合は、INSTEAD
OF
トリガーを除き、そのビューを更新することはできません。
DISTINCT
演算子GROUP
BY
、ORDER
BY
、MODEL
、CONNECT
BY
またはSTART
WITH
句SELECT
構文のリストにあるコレクション式SELECT
構文のリストにある副問合せWITH
READ
ONLY
が指定された副問合せWITH
句ビューから、複数の実表は更新できません。
また、WITH
CHECK
OPTION
を指定してビューを作成した場合、実行結果がビューを定義する問合せの条件を満たす場合にのみ、ビューを更新できます。
table
またはview
の実表に、1つ以上のドメイン索引列がある場合は、この文によって適切な索引タイプの更新ルーチンが実行されます。
読取り専用のマテリアライズド・ビューの行は更新できません。書込み可能なマテリアライズド・ビューの行を更新すると、基礎となるコンテナ表の行も更新されます。ただし、その更新内容は次のリフレッシュ操作によって上書きされます。マテリアライズド・ビュー・グループ内の更新可能なマテリアライズド・ビューの行を更新すると、マスター表の対応する行も更新されます。
関連項目:
|
更新対象のtable
内にあるパーティションまたはサブパーティションの名前またはパーティション・キー値を指定します。パーティション表内の値を更新する場合は、パーティション名を指定する必要はありません。ただし、パーティション名を指定した方が、複雑なwhere_clause
を使用するよりも効果的な場合もあります。
dblink
オブジェクトが格納されているリモート・データベースへのデータベース・リンクの完全名または部分名を指定します。Oracle Databaseの分散機能を使用している場合にかぎり、データベース・リンクを使用してリモート・オブジェクトを更新できます。
dblink
を省略した場合、オブジェクトがローカル・データベース上にあるとみなされます。
subquery_restriction_clause
を使用すると、次のいずれかの方法で副問合せを制限できます。
WITH READ ONLY WITH READ ONLY
を指定すると、表またはビューを更新禁止にできます。
WITH CHECK OPTION WITH CHECK OPTION
を指定すると、副問合せに含まれない行を生成する表またはビューの変更を禁止できます。この句をDML文の副問合せ内で使用する場合、FROM
句内の副問合せには指定できますが、WHERE
句内の副問合せには指定できません。
CONSTRAINT constraint CHECK OPTION
制約の名前を指定します。この識別子を省略した場合は、Oracleによって自動的にSYS_C
n
という形式の制約名が割り当てられます(nはデータベース内で制約名を一意にするための整数)。
table_collection_expression
を使用すると、問合せおよびDML操作で、collection_expression
値を表として扱うことができます。collection_expression
には、副問合せ、列、ファンクションまたはコレクション・コンストラクタのいずれかを指定できます。その形式にかかわらず、集合値(ネストした表型またはVARRAY型の値)を戻す必要があります。このようなコレクションの要素抽出プロセスをコレクション・ネスト解除といいます。
TABLE
コレクション式を親表と結合する場合は、オプションのプラス(+)には大きな意味があります。+を指定すると、その2つの外部結合が作成され、コレクション式がNULLの場合でも、外部表の行が問合せで戻されるようになります。
注意: 以前のリリースのOracleでは、collection_expression が副問合せの場合、table_collection_expression をTHE subquery と表現していました。現在、このような表現方法は非推奨になっています。 |
table_collection_expression
を使用して、ある表の行を別の表の行を基にして更新できます。たとえば、四半期ごとの売上表を、年度ごとの売上表にまとめることができます。
t_alias
文中で参照する表、ビューまたは副問合せの相関名(別名)を指定します。DML_table_expression_clause
がいずれかのオブジェクト型属性またはオブジェクト型メソッドを参照する場合、この別名が必要です。
DML_table_expression_clauseの制限事項: この句には、次の制限事項があります。
table
またはview
の実表に、IN_PROGRESS
またはFAILED
とマークされたドメイン索引がある場合は、この文は実行できません。
関係する索引パーティションがUNUSABLE
とマークされている場合は、パーティションに挿入できません。
DML_table_expression_clause
の副問合せにはorder_by_clause
を指定できません。
UNUSABLE
のマークが付いている索引、索引パーティションまたは索引サブパーティションを指定する場合、SKIP_UNUSABLE_INDEXES
セッション・パラメータがTRUE
に設定されていないかぎり、UPDATE
文は正常に実行されません。
update_set_clause
update_set_clause
を使用すると、列の値を設定できます。
column
更新するオブジェクトの列の名前を指定します。update_set_clause
に表の列を指定しない場合、その列の値は変更されません。
column
がLOBオブジェクト属性を参照している場合、まず空またはNULLの値で初期化する必要があります。リテラルで更新はできません。また、UPDATE
以外のSQL文を使用してLOB値を更新する場合は、LOBを含む行を最初にロックしておく必要があります。詳細は、「for_update_clause」を参照してください。
column
が仮想列である場合、ここで指定することはできません。この場合、仮想列の導出元となっている値を更新する必要があります。
column
がパーティション表のパーティション化キーに含まれる場合、別のパーティションまたはサブパーティションに行を移動する列の値を変更すると、行の移動を有効にしないかぎり、UPDATE
は正常に実行されません。「CREATE TABLE」の「
row_movement_clause」または「ALTER TABLE」を参照してください。
また、column
がリスト・パーティション表のパーティション化キーの一部である場合、パーティションのpartition_key_value
リストに存在していない列の値を指定すると、UPDATE
は正常に実行されません。
subquery
更新される行ごとに1行ずつ戻す副問合せを指定します。
update_set_clause
で1列のみを指定した場合、副問合せは1つの値のみを戻します。
update_set_clause
で複数の列を指定した場合、副問合せは指定した列の数の値を戻します。
副問合せが行を戻さなかった場合は、列にはNULLが割り当てられます。
subquery
がリモート・オブジェクトを参照する場合、参照がローカル・データベースのオブジェクトにループバックしないかぎり、UPDATE
はパラレルで実行されます。ただし、DML_table_expression_clause
のsubquery
がリモート・オブジェクトを参照する場合は、UPDATE
はシリアルで実行されます。
副問合せ内でflashback_query_clause
を使用すると、過去のデータでtable
を更新できます。この句の詳細は、「SELECT」の「flashback_query_clause」
を参照してください。
expr
対応する列に割り当てられた新しい値に変換する式を指定します。
DEFAULT DEFAULT
を指定すると、以前に列のデフォルト値として指定した値を列に設定できます。対応する列に対してデフォルト値を指定していない場合、列にNULLが設定されます。
デフォルト値への更新の制限事項: ビューを更新する場合は、DEFAULT
を指定できません。
VALUE句
VALUE
句を使用すると、オブジェクト表の行全体を指定できます。
VALUE句の制限事項: この句は、オブジェクト表に対してのみ指定できます。
注意: RAW 列に文字列リテラルを挿入する場合、後続の問合せ中にRAW 列にある索引は使用されずに、全表スキャンが行われます。 |
where_clause
を使用すると、指定したcondition
がtrueである行のみを更新するように制限できます。この句を指定しない場合、表またはビューのすべての行が更新されます。conditionの構文は、第7章「条件」
を参照してください。
where_clause
は、値を更新する行を決定します。where_clause
を指定しない場合、すべての行が更新されます。where_clause
の条件を満たす行ごとに、update_set_clause
の等号演算子(=)の左側にある列に、演算子の対応する右側の式の値が設定されます。式は行が更新される場合に評価されます。
この句を使用すると、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言語リファレンス』 を参照してください。 |
error_logging_clause
error_logging_clauseのUPDATE
文での動作は、INSERT
文の場合と同じです。詳細は、「INSERT
」文の「error_logging_clause」を参照してください。
例
表の更新例: 次の文は、職種がSH_CLERK
のすべての従業員の歩合にNULL値を指定します。
UPDATE employees SET commission_pct = NULL WHERE job_id = 'SH_CLERK';
次の文は、Douglas Grantを部門20の管理者に昇格させ、給与を$1,000引き上げます。
UPDATE employees SET job_id = 'SA_MAN', salary = salary + 1000, department_id = 120 WHERE first_name||' '||last_name = 'Douglas Grant';
次の文は、remote
データベースのemployees
表の従業員の給与を増加します。
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = 'Baer';
次の例は、UPDATE
文の次の構文要素を示します。
単一文にまとめたupdate_set_clause
の2つの形式
相関副問合せ
更新された行を制限するwhere_clause
UPDATE employees a SET department_id = (SELECT department_id FROM departments WHERE location_id = '2100'), (salary, commission_pct) = (SELECT 1.1*AVG(salary), 1.5*AVG(commission_pct) FROM employees b WHERE a.department_id = b.department_id) WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 2900 OR location_id = 2700);
このUPDATE
文によって、次の処理が実行されます。
ジュネーブまたはミュンヘン(location_idは2900または2700)で働く従業員のみを更新します。
これらの従業員のdepartment_id
をボンベイ(location_id
は2100)の対応するdepartment_id
に設定します。
各従業員の給与を、その部門の平均給与の110%に上げます。
各従業員の歩合を、その部門の平均歩合の150%に上げます。
パーティションの更新例: 次の文は、sales
表の1つのパーティションの値を更新します。
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
オブジェクト表の更新例: 次の文では、2つのオブジェクト表(people_demo1
およびpeople_demo2
)が作成されますが、これらの型は「表のコレクション例」
で作成されたpeople_typオブジェクトです。この例では、people_demo2
から行を選択してpeople_demo1
の行を更新する方法を示します。
CREATE TABLE people_demo1 OF people_typ; CREATE TABLE people_demo2 OF people_typ; UPDATE people_demo1 p SET VALUE(p) = (SELECT VALUE(q) FROM people_demo2 q WHERE p.department_id = q.department_id) WHERE p.department_id = 10;
この例では、SET
句と副問合せの両方で、VALUE
オブジェクト参照ファンクションを使用します。
相関更新の例: 相関副問合せを使用してネストした表の行を更新する例は、「表のコレクション例:」を参照してください。
UPDATE操作中にRETURNING句を使用する例: 次の文は、更新された行の値を戻し、PL/SQL変数bnd1
、bnd2
、bnd3
に結果を格納します。
UPDATE employees SET job_id ='SA_MAN', salary = salary + 1000, department_id = 140 WHERE last_name = 'Jones' RETURNING salary*0.25, last_name, department_id INTO :bnd1, :bnd2, :bnd3;
次の文は、RETURNING句の式で単一セットの集計ファンクションを指定できることを示します。
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;