UPDATE

UPDATE ステートメントは、表またはビューの行の指定した列の値を更新します。 このビューに対して INSTEAD OF UPDATE トリガーが定義されていない場合、 ビューの行を更新すると、そのビューの基本表の行が更新されます。 そのようなトリガーが定義されていれば、代わりにこのトリガーが活動化されます。

このステートメントには、以下の 2 つの形式があります。

  • 検索条件付き UPDATE 形式は、 1 つ以上の行 (任意指定の検索条件によって決まる) を更新する場合に使用されます。
  • 位置指定 UPDATE 形式は、 1 行 (カーソルの現在位置によって決まる) だけを更新する場合に使用されます。

呼び出し

検索 UPDATE ステートメントは、アプリケーションに組み込むか、 または対話式に呼び出すことができます。位置指定 UPDATE ステートメントは、 アプリケーション・プログラムに組み込んで使用しなければなりません。 どちらの形式も、動的に準備できる実行可能ステートメントです。

権限

このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。

  • ステートメントに指定された表またはビューに対して、
    • 表やビューに対する UPDATE 特権、または
    • 更新される各列に対する UPDATE 特権、または
    • 表やビューが入っているライブラリーに対する *EXECUTE システム権限
  • データベース管理者権限

割り当て文節 にその表または ビューの列に対する参照が含まれている場合、または検索 UPDATE の 検索条件 にその表またはビューの列に対する参照 が含まれている場合は、ステートメントの権限 ID が保持する特権には、以下の いずれか 1 つも含まれていなければなりません。

  • その表またはビューについての SELECT 特権
  • セキュリティー管理者権限

検索条件 に副照会が含まれている場合、 または割り当て文節スカラー全選択行全選択 が含まれている場合、照会で、各副選択に必要な権限の説明を参照してください。

SQL 特権に対応するシステム権限については、『表またはビューへの権限を検査する際の対応するシステム権限』を参照してください。

構文

検索 UPDATE:
構文図を読む構文図をスキップする
>>-UPDATE--+-table-name-+--+--------------------+--------------->
           '-view-name--'  '-correlation-clause-'   

>--+-------------------------+--SET--assignment-clause---------->
   +-OVERRIDING SYSTEM VALUE-+                           
   '-OVERRIDING USER VALUE---'                           

>--+-------------------------+---------------------------------->
   '-WHERE--search-condition-'   

   .-----------------------------------------.   
   V                                         |   
>----+-------------------------------------+-+-----------------><
     +-isolation-clause--------------------+     
     '-concurrent-access-resolution-clause-'     

位置指定 UPDATE:
構文図を読む構文図をスキップする
>>-UPDATE--+-table-name-+--+--------------------+--------------->
           '-view-name--'  '-correlation-clause-'   

>--+-------------------------+--SET--assignment-clause---------->
   +-OVERRIDING SYSTEM VALUE-+                           
   '-OVERRIDING USER VALUE---'                           

>--WHERE CURRENT OF--cursor-name-------------------------------><

構文図を読む構文図をスキップする
 割り当て文節

     .-,------------------------------------------------------------.     
     V                                                              |     
|--+---+-+-column-name-------+-- = --+-expression-+---------------+-+-+--|
   |   | '-(--column-name--)-'       +-NULL-------+               |   |   
   |   |                             '-DEFAULT----'               |   |   
   |   |    .-,-----------.               .-,--------------.      |   |   
   |   |    V             |               V                |      |   |   
   |   '-(----column-name-+--)-- = --(--+---+-expression-+-+-+--)-'   |   
   |                                    |   +-NULL-------+   |        |   
   |                                    |   '-DEFAULT----'   |        |   
   |                                    '-row-fullselect-----'        |   
   |                .-,--------------.                                |   
   |                V                |                                |   
   '-ROW-- = --(--+---+-expression-+-+-+--)---------------------------'   
                  |   +-NULL-------+   |                                  
                  |   '-DEFAULT----'   |                                  
                  '-row-fullselect-----'                                  

構文図を読む構文図をスキップする
isolation-clause

|--WITH--+-NC-+-------------------------------------------------|
         +-UR-+   
         +-CS-+   
         +-RS-+   
         '-RR-'   

説明

