UPDATE (日本語)
目的
UPDATEステートメントを使用して、テーブルまたはビューのベーステーブルの既存の値を変更します。マテリアライズドビューのマスターテーブル。
追加トピック
-
前提条件
-
構文
-
セマンティクス
-
例
前提条件
の場合テーブルの値を更新するには、テーブルが独自のスキーマにあるか、テーブルに対するUPDATEオブジェクト権限を持っている必要があります。
更新するにはビューのベーステーブルの値:
-
ビューに対する
UPDATEオブジェクト権限が必要です。 -
ビューを含むスキーマを所有する人は、ベーステーブルに対する
UPDATEオブジェクト権限を持っている必要があります。
UPDATE ANY TABLEシステム権限では、任意の値を更新することもできます。テーブルまたはベーステーブル
次の場合は、更新するオブジェクトに対するSELECTオブジェクト権限も必要です。
-
オブジェクトがリモートデータベース上にあるか、
-
SQL92_SECURITY初期化パラメーターがTRUEおよびUPDATE操作は、where_clauseの列などのテーブル列を参照します。
構文
update :: =
図の説明update.gif
(DML_table_expression_clause :: =、update_set_clause :: =、where_clause :: =、returning_clause :: =、error_logging_clause :: =)
DML_table_expression_clause :: =
図の説明DML_table_expression_clause.gif
(subquery :: = -SELECTの一部、subquery_restriction_clause :: =、table_collection_expression :: =)
subquery_restriction_clause :: =

イラストの説明subquery_restriction_clause.gif
table_collection_expression :: =
![]()
イラストの説明table_collection_expression.gif
update_set_clause :: =

イラストの説明update_set_clause。 gif
where_clause :: =
![]()
イラストの説明where_clause.gif
returning_clause :: =

