UPDATE ステートメント
UPDATE ステートメントは、表またはビューの行に指定された列の値を更新します。 ビューの行を更新すると、このビューに対して INSTEAD OF UPDATE トリガーが定義されていない場合は、その基本表の行が更新されます。 そのようなトリガーが定義されている場合、代わりにトリガーが活動化されます。
表またはビューは、現行サーバー、または現行サーバーが接続を確立できる任意の Db2 サブシステムに存在することができます。
このステートメントには、以下の 2 つの形式があります。
- 検索 UPDATE 形式は、検索条件により任意に決定 される 1 つ以上の行を更新します。
- 位置付け UPDATE は、現行カーソル位置に対応する 1 つ以上の行を更新するように指定します。
呼びかけ UPDATE
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 位置付け UPDATE は、 アプリケーション・プログラムに組み込むことができます。 いずれの形式も 動的に準備できる実行可能ステートメントです。
承認 UPDATE
必要な権限は、このステートメントで指定するオブジェクトが、ユーザー定義の表、 更新が許可されているカタログ表、あるいはビューのどれであるのか、 また SQL 標準規則が有効であるかどうかによって異なります。
ユーザー定義の表を指定する場合: 特権セットには、 少なくとも次のいずれかが含まれていなければいけません。
- DATAACCESS 権限
- 表に対する UPDATE 特権
- 更新される各列に対する UPDATE 特権
- 表の所有権
- 表を含むデータベースに対する DBADM 権限
- SYSADM 権限
データベースを暗黙的に作成する場合、データベース特権が暗黙的 データベースまたは DSNDB04 上になければなりません。
カタログ表を指定する場合: 特権セットには、 少なくとも次のいずれかが含まれていなければいけません。
- ACCESSCTRL 権限
- DATAACCESS 権限
- 更新される各列に対する UPDATE 特権
- カタログ・データベースに対する DBADM 権限
インストール SYSOPR 権限
- SYSCTRL 権限
- SYSADM 権限
- SYSADM 権限
- システム DBADM 権限
ビューを指定する場合: 特権セットには、 少なくとも次のいずれかが含まれていなければいけません。
- DATAACCESS 権限
- SYSADM 権限
- ビューに対する UPDATE 特権
- 更新される各列に対する UPDATE 特権
- 表またはビューに対する SELECT 特権
- 表またはビューの所有権
- 表を含むデータベースに対する DBADM 権限 (ターゲットが表であり、かつカタログ表ではない場合)
- DATAACCESS
- SYSADM 権限
- BUSINESS_TIME 期間の列に対する UPDATE 特権
- 表に対する UPDATE 特権
- 表またはビューの所有権
- 表を含むデータベースに対する DBADM 権限 (ターゲットが表であり、かつカタログ表ではない場合)
- DATAACCESS
- SYSADM 権限
検索されたUPDATEの検索条件にサブクエリが含まれている場合、または代入節に スカラーフルセレクトまたは行フルセレクトが含まれている場合は、必要な権限の説明については、 クエリの権限を参照してください。
ビューの所有者は、表の所有者とは異なり、そのビューに対する UPDATE 権限 を持っていない場合があります (あるいは、UPDATE 権限を持っていても、他 の人にその権限を付与できない場合もあります)。 ビューの中には、それ自体が持っている性質のために、UPDATE の オブジェクトとして使用できないものもあります。 詳細は、 CREATE VIEW文の権限に関する説明を参照してください。
FL 509 ステートメントが改ざん防止監査ポリシーの対象である SYSIBM.SYSAUDITPOLICIES カタログ・テーブルの行を更新しようとする場合、追加の RACF® 認証が必要です。 ステートメントの実行中、 RACF の改ざん防止監査ポリシープロファイルへのアクセス権限は、プライマリ認証IDまたはプライマリ認証IDに関連付けられたグループのいずれかが有していなければなりません。 認証ルールに関する詳細情報は、 Db2 の監査ポリシー をご覧ください。
特権セット:
アプリケーション・プログラムにこの ステートメントを組み込む場合、特権セットは、プランまたはパッケージの所有者が持つ特権となります。 文が動的に準備される場合、権限セットは有効なDYNAMICRULESの動作( run、bind、define、またはinvoke)によって決定されます。 (これらの動作を決定するDYNAMICRULESバインドオプション値の一覧など、これらの動作の詳細については、 認可IDと動的SQLを参照してください)。
検索更新:
位置決め更新:
period-clause:
カラムを含む:
データ・タイプ:
built-in-type:
割り当て句:
- 1 式、DEFAULT、および NULL キーワードの数は、 列名の数と一致していなければなりません。 expression で、UNPACK-function-invocation を参照することはできません。
- 2 選択リストの列数は、 列名の数と一致していなければなりません。
- 3 UNPACK関数呼び出しから返される項目数は、列名の数と一致しなければなりません。
分離句:
説明の対象: UPDATE
- table-name または view-name
- UPDATE ステートメントのオブジェクトを指定します。 名前は、暗黙的または明示的に指定された場所名によって識別される Db2 サブシステムに存在するテーブルまたはビューを特定する必要があります。 以下の表を指す名前であってはなりません。
- 補助表
- 作成済みの一時表または作成済みの一時表のビュー
- 更新可能な列を持たないカタログ表、または更新可能な列を持たないカタログ表のビュー。
ディレクトリー表
- 更新操作に対して INSTEAD OF トリガーが定義されていない読み取り専用ビュー (読み取り専用ビューの説明については、CREATE VIEW 文を参照してください。)
- システム管理のマテリアライズ照会表
- XML 列用に暗黙的に作成される表。
- アーカイブ対応表 (以下の条件のいずれかが該当する場合)
- SYSIBMADM.MOVE_TO_ARCHIVE グローバル変数が Y に設定されている。
- SYSIBMADM.GET_ARCHIVE グローバル変数が Y に、ARCHIVESENSITIVE バインド・オプションが YES に設定されていて、操作が位置指定 UPDATE である。
IMS または CICS® アプリケーションでは、識別されたテーブルまたはビューを含む Db2 サブシステムは、2相コミットをサポートするリモートサーバーでなければなりません。
カタログ表またはカタログ表のビューは、SET 文節で指定する すべての列が更新可能な列であれば、指定することができます。 カタログテーブルのカラムが更新可能である場合、 Db2 カタログテーブルの説明では、そのカラムが更新可能であることを示しています。 オブジェクト・テーブルが SYSIBM.SYSSTRINGS の場合、IBMREQD以外の任意の列を更新できますが、更新対象として選択される行は、ユーザーが提供する行(IBMREQD列の値はN)でなければならず、特定の値のみを指定できます。 SYSIBM.SYSSTRINGS のエントリが文字変換とどのように連携するかで説明されているように。
- 期間条項
- 期間節が更新操作のターゲットに適用されることを指定します。 同じ期間名を複数回指定することはできません。 更新操作の対象がビューの場合:
- ビュー定義の外部全選択の FROM 節には、 アプリケーション期間テンポラル表への直接または間接的な参照を含める必要があります。
- ビュー定義の外部全選択の結果表に、BUSINESS_TIME 期間の開始列および終了列を明示的または暗黙的に含める必要があります。
- ビューに INSTEAD OF トリガーが定義されていてはなりません。
- FOR PORTION OF BUSINESS_TIME
- period 文節に指定されている行の BUSINESS_TIME 期間部分の行値にのみ更新が適用されることを指定します。 BUSINESS_TIME は、表に対して定義されている期間でなければなりません。
BUSTIMESENSITIVE バインド・オプションが YES に設定されている際に、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターの値が NULL でない場合には、FOR PORTION OF BUSINESS_TIME を指定してはなりません。
- FROM value1 TO value2
- value1 から value2 までの期間の行に更新が適用されることを指定します。 value1 が value2 以上である場合、または value1 か value2 が NULL 値である場合、行は更新されません。
この文節は、inclusive-inclusive 期間には指定してはなりません。
指定された期間条件について、 FROM value1 TO value2、対象の更新の行で period-name で指定された期間:
- 開始列の値が value1 より小さく、終了列の値が value1 より大きい場合には、指定期間の開始点をオーバーラップしています。
- 終了列の値が value2 以上で、開始列の値が value2 より小さい場合には、指定期間の終了点をオーバーラップしています。
- 開始列の値が value1 以上で、終了列の値が value2 以下の場合には、指定期間内に完全に含まれています。
- period-name の両方列が value1 より小さいか、value2 以上の場合には、この期間に含まれません。
- 指定期間の開始または指定期間の終了のいずれか一方にのみ行がオーバーラップする場合には、指定期間に一部が含まれます。
- 行の期間が指定期間の開始および終了の両方とオーバーラップする場合には、指定期間と完全にオーバーラップします。
行の期間 period-name が指定された期間に含まれない場合、行は更新されません。 それ以外の場合、更新は、PORTION OF の指定、および period-name の列の値が指定された期間とどのようにオーバーラップしているか (以下を参照) に基づいて適用されます。
- 行の期間 period-name が指定された期間に完全に含まれる場合、行は更新され、period-name の開始列と終了列の値は変更されません。
- 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の開始とオーバーラップする場合:
- 行が更新されます。 更新行では、開始列の値は value1 に設定され、終了列の値は終了列の元の値です。
- 追加行の元の値を使用して行が挿入されます。ただし、終了列は value1 に設定され、他の生成列では新しい値が使用されます。
- 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の終了とオーバーラップする場合:
- 行が更新されます。 更新行では、開始列の値は開始列の元の値で、終了列は value2 に設定されます。
- 追加行の元の値を使用して行が挿入されます。ただし、開始列は value2 に設定され、他の生成列では新しい値が使用されます。
- 行の期間 period-name が指定された期間と完全にオーバーラップする場合:
- 行が更新されます。 更新行では、開始列の値は value1 に設定され、終了列の値は value2 に設定されます。
- 行の元の値を使用して追加の行が挿入されます。ただし、終了列は value1に設定され、DATA CHANGE OPERATION として定義された列は 'I' に設定され、他の生成列では新しい値が使用されます。
- 行の元の値を使用して行が挿入されます。ただし、開始列は value2 に設定され、DATA CHANGE OPERATION として定義された列は 'I' に設定され、他の生成列では新しい値が使用されます。
更新される行に対して既存の更新トリガーがアクティブになり、暗黙的に挿入される行に対して既存の挿入トリガーがアクティブになります。
BETWEEN value1 AND value2
FL 500 更新操作が value1 から value2 までの指定された期間の行に適用されることを指定します。 value1 が value2 より大きいか、value1 または value2 が NULL 値である場合、行は更新されません。 この文節は、inclusive-exclusive 期間には指定してはなりません。BETWEEN value1 AND value2 で指定される期間文節の場合、更新操作のターゲットの行にある期間 period-name は、以下のようになります。
- 開始列の値が value1 より小さく、終了列の値が value1 より大きい場合には、指定期間の開始点をオーバーラップしています。
- 終了列の値が value2 以上で、開始列の値が value2 より小さい場合には、指定期間の終了点をオーバーラップしています。
- 行の period-name の開始列の値が value1 以上で、行の対応する終了列の値が value2 以下の場合には、指定期間内に完全に含まれています。
- 指定期間の開始または指定期間の終了のいずれか一方にのみ行がオーバーラップする場合には、指定期間に一部が含まれます。
- 行の期間が指定期間の開始および指定期間の終了とオーバーラップする場合には、指定期間と完全にオーバーラップします。
- period-name の両方の列が value1 より小さいか、value2 より大きい場合には、この期間に含まれません。
行の期間 period-name が指定された期間に含まれない場合、行は更新されません。 そうでない場合、更新操作は以下の項目に基づいています。
- PORTION OF 文節の指定。
- period-name の列の値が指定期間とどのようにオーバーラップしているか。
- spu (最小期間単位)。次のように期間の列のデータ・タイプによって異なります。
- DATE 列を含む期間の場合、spu は 1 日です。
- TIMESTAMP(6) 列を含む期間の場合、spu は 1 マイクロ秒です。
上記の項目に基づき、更新操作は次のように適用されます。
- 行の期間 period-name が指定された期間に完全に含まれる場合、行は更新され、period-name の開始列と終了列の値は変更されません。
- 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の開始とオーバーラップする場合:
- 行が更新されます。 更新行では、開始列の値は value1 に設定され、終了列の値は終了列の元の値です。
- 行の元の値を使用して行が挿入されます。ただし、終了列は value1 - spu に設定され、他の生成列では新しい値が使用されます。
- 行の期間 period-name が指定された期間に部分的に含まれ、指定された期間の終了とオーバーラップする場合:
- 行が更新されます。 更新行では、開始列の値は開始列の元の値で、終了列は value2 に設定されます。
- 行の元の値を使用して行が挿入されます。ただし、開始列は value2 + spu に設定され、他の生成列では新しい値が使用されます。
- 行の期間 period-name が指定された期間と完全にオーバーラップする場合:
- 行が更新されます。 更新行では、開始列の値は value1 に設定され、終了列の値は value2 に設定されます。
- 行の元の値を使用して行が挿入されます。ただし、終了列は value1 - spu に設定され、DATA CHANGE OPERATION として定義された列は 'I' に設定され、他の生成列では新しい値が使用されます。
- 行の元の値を使用して行が挿入されます。ただし、開始列は value2 + spu に設定され、DATA CHANGE OPERATION として定義された列は 'I' に設定され、他の生成列では新しい値が使用されます。