table-name または view-name
更新する表またはビューを指定します。 この名前は、現行サーバーに存在している表またはビューを識別していなければなりませんが、 カタログ表、カタログ表のビュー、または読み取り専用のビューを識別するものであってはなりません。 読み取り専用ビューおよび更新可能ビューについての説明は、CREATE VIEWを参照してください。
相関文節
表またはビューを示すために、search-condition ま たは assignment-clause 内で使うことができます。相関文節 の説明については、table-referenceを参照してください。相関名 の説明については、相関名を参照してください。
OVERRIDING SYSTEM VALUE または OVERRIDING USER VALUE
ROWID 列、識別列、または行変更タイム・スタンプ列にシステムが生成した値またはユーザーが指定した値を使用するかどうかを指定します。OVERRIDING SYSTEM VALUE を指定する場合は、SET 文節内の暗黙的または明示的な列リストに、GENERATED ALWAYS として定義された 変更の始まりROWID 列、ID 列、または行変更タイム・スタンプ変更の終わり列が含まれていることが必要です。 OVERRIDING USER VALUE を指定する場合は、SET 文節内の暗黙または明示的な列リストに、GENERATED ALWAYS また は GENERATED BY DEFAULT として定義された列が含まれていることが必要です。
OVERRIDING SYSTEM VALUE
GENERATED ALWAYS として定義されている 変更の始まりROWID 列、ID 列、または行変更タイム・スタンプ変更の終わり列について、SET 文節に 指定されている値を使用することを指定します。 システム生成の値は使用されません。
変更の始まり行開始列、行終了列、トランザクション開始 ID 列、または生成式列の値が提供された場合、 それは DEFAULT でなければなりません。変更の終わり
OVERRIDING USER VALUE
GENERATED ALWAYS または GENERATED BY DEFAULT として定義され ている列について、SET 文節に指定されている値を無視することを指定します。 代わりにシステム生成の値が使用され、ユーザー指定の値はオーバーライドされます。

OVERRIDING SYSTEM VALUE と OVERRIDING USER VALUE のどちらも指定し ない場合は、以下のようになります。

  • GENERATED ALWAYS として定義された ROWID 列、ID 列、行変更タイム・スタンプ列変更の始まり、行開始列、行終了列、トランザクション開始 ID 列、 および生成式列変更の終わりに、値を指定することはできません。
  • GENERATED BY DEFAULT として定義されている ROWID 列に ついては、値を指定することができます。 値を指定した場合は、この列にその値が割り当てられます。 ただし、BY DEFAULT として定義された ROWID 列の値を更新できるのは、指定した値が DB2®for z/OS® または DB2 for i により既に生成されている有効な行 ID 値である場合に限られます。
  • GENERATED BY DEFAULT として定義されている識別列または行変更タイム・スタンプ列には、値を指定することができます。 BY DEFAULT として定義された識別列または行変更タイム・スタンプ列の値を更新すると、その識別列または行変更タイム・スタンプ列が固有制約または固有索引内の唯一のキーである場合以外は、データベース・マネージャーは指定された値がその列で固有な値であるかどうかを検査しません。 固有制約も固有索引もない場合は、データベース・マネージャーは、NO CYCLE が有効である 場合に限り、システム生成の値のセットの中でのみ各値の固有性を保証します。

    値が指定されていない場合は、データベース・マネージャーは新しい値を生成します。

SET
列名への値の割り当てを指定します。
assignment-clause
column-name
更新する列を識別します。列名 は、指定された表またはビューの列を識別するものでなければなりません。 拡張標識変数が使用不可の場合、その列は、スカラー関数、定数、または式から得られるビューの列を識別するものであってはなりません。 列を複数回指定することはできません。

位置指定 UPDATE の場合 :

  • UPDATE 文節をカーソルに関する SELECT ステートメントに指定する場合は、 SET リストのそれぞれの列名を、UPDATE 文節にも指定しなければなりません。
  • UPDATE 文節をカーソルに関する SELECT ステートメントに指定しない場合は、 更新可能な任意の列の名前を指定することができます。

詳しくは、UPDATE 文節を参照してください。

1 つのビューに同じ列から得られる 2 つの列がある場合、その列の値を更新することは可能ですが、 その 2 つの列を同一の UPDATE ステートメントで更新することはできません。

列名 のリストを指定する場合は、、NULL、および DEFAULT の数が列名 の数に一致して いなければなりません。

ROW
指定された表またはビューのすべての列 (ただし、隠し属性を指定して定義された列以外) を識別します。ビューが指定されている場合、 そのビューの列がまったく、スカラー関数、定数、または式から派生していない場合があります。