イラストの説明returning_clause.gif
error_logging_clause :: =
イラストの説明error_logging_clause.gif
セマンティクス
ヒント
コメントを指定これは、ステートメントの実行計画を選択する際の命令をオプティマイザに渡します。
UPDATEキーワードの直後に並列ヒントを配置して、嘘つきスキャンおよびUPDATE操作。
関連項目:
-
Oracle Database Performance TuningGuideおよび “ヒントの構文と説明については「ヒントの使用」
-
並列DMLの詳細については、 『Oracle Databaseパフォーマンスチューニングガイド』および 『Oracle Database Concepts』を参照してください。 >
DML_table_expression_clause
ONLY句はビューにのみ適用されます。 UPDATE句のビューが階層に属するビューであり、どの行からも行を更新したくない場合は、ONLY構文を指定します
関連項目:
「DML_table_expression_clauseの制限」および「テーブルの更新:例」
スキーマ
更新するオブジェクトを含むスキーマを指定します。 schemaを省略すると、データベースはオブジェクトが独自のスキーマにあると見なします。
table |ビュー| materialized_view | subquery
更新するサブクエリによって返されるテーブル、ビュー、マテリアライズドビュー、または列の名前を指定します。テーブルに対してUPDATEステートメントを発行すると、テーブルに関連付けられているUPDATEトリガーが起動します。
-
viewを指定すると、データベースはビューのベーステーブルを更新します。ビューの定義クエリに次のいずれかの構成が含まれている場合、INSTEADOFトリガーを使用する場合を除いてビューを更新することはできません。
集合演算子ADISTINCT演算子集計または分析関数AGROUPBY、ORDERBY、MODEL、CONNECTBY、またはSTARTWITH句のコレクション式SELECTリストSELECTリスト内のサブクエリWITH READ ONLYで指定されたサブクエリは、いくつかの例外を除いて結合します。 、 『Oracle Database管理者ガイド』に記載されているように
-
ビューから複数のベーステーブルを更新することはできません。
-
さらに、ビューは
WITHCHECKの場合、結果のデータがビューの定義クエリを満たしている場合にのみ、ビューを更新できます。 -
tableまたはviewのベーステーブルに1つ以上のドメインインデックス列が含まれている場合、このステートメントは適切なインデックスタイプ更新ルーチンを実行します。 -
読み取り専用のマテリアライズドビューの行を更新することはできません。書き込み可能なマテリアライズドビューの行を更新すると、データベースは基になるコンテナテーブルの行を更新します。ただし、更新は次の更新操作で上書きされます。マテリアライズド・ビュー・グループの一部である更新可能なマテリアライズド・ビューの行を更新すると、データベースはマスター表の対応する行も更新します。
参照また:
-
インデックスタイプ更新ルーチンの詳細については、 『Oracle Data Cartridge Developer’s Guide』を参照してください。
-
に関する情報については、CREATE MATERIALIZEDVIEW更新可能なマテリアライズド・ビューの作成
PARTITION | SUBPARTITION
table更新の対象。パーティション表の値を更新するときにパーティション名を指定する必要はありません。ただし、複雑なwhere_clauseよりもパーティション名を指定する方が効率的な場合があります。 。
関連項目:
「パーティション化されたテーブルとインデックスの参照」および「パーティションの更新:例」
dblink
指定リモートデータベースへのデータベースリンクの完全または部分的な名前。ここで、tオブジェクトが見つかりました。 Oracle Database分散機能を使用している場合にのみ、データベースリンクを使用してリモートオブジェクトを更新できます。
dblink,を省略すると、データベースはオブジェクトがローカルデータベース上。
関連項目:
データベースリンクの参照については、「リモートデータベース内のオブジェクトの参照」
subquery_restriction_clause
subquery_restriction_clauseを使用して、次のいずれかの方法でサブクエリを制限します。
読み取り専用WITH READ ONLYを指定します。テーブルまたはビューを更新できないことを示します。
チェックオプション付きWITH CHECK OPTIONを指定して、Oracleデータベースがテーブルまたはビューへの変更を禁止することを示します。サブクエリに含まれていない行。 DMLステートメントのサブクエリで使用する場合、この句はFROM句のサブクエリで指定できますが、WHERE句。
CONSTRAINT制約CHECK OPTION制約の名前を指定します。この識別子を省略すると、Oracleは制約にSYS_C nという形式の名前を自動的に割り当てます。ここで、nはデータベース内で一意の制約名。
関連項目:
「WITHCHECKOPTION句の使用:例」
table_collection_expression
table_collection_expressionを使用すると、collection_expressionの値をクエリおよびDML操作の目的でテーブルとして扱う必要があることをOracleに通知できます。 collection_expressionは、サブクエリ、列、関数、またはコレクションコンストラクターにすることができます。その形式に関係なく、コレクション値、つまり、型がネストされたテーブルまたは変数である値を返す必要があります。コレクションの要素を抽出するこのプロセスは、コレクションのネスト解除と呼ばれます。
TABLE式を親と結合する場合は、オプションのプラス(+)が関係します。テーブル。 +は、2つの外部結合を作成するため、コレクション式がnullの場合でも、クエリは外部テーブルから行を返します。
注:
Oracleの以前のリリースでは、 collection_expressionがサブクエリの場合、table_collection_expressionはTHE subquery。この使用法は非推奨になりました。
table_collection_expressionを使用して、別のテーブルの行に基づいて1つのテーブルの行を更新できます。たとえば、4つの四半期売上テーブルを1年売上テーブルにロールアップできます。
t_alias
参照するテーブル、ビュー、またはサブクエリの相関名(エイリアス)を指定します。ステートメントの他の場所。このエイリアスは、DML_table_expression_clauseがオブジェクトタイプの属性またはオブジェクトタイプのメソッドを参照する場合に必要です。
関連項目:
「関連する更新:例”
DML_table_expression_clauseの制限この句には、次の制限があります。
-
tableまたはviewのベーステーブルには、IN_PROGRESSまたはFAILEDとマークされたドメインインデックスが含まれています。 -
影響を受けるインデックスパーティションが
UNUSABLEとマークされている場合、パーティションに挿入することはできません。 -
DML_table_expression_clauseのサブクエリでorder_by_clauseを指定することはできません。 -
UNUSABLEとマークされたインデックス、インデックスパーティション、またはインデックスサブパーティションを指定した場合、UPDATEステートメントは、SKIP_UNUSABLE_INDEXESセッションパラメータTRUEに設定されています。
関連項目:
セッションパラメータ
update_set_clause
update_set_clauseを使用すると、列の値を設定できます。
column
更新するオブジェクトの列の名前を指定します。 update_set_clauseからテーブルの列を省略した場合、その列の値は変更されません。
columnはLOBオブジェクト属性を参照しているため、最初に空またはnullの値で初期化する必要があります。リテラルで更新することはできません。また、直接のUPDATE SQLステートメント以外の方法を使用してLOB値を更新する場合は、最初にLOBを含む行をロックする必要があります。詳細については、for_update_clauseを参照してください。
columnがパーティションテーブルのパーティションキーの一部である場合、UPDATE行の移動を有効にしない限り、行を別のパーティションまたはサブパーティションに移動する列の値を変更すると失敗します。 CREATETABLEまたはALTERTABLEのrow_movement_clauseを参照してください。
さらに、columnがリストパーティションテーブルのパーティションキーの場合、partition_value divにまだ存在しない列の値を指定すると、UPDATEは失敗します。 >パーティションの1つのリスト。
サブクエリ
更新された行ごとに正確に1つの行を返すサブクエリを指定します。
-
If
update_set_clauseで1つの列のみを指定すると、サブクエリは1つの値のみを返すことができます。 -
update_set_clauseの場合、サブクエリは指定した列と同じ数の値を返す必要があります。 -
サブクエリが行を返さない場合は、列にはnullが割り当てられます。
-
この
subqueryがリモートオブジェクトを参照している場合、UPDATE操作は、参照元がceは、ローカルデータベース上のオブジェクトにループバックしません。ただし、DML_table_expression_clauseのsubqueryがリモートオブジェクトを参照している場合、UPDATE操作は通知なしでシリアルに実行されます。
サブクエリ内でflashback_query_clauseを使用して、過去のデータ。この句の詳細については、SELECTのflashback_query_clauseを参照してください。
関連項目:
-
SELECTと「サブクエリの使用」
-
CREATETABLEドキュメントのparallel_clause
expr
対応する列に割り当てられた新しい値に解決される式を指定します。
関連項目:
第6章「式」exprおよび “オブジェクトテーブルの更新:例”
DEFAULT DEFAULTを指定して、列を以前にデフォルトとして指定した値に設定します列の値。対応する列のデフォルト値が指定されていない場合、データベースは列をnullに設定します。
デフォルト値への更新の制限DEFAULT ifビューを更新しています。
VALUE句
VALUE句を使用すると、オブジェクトテーブルの行全体を指定できます。
VALUE句の制限この句は、オブジェクトテーブルに対してのみ指定できます。
注:
文字列リテラルをRAW列に挿入すると、後続のクエリ中にOracleDatabaseは全表スキャンを実行します。 RAW列に存在する可能性のあるインデックスを使用するのではなく。
関連項目:
「オブジェクトテーブルの更新:例」
where_clause
where_clauseを使用すると、更新される行を、指定されたconditionは本当です。この句を省略すると、データベースはテーブルまたはビューのすべての行を更新します。 conditionの構文については、第7章「条件」を参照してください。
where_clauseは次の行を決定しますどの値が更新されるか。 where_clauseを指定しない場合、すべての行が更新されます。 where_clauseを満たす各行について、update_set_clauseの等式演算子(=)の左側の列が値に設定されます演算子の右側にある対応する式の。式は、行が更新されるときに評価されます。
returning_clause
return句は、DMLステートメントの影響を受ける行を取得します。この句は、テーブルとマテリアライズドビュー、および単一のベーステーブルを持つビューに対して指定できます。
単一の行を操作する場合、returning_clauseを含むDMLステートメント影響を受ける行、ROWID、および影響を受ける行へのREFsを使用して列式を取得し、それらをホスト変数またはPL / SQL変数に格納できます。
操作時複数の行の場合、returning_clauseを含むDMLステートメントは、式、ROWID、およびバインド配列内の影響を受ける行を含むREFsからの値を格納します。
expr exprリストの各項目は有効な式構文である必要があります。
INTO INTO句は、変更された行の値がdata_itemリストで指定された変数に格納されることを示します。
data_item各data_itemは、取得したexpr値を格納するホスト変数またはPL / SQL変数です。
RETURNINGリストの式ごとに、対応するタイプ互換のPL / SQL変数またはホスト変数をINTOリスト。
制限事項RETURNING句には次の制限事項が適用されます。
-
exprは次のように制限されています。-
UPDATEおよびDELETE各exprステートメントは、単純な式または単一セットの集計関数式である必要があります。同じreturning_clauseで単純な式と単一セットの集計関数式を組み合わせることはできません。INSERTステートメントの場合、各exprは単純な式である必要があります。集計関数は、INSERTステートメントRETURNING句ではサポートされていません。 -
単一- setaggregate関数式に
DISTINCTキーワードを含めることはできません。
-
-
リストに主キー列またはその他の
NOTNULL列が含まれている場合、テーブルにBEFOREUPDATEトリガーが定義されています。 -
マルチテーブル挿入の場合。
-
この句を並列DMLまたはリモートオブジェクトで使用することはできません。
-
この句を使用して
LONGタイプを取得することはできません。 -
この句をビューに指定することはできません。
INSTEADOFトリガーが定義されています。
関連項目:
PL / SQLユーザー」 ■BULK COLLECT句を使用してコレクション変数に複数の値を返す方法についてのガイドとリファレンス
error_logging_clause
error_logging_clauseは、UPDATEステートメントでもINSERTステートメントと同じ動作をします。詳細については、INSERTステートメントerror_logging_clauseを参照してください。
関連項目:
「エラーログを使用したテーブルへの挿入:例」
例
テーブルの更新:例次の例このステートメントは、仕事をしているすべての従業員にnullコミッションを与えますSH_CLERK:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
次のステートメントは、ダグラスグラントをマネージャーに昇格させます部門20の1,000ドルの昇給:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
次のステートメントは、employeesの従業員の給与を増やします。 remoteデータベースのテーブル:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
次の例は、UPDATEステートメント:
-
update_set_clauseの両方の形式を1つのステートメントにまとめた -
相関サブクエリ
-
where_clause更新された行を制限する
前述のUPDATEステートメントは次の操作を実行します。
-
ジュネーブまたはミュンヘン(場所2900および2700)で働く従業員のみを更新します
-
セット
department_idこれらの従業員はボンベイに対応するdepartment_id(location_id2100) -
各従業員の給与を部門の平均給与の1.1倍に設定します
-
各従業員の手数料を部門の平均手数料の1.5倍に設定します
パーティションの更新:例次の例では、salesテーブルの単一パーティションの値を更新します。
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の行を更新する方法を示しています。
この例では、 VALUEオブジェクト参照関数のSET句とサブクエリの両方。
関連する更新:例次の例の場合相関サブクエリを使用してネストされたテーブル行を更新します。「テーブルコレクション:例」を参照してください。
更新中のRETURNING句の使用:例次の例では、更新された行から値を返し、結果をPLに格納します。 / SQL変数bnd1、bnd2、bnd3:
次の例は、戻り句の式で単一セットの集計関数を指定できることを示しています。
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;