- value1, value2
- 組み込みデータ・タイプの値を戻す式を指定します。 各式の結果は、指定される期間の列のデータ・タイプと比較可能である必要があります。 代入と比較で説明されている比較ルールを参照してください。 各式には、以下のサポートされているオペランドを含めることができます。
- 定数
- 特殊レジスター
- 変数
- 配列エレメント指定
- 引数がサポートされるオペランドである組み込みスカラー関数
- CAST 指定 (キャスト・オペランドが、サポートされるオペランドであること)
- 算術演算子およびオペランドを使用する式
いずれの式も、期間の列の精度を超えるタイム・スタンプ精度を含んでいてはなりません。
期間の開始列と終了列が TIMESTAMP WITHOUT TIME ZONE として定義されている場合、各式はタイム・ゾーン付きのタイム・スタンプの値を戻してはなりません。
ビューの period 文節に、非型付きパラメーター・マーカーを含めてはなりません。
- 相関名
- 表またはビューを示すために、search-condition ま たは assignment-clause 内で使うことができます。 ( 相関名の説明については、「相関名」 を参照してください。)
- インクルードカラム
- UPDATE ステートメントが副選択、SELECT ステートメント、あるいは SELECT INTO ステートメントで使用されている外部全選択の FROM 文節でネストされている場合に、その UPDATE ステートメントの結果表の中に table-name や view-name の列と一緒に組み込まれる列セットを指定します。 組み込み列は、table-name または view-name で識別される列のリストの最後に追加されます。 include-column で指定される列に値がなにも割り当てられないと、その列には NULL 値が戻されます。
- INCLUDE
- UPDATE ステートメントの結果表に組み込まれる列のリストを指定します。 組み込み列は 、UPDATE ステートメントが SELECT ステートメントや SELECT INTO ステートメントの FROM 文節でネストされる場合にのみ有効です。
- 列名
- UPDATE ステートメントの結果表の列の名前を指定します。この名前は、table-name または view-name に指定される表やビュー内の他の組み込み列の名前と同じでなく、また、その表やビューにある列の名前とも同じではありません。
- データ・タイプ
- 組み込み列のデータ・タイプを指定します。 組み込み列は NULL 可能です。
- 一体型
- 組み込みデータ・タイプを指定します。 各組み込み型の説明についてはCREATE TABLE文を参照してください。
CCSID 1208 文節および CCSID 1200 文節を、INCLUDE 列に指定することはできません。
- ディストインクトタイプ
- 特殊タイプを指定します。 この列に対するどの長さ、精度、または位取りの各属性も、CREATE TYPE ステートメントを使用して指定された特殊タイプのソース・タイプの長さ、精度、または位取りの属性です。
- SET
- この後に、列名への値の割り当てを指定します。
- 代入節
- row-fullselect を指定する場合、row-fullselect の結果の列数が、指定された column-names の数と一致していなければなりません。 row-fullselect が無指定の場合、式の数、および NULL と DEFAULT キーワード数は 、指定された column-names の数と一致していなければなりません。
- column-name
- 更新する列を指定します。 列名 は、指定された表またはビューの列を識別する必要があります。 拡張インジケーターが有効になっていない場合、その列は更新可能な列でなければなりません。 この列は、生成される列あるいはスカラー関数、定数、または式から導き出されるビューの列であって
はなりません。 column-name は INCLUDE 列を示すこともできますが、この場合、列を修飾しないでください。 同じ列名を複数回指定することはできません。
UPDATE ステートメントに period-clause が含まれている場合、BUSINESS_TIME 期間の一部として定義されている列を指定してはなりません。
組み込み列への割り当ては、UPDATE ステートメントが SELECT ステートメントや SELECT INTO ステートメントの FROM 文節でネストされる場合にのみ処理されます。 INCLUDE 列以外の column-name を指定する割り当て文節が、少なくとも 1 つなければなりません。 明示的な SET 文節を使用して設定しない組み込み列には、NULL 値が戻されます。
位置付け UPDATE の場合、使用できる列名は、さらにある特定のリスト内の列名に限定されます。 このリストは、関連するカーソルの SELECT ステートメントの FOR UPDATE 文節に指定されているものです。 列の更新位置で説明されている条件を使用することで、この節を省略することができます。
ビューの列の更新は、それが導き出されたのと同じ列からそのビューの別の列が導き出されていても可能ですが、同一の UPDATE ステートメントでこの 2 つの列を更新することはできません。
- 式
- 列の新しい値を指定します。 式は 、Expressionsで説明されているタイプの式です。 集約関数を含めてはなりません。
式の中の 列名 は、表またはビューの列を識別するものでなければなりません。 更新される各行ごとに、式の中の列の値は、行が更新される前に その行に入っていた列の値となります。
式が単一のホスト変数の場合、ホスト変数には拡張指標値を持つ指標を含めることができる。 拡張標識が使用可能で、代入節の式が単一のホスト変数ではない場合、DEFAULT および UNASSIGNED の拡張標識値を使用してはなりません。
次のいずれかが当てはまるときに、CAST 指定を使用できます。- ターゲット列が NULL 可能として定義されている。
- ターゲット列が NULL 以外のデフォルトを指定して NOT NULL として定義され、CAST 指定のソースが単一のホスト変数で、ホスト変数のデータ属性 (データ・タイプ、長さ、精度、および位取り) がキャスト指定の結果と同じ。
- DEFAULT
- 対応する列が表の中でどのように定義されているかに応じて、デフォルト値が使用されることを指定します。
ROWID列にはDEFAULTを指定してはならない。
代入される値は、カラムの定義方法によって異なる。
列が生成された式の場合、列値は式の結果に基づいて Db2 サブシステムによって生成されます。
列が ID 列、行変更タイム・スタンプ列、行開始列、行終了列、またはトランザクション開始 ID 列の場合は、 Db2 サブシステムが新しい値を生成します。
- 列が WITH DEFAULT その値は、その列に対して定義されているデフォルト値に設定されます。
- カラムが節を指定せずに定義されている場合、 WITH DEFAULT 節、 GENERATED 節、または NOT NULL 値はNULLとなります。
- 列が列リストで指定されている場合、 INCLUDE 列の値はnullに設定されます。
GENERATED ALWAYS として定義された列に関しては、
DEFAULT を指定する必要があります。 GENERATED BY DEFAULT として定義された列に関しては、
有効な値を指定することができます。
列が NOT NULL 節を使用し、 GENERATED 節が使用されていない場合、または WITH DEFAULT その節が使用されていない場合、 DEFAULT その列にキーワードを指定することはできません。
- NULL
- 列の新しい値として NULL 値を指定します。 指定する NULL NULL値を許容するカラムのみを指定します。
- ローフルセレクト
- 単一行を返す全選択を指定します。 列の値はそれぞれ該当
する column-names に割り当てられます。 全選択が行を返さなければ各列に NULL 値が割り当てられ、更新される列が NULL 可能でない場合はエラーが発生します。 結果に複数の行がある場合も、エラーが発生します。
位置付け UPDATE の場合は、UPDATE ステートメントのオブジェクトである表またはビューが 全選択で使用されているときに、全選択にある表またはビューのインスタンスからの列を、 column-name、つまり更新される列と同じにすることはできません。
更新される列を全選択が参照すると、全選択の中のそのような列の値は、その行が更新 される前にその行に入っていた列の値になります。
- アンパック関数呼び出し
- UNPACK 組み込み関数の呼び出しを指定します。 UNPACK 関数呼び出しによって戻されるフィールドの数は、column-names の数と同じでなければなりません。
- WHERE
- 更新する行を指定します。 この文節は省略しても構いません。また、指定する場合は、検索条件
またはカーソルの指定ができます。 この文節を省略すると、表またはビューのすべての行が更新されます。
- 検索条件
- SQLの言語要素で記述された任意の検索条件を指定します。 検索条件の中の column-name は、
副照会に含まれている列名を除いて、それぞれ表またはビューの列を示すものでなければなりません。
search-condition は表またはビューの各行に適用され 、search-condition の結果が真となった行が更新されます。 ユニーク・キーまたは主キーが親キーの場合、 オペレーションの最後に、制約の検査が効果的に行われます。
検索条件に副照会が含まれる場合、その副照会は、 検索条件が 1 つの行に適用されるたびに実行され、 その結果は検索条件の適用に使用されるものと見なされます。 実際に、相関参照を持たない副照会が実行されるのは 1 回だけ なのに対し、相関参照を持つ副照会は、1 行ごとに 1 回ずつの 実行が必要となります。
- WHERE CURRENT OF カーソル名
- 更新操作で使用するカーソルを指定します。 cursor-nameは、 DECLARE CURSOR文の説明で説明されているように、宣言されたカーソルを識別する必要があります。 UPDATE ステートメントをプログラムに組み込む場合、DECLARE CURSOR ステートメントには、ステートメント名 ではなく SELECT ステートメント を指定する必要があります。
UPDATE ステートメントのオブジェクトは、カーソルの SELECT ステートメントの FROM 文節でも指定する必要があります。 更新される列は、その SELECT ステートメントの FOR UPDATE 文節に指定することができます。ただし、指定は必須ではありません。 列が指定されていない場合、更新可能な列は、全選択の最初の FROM 文節に 指定されている表またはビューの更新可能なすべての列を含みます。
カーソルの 結果表は読み取り専用であってはなりません。 読み取り専用結果テーブルの説明については、「読み取り専用カーソル」 を参照してください。 UPDATE ステートメントのオブジェクトは、カーソルの SELECT ステートメントの WHERE 文節に指定されている副照会のオブジェクトとして指定してはいけません。
UPDATE ステートメントを実行するときには、カーソルがオープンしていて、結果表の行または行セットに置かれている必要があります。
- カーソルが単一行に置かれている場合は、その 1 行が更新されます。
- カーソルが行セットに置かれている場合は、現在行セットの行に対応する行がすべて更新されます。
ビューが更新可能ビューであっても、そこに INSTEAD OF UPDATE トリガーが定義されているビューを参照するカーソルに対して、位置付け UPDATE を指定することはできません。
- FOR ROW n OF ROWSET
- 現在行セットのどの行を更新するか指定します。 行セットの対応する行が更新され、カーソルは現在行セットに置かれたままになります。
ホスト変数 または 整数定数 は、整数値 Kに割り当てられます。 ホスト変数が指定される場合、それは小数点以下ゼロ桁の正確な数値型でなければならず、インジケータ変数を含んではならず、 kは 1~32767の範囲でなければなりません。
カーソルは行セットに置かれている必要があり、指定値はカーソルによって最後に取り出された行セットに有効な値であることが必要です。 指定した行を更新することができない場合は、エラーが戻されます。 指定した行が最新に要求された行セットの境界内にあっても、現在行セットに含まれる行数が、行セットの設定時に暗黙的または明示的に要求された行数よりも少ない可能性があります。
この文節を指定しない場合、影響を受ける行はカーソル位置によって決まります。 カーソルが単一行に置かれている場合は、その 1 行が更新されます。 最新の FETCH ステートメントが複数のデータ行を戻した (ただし、行セットとしてではなく) 場合、この位置は最後に戻されたデータ行になります。 カーソルが行セットに置かれている場合は、現在行セットに対応する行がすべて更新されます。 カーソル位置は未変更のままです。
別のアプリケーション・プロセスが、SELECT ステートメントの基本表の行を更新したために、カーソルの指定している行に対応する行が基本表になくなる可能性があります。 このような行を更新しようとすると、エラーが発生します。
- 孤立化条項
- ステートメントによって更新する行を見つけるときに
使用する分離レベルを指定します。
- WITH
- 分離レベルを指定します。次のいずれかを指定できます。
- RR
- 反復可能読み取り
- RS
- 読み取り固定
- CS
- カーソル固定
ステートメントのデフォルト分離レベルは、ステートメントがバインドされているパッケージまたは プランの分離レベルです。なお、パッケージの分離がプランの分離よりも優先します。 パッケージの分離を指定しない場合、プランの分離がデフォルトになります。
- SKIP LOCKED DATA
- 他トランザクションが、行に対して非互換ロックを保持している場合、その行がスキップされることを示します。 これらの行は、このステートメントで指定されたどのアクセス対象の表に属していても構いません。 SKIP LOCKED
DATA CSまたはRSの分離が有効な場合にのみ使用でき、行レベルまたはページレベルのロックのみに適用されます。
SKIP LOCKED DATA 検索されたUPDATE文(またはMERGE文の検索された更新操作)でのみ指定できます。 SKIP LOCKED DATA 繰り返し読み取り()または未コミット読み取り()が有効な分離レベルで指定された場合は無視されます。WITH RR)または未コミット読み取り(WITH UR。そのステートメントの既定の分離レベルは、そのステートメントがバインドされるパッケージまたはプランの分離レベルに依存し、パッケージ分離レベルがプラン分離レベルよりも優先されます。 パッケージの分離を指定しない場合、プランの分離がデフォルトになります。
- QUERYNO 整数
- EXPLAIN 出力とトレース・レコード内でこの SQL ステートメントに使用する番
号を指定します。 この番号は、この SQL ステートメントに関する情報が含まれる行のプラン表
の QUERYNO 列に使用されます。 この番号は、SYSIBM.SYSSTMT と SYSIBM.SYSPACKSTMT の
カタログ表の QUERYNO 列でも使用されます。
この文節を省略すると、その SQL ステートメントに関連付けられる番号は、プリコンパ イル時に割り当てられたステートメント番号となります。 したがって、アプリケーション・プログラムを変更してからプリコンパイルした場合、 ステートメント番号が変更される可能性があります。
この QUERYNO プログラム内のSQLステートメントに一意の番号を割り当てるためにこの句を使用すると便利です
- アクセス・パスを選択するための最適化ヒントの使用を単純化する
- SQL ステートメント・テキストとプラン表内の EXPLAIN 出力とを相関させる
最適化ヒントの有効化と使用方法の詳細については、「アクセスパスの選択に影響を与える 」を参照してください
計画表へのアクセス方法については、「EXPLAIN を使用した SQL パフォーマンスの調査 」を参照してください。
アップデートに関する注意事項
- 更新規則:
- 更新値は、以下の規則を満たさなければなりません。 以下の規則に従わない場合、または UPDATE ステートメントの実行中に
その他のエラーが発生した場合には、行は更新されず、カーソルの位置は変更されません。
- 割り当て。 更新値は、SQLの言語要素で説明されている割り当てルールを使用して、列に割り当てられます。
- 有効性。 更新は次の規則に従って行う必要があります。 規則に従わない場合、または UPDATE ステートメントの実行中にその他のエラーが発生した場合には、行は更新されません。
- 全選択: scalar-fullselect を含む行全選択と式は、複数の行を戻してはいけません。
- ユニーク制約とユニーク索引: 指定した表 (または指定したビューの基本表) にユニーク索引またはユニーク制約がある場合、表の中で更新される行はそれぞれ、これらの索引や制約による制限に準拠する必要があります。
一意性の検査はすべて、実際にはステートメントの最後に実行されます。 複数行更新の場合、この検査はすべての行が更新された後で行われます。
- チェック制約 :識別されたテーブル(または識別されたビューのベーステーブル)にチェック制約が存在する場合、テーブルで更新される各行について、各チェック制約が真または不明でなければなりません。
チェック制約はすべて、実際にはステートメントの最後に検証されます。 複数行更新の場合、この検査はすべての行が更新された後で行われます。
- ビューおよび WITH CHECK OPTION。 WITH CHECK OPTION を使って定義されたビューを使う場合、更新された
行はそのビューの定義に従っていなければなりません。 指定したビューが、WITH CHECK OPTION を定義に含む別のビューに
従属している場合、更新された行は、これらのビューの定義にも従わなければなりません。 この状況を規定するルールについては、 CREATE VIEWステートメントを参照してください。
WITH CHECK OPTION を使って定義されていないビューを使う場合、行を変更すると、 そのビューの定義に従わなくなってしまうこともあります。 そのような行は、ビューの基本表で更新され、そのビューには現れなくなります。
- フィールド・プロシージャーおよび検証プロシージャー。 更新される行は、指定した表 (または指定したビューの基本表) に関するフィールド・プロシージャーまたは検証プロシージャーによる制約に準拠する必要があります。
- 参照制約。 親行の親キーの値を変更してはなりません。 更新値によって非 NULL の外部キーが生成される場合、外部キーは関係がある親表の親キー値のいずれかと等しいことが必要です。
参照制約はすべて、実際にはステートメントの最後に検査されます。 複数行更新の場合、この検査はすべての行が更新された後で行われます。
- VARBINARY 列での索引。 指定した表が VARBINARY 列に索引を持つ場合、または VARBINARY データ・タイプに基づく特殊タイプの列に索引を持つ場合、その索引列では DESC 属性を指定できません。 指定した表で SQL データ変更操作を使用するには、索引をドロップするか、列のデータ・タイプを BINARY に変更して索引を再作成します。
- トリガー. UPDATE ステートメントによって、トリガーが活動状態にされる場合があります。 トリガーによって、他のステートメントが実行されたり、更新値に基づいてエラー条件が発生したりすることがあります。ビューに対するUPDATE文によってトリガが起動する場合、有効性、参照整合性、およびチェック制約は、トリガで実行されるデータ変更に対してチェックされ、トリガを起動させるビューやその基底テーブルに対してはチェックされません。
- 更新される行数:
- 通常、UPDATE ステートメントの実行を完了した後、SQLCA 内の SQLERRD(3) の値は更新される行数になります。 (SQLCAの完全な説明については、前述の文章に対する例外事項を含め、 SQL通信領域(SQLCA )を参照してください。)
- ユーザー定義関数またはストアード・プロシージャーのネスト:
- UPDATE ステートメントは、暗黙的または明示的にユーザー定義関数またはストアード・プロシージャーを参照できます。 これは、SQL ステートメントのネスト として知られています。 UPDATE 内にネストされるユーザー定義関数またはストアード・プロシージャーは、更新中の表にアクセスすることはできません。
- ロッキング:
- 適切なロックがまだ存在していなければ、更新操作が正しく実行されることにより、1 つ以上の排他ロックが獲得されます。 コミット操作またはロールバック操作によってロックが解除されない限り、
更新された行にアクセスできるのは、その挿入を実行したアプリケーション・プロセスだけです。 LOB が更新されないと、非コミット読み取りを指定して実行される
アプリケーション・プロセスは、更新された行にアクセスすることもできます。 ロックによって、他のアプリケーション・プロセスが、その表に対して操作を実行できないことにもなります。 ただ、非コミット読み取りを用いて実行されるアプリケ
ーション・プロセスは、ロックされているページおよび行にアクセスすることができます。
宣言済み一時表に対するロックは獲得されません。
- 日時レジスター使用時の時刻表記:
- Datetime 特殊レジスタで説明されているように、2つ以上の datetime レジスタが暗黙的または明示的に単一の SQL 文で指定されている場合、それらは同じ時点を表します。 このことは、 複数行が更新される場合にも当てはまります。
- SENSITIVE STATIC 両方向スクロール・カーソルによる位置付け UPDATE の規則:
- SENSITIVE STATIC 両方向スクロール・カーソルが宣言されている場合には、次の規則が適用されます。
- 削除ホールに対する更新の試行。 SENSITIVE STATIC 両方向スクロール・カーソルに対する位置付け UPDATE を使って、 削除ホールと定義されている行を更新しようとすると、エラーが発生します。
- 更新操作。 SENSITIVE STATIC 両方向スクロール・カーソルを使った位置付け UPDATE 操作は、
次のように実行されます。
- カーソルの基本表のターゲット行にある SELECT リスト項目が、結果表の対応する 行の値と比較されます (つまり、結果表は、引き続き基本表と一致していなければなりま せん)。 この 2 つの値が同一でな い場合、更新操作はリジェクトされ、エラーが発生します。 この操作は、ターゲット行 で FETCH SENSITIVE が成功した後に、再度試行される可能性があります。
- SELECT ステートメントの WHERE 文節が再評価されて、基本表の現行値が、引き続き検索基準を満たしているかどうかを判別します。 これらの値が変更されていないことを判別するために、SELECT リストの中の値が比較されます。 WHERE 文節の評価が真になり 、SELECT の値が変更されていないと、更新操作の続行が許可されます。 そうでない 場合は、更新操作はリジェクトされて、エラーが発生し、カーソルに 更新ホール が現れます。
- 更新ホールに対する更新。 更新ホールは永続的ではありません。 別のプロセス、または同一プロセス内での検索 UPDATE によって、もはや更新ホールではなくなるように更新ホール行を更新する ことも可能です。 位置付け UPDATE、および位置付け DELETE に対して FETCH SENSITIVE を 用いると、更新ホールが明らかになります。
- 結果表。 基本表が更新されると、行は再評価されて、一時結果表の中で更新されます。 この時点で、位置付け UPDATE は、行が検索条件を修飾しないようにデータを変更した可能性があります (その場合には、その後の FETCH 操作では、行は更新ホールとしてマークされます)。
更新されるカラムを参照する:
カーソルが後で更新される列を取得するためにFETCH文を使用する場合、列を選択する時にFOR UPDATE OFを指定します。 次に、その後の UPDATE または DELETE 文で WHERE CURRENT OF を指定します。 これらの条項により、 Db2 が更新中の列のインデックス経由のアクセスを選択することができなくなり、そうでないと Db2 が同じ行を複数回読み込む可能性がある。詳細は、「以前に取得したデータの更新 」を参照してください。

- マルチレベル・セキュリティーを使用する表の行の更新:
- マルチレベルセキュリティでテーブルの行を更新する際、 Db2 はユーザーのセキュリティラベル(一次認証ID)と行のセキュリティラベルを比較します。 更新は、次の規則に従って行われます。
- ユーザーのセキュリティー・ラベルと行のセキュリティー・ラベルが同等である場合は、その行は更新され、セキュリティー・ラベルの値は、ユーザーが write-down privilege (ライトダウン特権) を持っているかどうかに応じて以下のように決定されます。
- ユーザーが write-down privilege (ライトダウン特権) を持っているか、または write-down control (ライトダウン制御) が使用可能にされていない場合は、ユーザーは、その行のセキュリティー・ラベルを任意の有効なセキュリティー・ラベルに設定することができます。 セキュリティー・ラベルに指定する値は、CHAR(8) FOR SBCS DATA NOT NULL として定義された列に割り当て可能であることが必要です。
- ユーザーが write-down privilege (ライトダウン特権) を持っておらず、かつ write-down control (ライトダウン制御) が使用可能にされている場合は、行のセキュリティー・ラベルはユーザーのセキュリティー・ラベルの値に設定されます。
- ユーザーのセキュリティー・ラベルが行のセキュリティー・ラベルより上位になる場合は、UPDATE ステートメントの結果は、ユーザーが write-down privilege (ライトダウン特権) を持っているかどうかによって以下のように決定されます。
- ユーザーが write-down privilege (ライトダウン特権) を持っているか、または write-down control (ライトダウン制御) が使用可能にされていない場合は、行は更新され、ユーザーは、その行のセキュリティー・ラベルを任意の有効なセキュリティー・ラベルに設定することができます。
- ユーザーが write-down privilege (ライトダウン特権) を持っておらず、かつ write-down control (ライトダウン制御) が使用可能にされている場合は、行は更新されません。
- 行のセキュリティー・ラベルがユーザーのセキュリティー・ラベルより上位になる場合は、行は更新されません。
- ユーザーのセキュリティー・ラベルと行のセキュリティー・ラベルが同等である場合は、その行は更新され、セキュリティー・ラベルの値は、ユーザーが write-down privilege (ライトダウン特権) を持っているかどうかに応じて以下のように決定されます。
- 行または列のアクセス制御が実施されている表の行の更新:
- 行または列のアクセス制御が実施されている表に対して UPDATE ステートメントを実行した場合、行を更新できるかどうかは、有効になっている行の許可または列マスクに指定されている規則によって決まります。 通常、これらの規則は、プロセスの許可 ID またはロールに基づきます。 以下に、有効になっている行の許可または列マスクが UPDATE 時にどのように使用されるかについて説明します。
- 行の許可を使用して、更新される行のセットが識別されます。
1 つの表に対して、有効な行の許可が複数定義されている場合は、有効になっている各許可の検索条件に論理 OR 演算子を適用することにより、行アクセス制御検索条件が導出されます。 その行アクセス制御検索条件が表に適用されて、UPDATE ステートメントの許可 ID またはロールでアクセス可能な行が決定されます。 WHERE 節を UPDATE ステートメントに指定した場合は、アクセス可能な行に対してユーザーが指定した述部が適用されて、更新される行が決定されます。 WHERE 節がない場合は、アクセス可能な行が更新される行になります。
このステップでは列マスクは適用されません。
表に対して行アクセス制御が実施されていない場合、更新される行は WHERE 節によって決定されます。 WHERE 節によって決定されない場合は、表のすべての行が更新されます。
- 更新される行が存在する場合、それらの行を更新できるかどうかは、以下の規則によって決まります。
- 更新されるどの列についても、列の新しい値が、その値を導出する際に参照する列の有効になっている列マスクから影響を受けるものであってはなりません。
新しい行の値を導出するときに列を参照する場合に、 その列に有効になっている列マスクが存在すると、新しい値は、マスクされた状態の値を使用して導出されます。 オブジェクト表でも列アクセス制御がアクティブになっている場合、新しい値を導出するときに適用される列マスクは、その列マスクに定義されているアクセス制御規則の評価において、列が、定数でも式でもなくそれ自体に解決されるようにする必要があります。 列マスクによって列がそれ自体にマスクされないと、新しい値を更新に使用することはできず、実行時にエラーが戻されます。
- 行が更新可能な場合、表に BEFORE UPDATE トリガーが存在すれば、そのトリガーがアクティブ化されます。
トリガー・アクション中に、遷移変数内の更新用の新しい値が変更されることがあります。 最終的な値がトリガーから戻されると、その新しい値が更新に使用されます。
- 更新される行は、有効になっている行の許可に準拠していなければなりません。
更新される各行について、古い値が、UPDATE ステートメントに指定された新しい値に置き換えられます。 有効になっている行の許可に準拠する行とは、更新された場合に、導出される行アクセス制御検索条件を使用して取得可能な行のことです。
- 行が更新可能な場合、表に AFTER UPDATE トリガーが存在すれば、そのトリガーがアクティブ化されます。
- 更新されるどの列についても、列の新しい値が、その値を導出する際に参照する列の有効になっている列マスクから影響を受けるものであってはなりません。
上記の規則は、組み込み列には適用されません。 組み込み列は、UPDATE ステートメントのオブジェクト表の列ではないため、選択リストの規則に従います。
- 行の許可を使用して、更新される行のセットが識別されます。
拡張標識の使用法:
拡張標識が使用可能な場合には, 正の値および 0 (ゼロ) から -7 以外の標識値を指定してはなりません。 DEFAULT および UNASSIGNED 拡張標識値は、サポートされていないコンテキストでは使用できません。
拡張標識:
拡張標識値 UNASSIGNED を使用して標識値を指定すると、列がステートメントに指定されていない場合と同じ効果があります。 拡張インジケーター値 DEFAULT を割り当てると、デフォルト値が列に割り当てられ、デフォルト値で定義された列にのみ指定する必要があります。GENERATED ALWAYS として定義されている ID 列など、ターゲット列が更新可能でない場合は、UNASSIGNED の拡張標識値を割り当てる必要があります。
UPDATE ステートメントは、すべてのターゲット列に対して UNASSIGNED の拡張インジケーター値を指定してはなりません。

拡張標識および更新トリガー:
ターゲット列の標識値が UNASSIGNED である場合、その列は更新されたと見なされません。 その列は、ターゲット テーブルまたはビューで定義されている更新トリガのOF 列名リストで指定されていないものとして扱われます。
拡張標識および据え置きエラー検査:
拡張標識が有効になっている場合、更新不能列への挿入を認識するためにステートメントの準備中に通常行われる妥当性検査は、ステートメントが実行されるまで据え置かれます。
- 生成列に関する考慮事項:
- 生成列として定義された GENERATED ALWAYS DEFAULTキーワードまたはデフォルト値が割り当てられることを指定する拡張インジケータで指定された値でない限り、代入節の対象として指定すべきではありません。
- システム期間テンポラル表に関する考慮事項:
- システム期間テンポラル表の行が更新されると、 Db2 は、行開始列とトランザクション開始 ID 列の値を以下のように更新します。
row-begin 列には、その列のデータ・タイプの値が割り当てられます。 SYSIBM の値の場合。 更新時の TEMPORAL_LOGICAL_TRANSACTION_TIME 組み込みグローバル変数が NULL です。この値は、表の行開始列またはトランザクション開始 ID 列に値を割り当てる必要がある作業単位の最初のデータ変更ステートメントの実行中に、時刻機構の読み取りを使用して生成されます。または、表の削除された行がシステムの行です。 そうでない場合、挿入時に、行開始列に SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 組み込みグローバル変数の値が割り当てられます。
- トランザクション開始 ID 列には、作業単位ごとに固有のタイム・スタンプ値、または NULL 値が割り当てられます。 その列が NULL 可能である場合、NULL 値がトランザクション開始 ID 列に割り当てられます。 それ以外の場合、値は、表の行開始列またはトランザクション開始 ID 列への値の割り当てを必要とする作業単位での最初のデータ変更ステートメントの実行中に時刻機構を使用して生成されます。 これは、システム期間テンポラル表の行が削除されるときにも発生します。 単一 SQL 作業単位内で複数の行が更新される場合、トランザクション開始 ID 列の値は、すべての行について同じであり、別の作業単位でその列に対して生成される値からは固有です。
履歴行を参照する (履歴表の名前を明示的に参照、または FROM 節で期間指定を使用して暗黙的に参照) 相関副照会を含む検索条件が UPDATE ステートメントに含まれている場合、履歴行として (履歴表に) 挿入される更新行の古いバージョンが、行の更新操作で参照され、その後ステートメントで処理される可能性があります。
CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターに NULL 以外の値が設定されている場合は、UPDATE ステートメントの基礎ターゲットを、システム期間テンポラル表にすることはできません。 この制限は、システム期間テンポラル表への参照が直接か間接かにかかわらず適用されます。
- 履歴表に関する考慮事項:
- システム期間テンポラル表の行が更新されるときに、その行の履歴コピーが対応する履歴表に挿入され、履歴行の終了タイム・スタンプがデータ変更操作の時刻に対応するシステム決定値の形式で収集されます。 Db2 テーブルの行開始またはトランザクション開始 ID 列に値を割り当てる必要があるトランザクションで、最初のデータ変更ステートメントが実行される際に、時刻クロックを使用して値を生成します。 これは、システム期間テンポラル表の行が削除されるときにも発生します。
もし、SYSIBM. データ変更操作時の TEMPORAL_LOGICAL_TRANSACTION_TIME 組み込みグローバル変数がヌルです。この値は、システム表の行開始列またはトランザクション開始 ID 列に値を割り当てる必要がある作業単位の最初のデータ変更ステートメントの実行中に、時刻機構の読み取りを使用して生成されます。または表の行の行です。 そうでない場合は、データ変更操作時に SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 組み込みグローバル変数から値が代入される。
- アプリケーション期間テンポラル表に関する考慮事項:
- アプリケーション期間テンポラル表の FOR PORTION OF BUSINESS_TIME 節を含んだ UPDATE ステートメントは、指定された更新が有効な範囲を示す 2 つの時点を指定します。
FOR PORTION OF BUSINESS_TIMEが指定され、その行の期間値が、指定された期間から value1 から value2 から value1 と value2. (行の期間値は、BUSINESS_TIME の期間の開始列と終了列の値によって指定されます。) この場合、この行が更新され、変更されていない行の部分を表すために 1 行または 2 行が自動的に挿入されます。 表の更新操作の結果として自動的に挿入される行ごとに、アプリケーション期間テンポラル表の各生成列に新しい値が生成されます。 ユニーク・キー、主キー、参照制約の親キー、またはユニーク索引の一部として生成列が定義される場合は、自動挿入が制約または索引に違反する可能性があります。 この場合は、エラーが返されます。
アプリケーション期間表が UPDATE ステートメントのターゲットであり、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターに対して有効な値が NULL 値でない場合、 Db2 は、以下の追加の述部をステートメントに追加します。

- inclusive-exclusive 期間:
bt_begin <= CURRENT TEMPORAL BUSINESS_TIME AND bt_end > CURRENT TEMPORAL BUSINESS_TIME - inclusive-inclusive 期間:
bt_begin <= CURRENT TEMPORAL BUSINESS_TIME AND bt_end >= CURRENT TEMPORAL BUSINESS_TIME

前述のコードでは、bt_begin と bt_end が、UPDATE ステートメントのターゲット表の BUSINESS_TIME 期間の開始列と終了列です。
- inclusive-exclusive 期間:
- アーカイブ対応表:
- UPDATE ステートメントのターゲットとしてアーカイブ対応表を参照する場合、関連するアーカイブ表の行には影響はありません。
グローバル変数 SYSIBMADM.MOVE_TO_ARCHIVE の値が'Y'の場合、アーカイブ可能なテーブルをターゲットとして指定するUPDATE文はエラーを返します。
データ変更ステートメントで、システム期間テンポラル表またはアプリケーション期間テンポラル表も参照する場合、アーカイブ対応表を参照してはなりません。
- 同じ作業単位内の他の SQL ステートメント:
- 同じ作業単位内で、次のステートメントを UPDATE ステートメントの後で使用することはできません。
- 列のデータ・タイプを変更する ALTER TABLE ステートメント (ALTER COLUMN SET DATA TYPE)
- 可変長列を含む索引の埋め込み属性を変更する ALTER INDEX ステートメント (PADDED から NOT PADDED へ、またはその逆)
- アクセラレーターのみの表を作成する CREATE TABLE ステートメント
- 別のアクセラレーターからアクセラレーターのみの表を更新する INSERT、UPDATE、または DELETE ステートメント
- 表の AREO* 状況をリセットするための UPDATE の使用:
- 以下のすべての条件が該当する場合は、表の AREO* 状況が UPDATE ステートメントによってリセットされます。
- ステートメントが、検索 UPDATE ステートメントである。 SELECT ステートメント内の UPDATE ステートメントでは AREO* 状況はリセットされません。
- SET 節の式が scalar-fullselect でも row-fullselect でもない。
- 更新操作の対象がユニバーサル表スペースの表である。
- 表の行アクセス制御はアクティブ化されていない。
- SKIP LOCKED DATA 節は指定されていない。
- WHERE 節は指定されていない。
- リソースが使用不可という状態は発生しない。
リソースが使用不可という状態が発生してもエラーまたは警告の SQLCODE は返されません。 リソースが使用不可というコンソール・メッセージが表示されるだけです。
AREO* がリセットされたかどうかは DISPLAY DATABASE コマンドを使用して調べることができます。
UPDATE文の例
ある社員が昇進すると仮定します。 その異動を反映する NEWEMP 表の社員データのいくつかの項目を更新するには、以下の UPDATE ステートメントを使用します。
UPDATE NEWEMP SET JOB = 'MGR', DEPT = 'E21' WHERE EMPNO = '100125';DSN8C10.EMPの従業員番号000190の電話番号を3565に変更する。
UPDATE DSN8C10.EMP SET PHONENO='3565' WHERE EMPNO='000190';部門 D11 の各メンバーに 100 ドルの昇給を与えます。
UPDATE DSN8C10.EMP SET SALARY = SALARY + 100 WHERE WORKDEPT = 'D11';従業員 000250 が欠勤したままです。 従業員の給与の 値 (SALARY, BONUS, and COMMISSION) を NULL に設定します。
この他に、このステートメントは以下のように書くこともできます。UPDATE DSN8C10.EMP SET SALARY = NULL, BONUS = NULL, COMM = NULL WHERE EMPNO='000250';UPDATE DSN8C10.EMP SET (SALARY, BONUS, COMM) = (NULL, NULL, NULL) WHERE EMPNO='000250';PROJSIZEという名前の列がDSN8C10.EMP に追加されたと仮定します。 この列は、この従業員の所属する部署が担当するプロジェクトの数を記録します。 この部署 E21 の各従業員ごとに、この部署が担当するプロジェクトの 数を使って PROJSIZE を更新します。
UPDATE DSN8C10.EMP SET PROJSIZE = (SELECT COUNT(*) FROM DSN8C10.PROJ WHERE DEPTNO = 'E21') WHERE WORKDEPT = 'E21';- カーソル C1 が置かれている行が示す従業員の給与を 2 倍にします。
EXEC SQL UPDATE DSN8C10.EMP SET SALARY = 2 * SALARY WHERE CURRENT OF C1; 従業員表 EMP1 が以下のステートメントを使って作成されたと仮定します。
CREATE TABLE EMP1 (EMP_ROWID ROWID GENERATED ALWAYS, EMPNO CHAR(6), NAME CHAR(30), SALARY DECIMAL(9,2), PICTURE BLOB(250K), RESUME CLOB(32K));ホスト変数 HV_EMP_ROWID に、従業員番号「350000」の従業員についての ROWID 列の値が含まれているものとします。 その ROWID 値を使って従業員およびユーザー定義関数 UPDATE_RESUME を指定すると、その従業員の給与が 1000 ドル増えて、 その従業員のデータが更新されます。EXEC SQL UPDATE EMP1 SET SALARY = SALARY + 1000, RESUME = UPDATE_RESUME(:HV_RESUME) WHERE EMP_ROWID = :HV_EMP_ROWID;従業員表 X で、平均よりも給与が低い各従業員の給与を 10% 増加します。
EXEC SQL UPDATE EMP X SET SALARY = 1.10 * SALARY WHERE SALARY < (SELECT AVG(SALARY) FROM EMP Y WHERE X.JOBCODE = Y.JOBCODE);部門「E11」の中で、平均よりも給与が低い従業員の給与を平均給与にまで引き上げます。
EXEC SQL UPDATE EMP T1 SET SALARY = (SELECT AVG(T2.SALARY) FROM EMP T2) WHERE WORKDEPT = 'E11' AND SALARY < (SELECT AVG(T3.SALARY) FROM EMP T3);- 部門「E11」の従業員に、給与の 10% に相当するボーナスを支給します。
EXEC SQL DECLARE C1 CURSOR FOR SELECT BONUS FROM DSN8710.EMP WHERE WORKDEPT = 'E12' FOR UPDATE OF BONUS; EXEC SQL UPDATE DSN8710.EMP SET BONUS = ( SELECT .10 * SALARY FROM DSN8710.EMP Y WHERE EMPNO = Y.EMPNO ) WHERE CURRENT OF C1; - カーソル CS1 が、表 T1 の 10 行からなる行セットに置かれているとして、行セットにある 10 行をすべて更新します。
EXEC SQL UPDATE T1 SET C1 = 5 WHERE CURRENT OF CS1; - カーソル CS1 が、表 T1 の 10 行からなる行セットに置かれているとして、行セットの 4 行目を更新します。
short ind1, ind2; int n, updt_value; stmt = 'UPDATE T1 SET C1 = ? WHERE CURRENT OF CS1 FOR ROW ? OF ROWSET' ind1 = 0; ind2 = 0; n = 4; updt_value = 5; ... strcpy(my_sqlda.sqldaid,"SQLDA"); my_sqlda.sqln = 2; my_sqlda.sqld = 2; my_sqlda.sqlvar[0].sqltype = 497; my_sqlda.sqlvar[0].sqllen = 4; my_sqlda.sqlvar[0].sqldata = (int *) &updt_value; my_sqlda.sqlvar[0].sqlind = (short *) &ind1; my_sqlda.sqlvar[1].sqltype = 497; my_sqlda.sqlvar[1].sqllen = 4; my_sqlda.sqlvar[1].sqldata = (int *) &n; my_sqlda.sqlvar[1].sqlind = (short *) &ind2; EXEC SQL PREPARE S1 FROM :stmt; EXEC SQL EXECUTE S1 USING DESCRIPTOR :my_sqlda; 表 POLICY が存在し、それが単一の inclusive-exclusive 期間 BUSINESS_TIME を使用して定義されているとします。 表には、列 BK に値 'P138'、列 CLIENT に値 'C882'、列 TYPE に値 'PPO'、期間に値 ('2013-01-01', '2020-12-31') が設定された行が含まれています。 '2014-01-01' から始めて行の部分を更新し、TYPE 列を 'HMO' に設定します。
UPDATE POLICY FOR PORTION OF BUSINESS_TIME FROM '2014-01-01' TO '9999-12-31' SET TYPE='HMO' WHERE BK='P138', CLIENT='C882';UPDATE ステートメントの処理後、表には元の行の代わりに 2 つの行が含まれています。 期間値 ('2013-01-01', '2014-01-01') を持つ 1 つの行は TYPE 列の値 'PPO' (更新前の値) を表し、期間値 ('2014-01-01', '2020-12-31') を持つもう 1 つの行は TYPE 列の値 'HMO' (UPDATE ステートメントで開始) を表します。
- 配列タイプ INTARRAY および CHARARRAY、変数 INTA、CHARA、および SI、ならびに表 T1 が以下のように定義されているとします。

CREATE TYPE INTARRAY AS INTEGER ARRAY [6]; CREATE TYPE CHARARRAY AS CHAR(20) ARRAY [7]; CREATE VARIABLE INTA AS INTARRAY; CREATE VARIABLE CHARA AS CHARARRAY; CREATE VARIABLE SI INT; CREATE TABLE T1 (COL1 CHAR(7), COL2 INT);
値を CHARA、INTA、および SI に割り当てます。
SET CHARA = ARRAY [ 'a', 'b', 'c' ]; SET INTA = ARRAY [ 1, 2, 3, 4, 5 ]; SET SI = 1;表 T1 に行を挿入してから、配列 CHARA および INTA の値を使用して行の値を更新します。これらの配列の添字は、変数 SI の値によって指定します。
INSERT INTO T1 VALUES ('abc', 10); UPDATE T1 SET COL1 = CHARA[SI], COL2 = INTA[SI];表の行の COL1 には「a」、COL2 には 1 が入っています。
すべての行の列 COL2 の値に配列 INTA のカーディナリティーを設定します。
UPDATE T1 SET COL2 = CARDINALITY(INTA);表の行の COL2 には 5 が入っています。
表 POLICY が存在し、それが単一の inclusive-inclusive 期間 BUSINESS_TIME を使用して定義されているとします。 表には、列 BK に値 'P138'、列 CLIENT に値 'C882'、列 TYPE に値 'PPO'、期間に値 ('2013-01-01', '2020-12-31') が設定された行が含まれています。 次の UPDATE ステートメントを発行するとします。
UPDATE POLICY FOR PORTION OF BUSINESS_TIME BETWEEN '2014-01-01' AND '9999-12-31' SET TYPE='HMO' WHERE BK='P138', CLIENT='C882';UPDATE ステートメントの処理後、表には元の行の代わりに 2 つの行が含まれています。 期間値 ('2013-01-01', '2013-12-31') を持つ 1 つの行は TYPE 列の値 'PPO' (更新前の値) を表し、期間値 ('2014-01-01', '2020-12-31') を持つもう 1 つの行は TYPE 列の値 'HMO' を表します。