、NULL、および DEFAULT の数 (または行全選択 から の結果列の数) は、行の列の数と一致していなければなりません。

位置指定 UPDATE の場合、カーソルの SELECT ステートメント内に UPDATE 文節が指定されている場合、 その UPDATE 文節にも表またはビューの各列を指定しなければなりません。 詳しくは、UPDATE 文節を参照してください。

ビューに、そのビューの別の列から派生したビュー列が含まれている場合、 そのビューに ROW を指定することはできません。これは、両方の列を同じ UPDATE ステートメント内で更新できないためです。

expression
列の新しい値を指定します。 expression は、で説明したタイプの任意の式です。この式の中で、集約関数を使用してはなりません。

式の中の列名 は、指定した表またはビューの列の名前を指定するものでなければなりません。 行が更新されるたびに、その行の列の値 (行を更新する前の値) がこの式の列の値になります。

この文節に指定する各変数は、ホスト構造体や変数の宣言の規則に従って 宣言されているホスト構造体または変数を識別していなければなりません。 このステートメントの操作形式では、ホスト構造体に対する参照は、 その個々の変数それぞれに対する参照によって置き換えられます。 が単一のホスト変数である場合、そのホスト変数には、拡張標識変数で使用可能な標識を組み込むことができます。 拡張標識変数が使用可能で、割り当て文節内の式が単一のホスト変数でない場合、拡張標識変数値 DEFAULT および UNASSIGNED を使用してはなりません。変数と構造についての詳細は、ホスト変数に対する参照および ホスト構造を参照してください。 ホスト構造を指定した場合、 キーワード ROW を指定しなければなりません。

NULL
列の新しい値を NULL 値にすることを指定します。NULL は、NULL 可能列にのみ指定してください。
DEFAULT
列にデフォルト値を割り当てることを指定します。使用される値は、 次のように、列がどのように定義されたかによって異なります。
  • 変更の始まり式に基づいて生成列として列が定義されている場合は、 その式に基づいた列の値がデータベース・マネージャーによって生成されます。 変更の終わり
  • 列が ROWID 列、ID 列変更の始まり、行開始列、行終了列、またはトランザクション開始 ID 列変更の終わりの場合、 データベース・マネージャーは新しい値を生成します。
  • WITH DEFAULT 文節が使用される場合、使用されるデフォルト値は、 その列に関して定義されている値になります (CREATE TABLE列定義デフォルト文節 を参照してください)。
  • WITH DEFAULT 文節または NOT NULL 文節が使用されない場合、使用される値は NULL です。
  • 列が行変更タイム・スタンプ列として定義されると、新規の行変更タイム・スタンプ値が列に割り当てられます。

NOT NULL 文節が使用されていて、WITH DEFAULT 文節が使用されていない場合、 または DEFAULT NULL が使用されている場合、その列については DEFAULT キーワードは指定できません。

DEFAULT は、GENERATED ALWAYS として定義されている ID 列には指定する必要があります。ただし、OVERRIDING SYSTEM VALUE が使用される場合は例外です。

変更の始まり行開始列、行終了列、トランザクション開始 ID 列、または生成式列に設定可能な値は、DEFAULT のみです。変更の終わり

row-fullselect
1 つの結果行を戻す全選択。選択リスト内の結果列の数は、 割り当てのために指定された列名 の数 (または ROW が指定されている場合は、その行の列の数) と 一致していなければなりません。結果列の値は、対応する各列名 に割り当てられます。 全選択の結果に行が含まれない場合、NULL 値が割り当てられます。 結果の中に複数の行がある場合には、エラーが戻されます。

行全選択 には、 UPDATE ステートメントのターゲット表の列に対する参照が含まれている場合があります。 行が更新されるたびに、その行の列の値 (行を更新する前の値) がこの式の列の値になります。

WHERE
更新する行を指定します。文節を省略するか、あるいは検索条件 またはカーソル名 を指定できます。 この文節を指定しなかった場合は、指定した表またはビューのすべての行が更新されます。
search-condition
検索条件で説明している、いずれかの検索条件を指定します。 検索条件の中のそれぞれの列名 (副照会の中は除く) は、 指定した表またはビューにある列の名前を指定するものでなければなりません。 UPDATE と副照会の基本オブジェクトが両方とも同じ表になる場合に、検索条件に副照会が含まれるときは、 その副照会の評価が完了してから行が更新されます。

検索条件 は、表またはビューの各行に適用されます。 更新された行は、検索条件 の結果が真であるものです。

検索条件に副照会が含まれている場合は、 いずれかの行に検索 条件 が適用されるたびにその副照会が実行され、副照会の結果が 検索条件 の適用に使用されると考えることができます。 実際には、相関参照のない副照会は一度しか実行されないことがあります。 各行ごとに 1 回ずつ実行する必要があるのは、相関参照がある副照会です。

CURRENT OF cursor-name
更新操作で使用するカーソルを識別します。 カーソル名 は、DECLARE CURSORの説明にしたがって宣言されているカーソルを識別しなければなりません。

更新を指定した表またはビューは、このカーソルに関する SELECT ステートメントの FROM 文節でも 指定されていなければなりません。また、このカーソルの結果表が読み取り専用であってはなりません。 読み取り専用の結果表の説明については、DECLARE CURSORを参照してください。

変更の始まりDECLARE CURSOR ステートメントには、UPDATE ステートメントで使用される表またはビューの period-specification があってはなりません。変更の終わり

UPDATE ステートメントの実行時点では、カーソルはある行に位置付けられていなければなりません。 その行が更新されます。

ISOLATION 文節
このステートメントに関して使用する分離レベルを指定します。
WITH
分離レベルを指定します。次のいずれかになります。
  • RR 反復可能読み取り
  • RS 読み取り固定
  • CS カーソル固定
  • UR 非コミット読み取り
  • NC コミットなし
ISOLATION 文節 を指定しなかった場合は、デフォルトの分離レベルが使用されます。 デフォルトの判別方法については、ISOLATION 文節を参照してください。
concurrent-access-resolution-clause
SELECT ステートメントで使用する並行アクセスの解決方法を指定します。詳しくは、concurrent-access-resolution-clauseを参照してください。

UPDATE の規則

割り当て: 更新する値は、割り当ておよび比較で説明されている 記憶域割り当て規則に従って、列に割り当てられます。

妥当性検査: 更新は、以下の規則に従う必要があります。 従わない場合、または UPDATE ステートメントの実行中にその他のエラーが生じる場合、 行は更新されません。

  • 全選択: 行全選択 またはスカラー全選択 は、複数の行を戻してはなりません。(SQLSTATE 21000)。
  • 固有制約および固有索引: 識別された表、 または識別されたビューの基本表が 1 つ以上の固有索引または固有制約を持つ場合は、 その表の更新される各行は、それらの索引および制約によって課せられる制限に 適合しなければなりません (SQLSTATE 23505)。

    すべての固有性検査は、ステートメントの終わりに実際に行われます。 固有索引または固有制約に関連する列の複数行 UPDATE ステートメントの場合、これはすべての行が更新された後で行われます。

  • 検査制約: 識別された表、または識別されたビューの基本表が、 1 つ以上の検査制約を持つ場合、表で更新される各行ごとに、 検査制約は真または不明でなければなりません (SQLSTATE 23513)。

    すべての検査制約は、ステートメントの終わりで必ず検証されます。 複数行 UPDATE ステートメントの場合、これはすべての行が更新された後で行われます。

  • ビューと WITH CHECK OPTION: ビューが識別されている場合は、 更新された行は適用される WITH CHECK OPTION に適合しなければなりません (SQLSTATE 44000)。 詳しくは、CREATE VIEWを参照してください。

トリガー:識別された表または識別されたビューの基本表が更新トリガーを持つ場合、 トリガーが起動されます。 トリガーが起動された結果、更新される値に応じて、他のステートメント が実行されたり、エラー条件が発生したりすることがあります。

参照保全: 親行の親キーの値を変更してはなりません。

更新値が NULL 値以外の外部キーを生成する場合、その外部キーは関連する親表の親キーの何らかの値に等しくなければなりません。

参照制約 (RESTRICT 削除規則を伴う参照制約以外の) は、ステートメントの終わりで実際上チェックされます。 複数行 UPDATE ステートメントの場合、これはすべての行が更新された後で行われます。

XML 値: XML 列を更新する場合、新しい値は整形式 XML 文書でなければなりません。

行アクセス制御 または列アクセス制御が適用されている表の行の更新: 行アクセス制御または 列アクセス制御が適用されている表に対して UPDATE ステートメントが発行されると、 有効な行の許可または列マスクに指定されている規則によって、行を更新できるかどうかが判定されます。 通常、これらの規則は、ステートメントの許可 ID に基づきます。以下に、有効になっている行の許可または列マスクが UPDATE 時にどのように使用されるかについて説明します。
  • 行の許可を使用して、更新される行のセットが識別されます。

    1 つの表に対して、有効な行の許可が複数定義されている場合は、有効になっている各許可の検索条件に論理 OR 演算子を適用することにより、行アクセス制御検索条件が導出されます。 この行アクセス制御検索条件が表に適用されて、UPDATE ステートメントの権限 ID でアクセス 可能な行が決定されます。 WHERE 節を UPDATE ステートメントに指定した場合は、アクセス可能な行に対してユーザーが指定した述部が適用されて、更新される行が決定されます。 WHERE 節がない場合、更新される行は、すべてのアクセス可能な行です。

  • 更新される行が存在する場合、それらの行を更新できるかどうかは、以下の規則によって決まります。
    • 新しい行の値を導出するときに列を参照する場合に、 その列に有効になっている列マスクが存在すると、新しい値は、マスクされた状態の値を使用して導出されます。 オブジェクト表でも列アクセス制御がアクティブになっている場合、 新しい値を導出するために適用される列マスク は、定数や式ではなく、列自体を戻す必要があります。列マスクを列に適用した結果が列自体にならない 場合、新しい値は更新に使用できず、エラーが戻されます。
    • 行が更新可能な場合、表に BEFORE UPDATE トリガーが存在すれば、そのトリガーがアクティブ化されます。

      トリガー・アクション中に、遷移変数内の更新用の新しい値が変更されることがあります。 最終的な値がトリガーから戻されると、その新しい値が更新に使用されます。

    • 更新される行は、有効になっている行の許可に準拠していなければなりません。

      更新される各行について、古い値が、UPDATE ステートメントに指定された新しい値に置き換えられます。 有効になっている行の許可に準拠する行とは、更新された場合に、導出される行アクセス制御検索条件を使用して取得可能な行のことです。

    • 行が更新可能な場合、表に AFTER UPDATE トリガーが存在すれば、そのトリガーがアクティブ化されます。

マスクされた データを、更新操作の値として使用される変数に割り当てることが できます。列に更新違反チェック制約が存在 しない場合、マスクされたデータで列が更新され、 エラーは発行されません。

パーティション化された表のパーティション・キー の更新: パーティション化された表の行のパーティション・キー が、その行が別のパーティションに属すように更新される場合:
  • 指定されるターゲット表は、表の単一のパーティションを参照する別名であってはなりません。
  • 指定されるターゲット表は、ジャーナル処理の対象でなければなりません。

拡張標識変数の使用: 拡張標識変数が使用可能な場合、正の値および 0 (ゼロ) から -7 以外の標識変数値を使用しないでください。 DEFAULT および UNASSIGNED 拡張標識変数値を、それらがサポートされていないコンテキストに指定しないでください。

拡張標識変数: UPDATE ステートメントの割り当て文節 では、単一のホスト変数を参照する式を使用すると、拡張標識変数の値を割り当てることができます。 拡張標識変数値 UNASSIGNED の割り当ては、列が assignment-clause に指定されていない場合と同様の影響を及ぼします。 拡張標識変数値 DEFAULT の割り当ては、デフォルト値を持つ列変更の始まり、または GENERATED ALWAYS として定義されていて新しい値が生成される列 (行変更タイム・スタンプ列など) 変更の終わりに対してのみ使用できます。

ターゲット列が更新可能でない場合 (例えば、GENERATED ALWAYS として定義された識別列の場合など)、その列には拡張標識変数値 UNASSIGNED を割り当てる必要があります。

UPDATE ステートメントでは、拡張標識変数値 UNASSIGNED をすべてのターゲット列に割り当ててはなりません。

拡張標識変数および更新トリガー: ターゲット列に拡張標識変数値 UNASSIGNED が割り当てられている場合、その列は更新されたとは見なされません。

拡張標識変数とエラー検査の据え置き: 拡張標識変数が使用可能な場合、非更新可能列の更新を認知するためにステートメント作成中に行われるはずになっている妥当性検査は、そのステートメントが実行されるまで据え置かれます。

変更の始まり
システム期間テンポラル表に関する考慮事項: システム期間テンポラル表の行を更新すると、 データベース・マネージャーによって、行開始列およびトランザクション開始 ID 列の値が以下のように更新されます。
  • 行開始列に割り当てられる値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 行開始列の値は、トランザクション全体にわたり固有になるようにデータベース・マネージャーによって生成されます。 関連した履歴表に挿入される行の終了タイム・スタンプ値が開始タイム・スタンプ値より大きくなるように、タイム・スタンプ値が調整される可能性があります。これは、競合するトランザクションがシステム期間テンポラル表の同じ行を更新しているときに行われる場合があります。 このタイム・スタンプ値の調整を行うには、SYSTIME_PERIOD_ADJ QAQQINI オプションを *ADJUST に設定する必要があります。 単一の SQL トランザクション内で複数の行が更新され、調整が必要ではない場合、行開始列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
  • トランザクション開始 ID 列には、トランザクションごとに固有のタイム・スタンプ値、または NULL 値が割り当てられます。トランザクション開始 ID 列が NULL 可能で、値を調整する必要がない行開始列が表にある場合には、その列に NULL 値が割り当てられます。 それ以外の場合、この値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 単一の SQL トランザクション内で複数の行が更新される場合、トランザクション開始 ID 列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。

UPDATE ステートメントに、履歴行を参照する (明示的に履歴表の名前を参照するか、FROM 節の期間指定を使用することにより暗黙的に参照する) 相関副照会が含まれる検索条件がある場合、履歴行として (履歴表がある場合にはそこに) 挿入される更新行の古いバージョンは、そのステートメントにおいて以後処理される行の更新操作で可視になる可能性があります。

CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターが NULL 以外の値に設定され、SYSTIME オプションの値が YES の場合は、UPDATE ステートメントの基礎ターゲット (直接または間接) を、システム期間テンポラル表にすることはできません。

CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターが NULL 以外の値に設定され、SYSTIME オプションの値が YES の場合は、NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出しを含む WHERE 文節がビュー定義にある場合、WITH CHECK OPTION を指定して定義されたビューを、UPDATE ステートメントのターゲットにすることはできません。

変更の終わり
変更の始まり

履歴表に関する考慮事項: システム期間テンポラル表の 1 つの行が更新されるとき、その行の履歴コピーが対応する履歴表に挿入され、履歴行の終了タイム・スタンプが、データ変更操作の時刻に対応するシステム判別値の形式でキャプチャーされます。 データベース・マネージャーが割り当てるこの値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 終了列の値は、トランザクション全体の履歴表で固有になるようにデータベース・マネージャーによって生成されます。 履歴表に挿入される行の終了タイム・スタンプ値が開始タイム・スタンプ値より大きくなるように、タイム・スタンプ値が調整される可能性があります。これは、競合するトランザクションがシステム期間テンポラル表の同じ行を更新しているときに行われる場合があります。このタイム・スタンプ値の調整を行うには、SYSTIME_PERIOD_ADJ QAQQINI オプションを *ADJUST に設定する必要があります。 こうしないと、エラーが戻されます。

更新操作では、この調整は、システム期間テンポラル表に関連付けられた履歴表の行終了列に対応する終了列の値にのみ影響があります。 この表への以降の参照ではこれらの調整を考慮に入れ、システム期間テンポラル表に関連付けられた期間の行開始列および行終了列に対応する列の値の中でトランザクション開始時刻が検索されるかどうかについて確認してください。

変更の終わり

更新操作エラー: 更新値がいずれかの制約に違反した場合、 またはその他のエラーが UPDATE ステートメントの実行中に発生し、しかも COMMIT(*NONE) が指定されていた場合は、 そのステートメントの実行中に行われた変更はすべて撤回されます。 ただし、エラーが発生する前に、その作業単位の中で行われていたその他の変更は撤回されません。 COMMIT(*NONE) が指定されていれば、変更が撤回されることはありません。

エラーの発生によって、カーソルの状態が予期できないものになることがあります。

更新された行数: UPDATE ステートメントの 実行が完了した後、更新された行数は SQL 診断領域の ROW_COUNT ステートメント 情報項目 (および SQLCA の SQLERRD(3)) に戻されます。 SQLCA についての説明は、SQLCA (SQL 連絡域)を参照してください。

ROW_COUNT についての説明は、GET DIAGNOSTICSを参照してください。SQLCA についての説明は、SQLCA (SQL 連絡域)を参照してください。

ロッキング: 適切なロックがまだ存在していなければ、 UPDATE ステートメントが正しく実行されることにより、1 つ以上の排他ロックが 獲得されます。これらのロックがコミットまたはロールバックの操作によって解放されるまで、 更新された行へのアクセスは、以下に限定されます。

  • その更新を行ったアプリケーション・プロセス
  • 読み取り専用操作を介して、COMMIT(*NONE) または COMMIT(*CHG) を使用する別のアプリケーション・プロセス

ロックは、他のアプリケーション・プロセスがその表の操作を行うのを防止します。 ロックについての詳細は、COMMIT、ROLLBACK、および LOCK TABLE ステートメント、 および 分離レベルの分離レベルの項を参照してください。 また、「データベース・プログラミング」トピック集も参照してください。

COMMIT(*RR)、COMMIT(*ALL)、COMMIT(*CS)、または COMMIT(*CHG) が指定さ れている場合は、1 つの UPDATE ステートメントで、最高 500 000 000 行を 更新または変更することができます。 変更される行の数には、トリガーの結果として同じコミットメント定義のもとで挿入、更新、または削除される行が含まれます。

REXX: 変数は、REXX プロシージャー内の UPDATE ステートメントでは使用できません。UPDATE を使用する場合は、必ず、パラメーター・マーカーを使用する PREPARE および EXECUTE の対象として使用してください。

データ・リンク: DATALINK 列の URL 値を更新した場合、それは古い DATALINK 値を削除 して新しい値を挿入するのと同じ結果になります。 まず、古い値がいずれかのファイルにリンクしていた場合は、その ファイルへのリンクが解除されます。 次に、その DATALINK 値のリンケージ属性が空であれば、指定した ファイルがその列にリンクされます。

DATALINK 列のコメント値は、URL パスとして (例えば DLVALUE スカラー 関数のデータ位置引数として) 空のストリングを指定するか、または新し い値に古い値と同じ値を指定することにより、ファイルに再リンクせずに 更新することができます。 DATALINK 列を NULL 値で更新した場合は、既存の DATALINK 値を削除した 場合と同じ結果になります。

既存の値または新しい値のいずれかのファイル・サーバーがデータベース・ サーバーに登録されていない場合は、DATALINK 値を更新しようとしたときに エラーが起きることがあります。

代替構文: 以下のキーワードは、旧リリースとの互換性を維持するためにサポートされている同義語です。 これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。

  • キーワード NONE を NC の同義語として使用することができます。
  • キーワード CHG を UR の同義語として使用することができます。
  • キーワード ALL を RS の同義語として使用することができます。

例 1: EMPLOYEE 表において、従業員番号 (EMPNO) ‘000290’ のジョブ (JOB) を ‘LABORER’ に変更します。

  UPDATE EMPLOYEE
    SET JOB = 'LABORER'
    WHERE EMPNO = '000290'

例 2: PROJECT 表において、部門 (DEPTNO) ‘D21’ が担当しているすべてのプロジェクトについて、プロジェクトのスタッフ・レベル (PRSTAFF) を 1.5 増やします。

  UPDATE PROJECT
    SET PRSTAFF = PRSTAFF + 1.5
    WHERE DEPTNO = 'D21'

例 3: 部門 (WORKDEPT) ‘E21’ の管理者以外の全従業員が一時的に配置替えになったとします。これを示すために、表 EMPLOYEE の対象従業員のジョブ (JOB) を NULL に、給与 (SALARY、BONUS、 COMM) の値をゼロに変更します。

  UPDATE EMPLOYEE
    SET JOB=NULL, SALARY=0, BONUS=0, COMM=0
    WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'

例 4: Java プログラムで、接続コンテキスト 'ctx' 上の表 EMPLOYEE にある行を表示した上で、要求があれば、特定の従業員のジョブ (JOB) を入力された新しいジョブ (NEWJOB) に変更します。

  #sql iterator empIterator implements sqlj.runtime.ForUpdate
       with( updateColumns='JOB' )
       ( … );
  empIterator C1;

  #sql [ctx] C1 = { SELECT * FROM EMPLOYEE };

  #sql { FETCH :C1 INTO … };
  while ( !C1.endFetch() )  {
     System.out.println( … );
                 …
     if ( condition for updating row ) {
         #sql [ctx] { UPDATE EMPLOYEE
                        SET JOB = :NEWJOB
                        WHERE CURRENT OF :C1 };
     }

     #sql { FETCH :C1 INTO … };
  }
  C1.close();