MERGE
MERGE ステートメントは、ソース (表参照の結果) のデータを使用してターゲット (表またはビュー) を更新します。入力データと一致する行がターゲットに存在する場合は、その行を指定内容に基づいて更新/削除できます。ターゲットに存在しない行を指定内容に基づいて挿入することも可能です。 ビューの行を更新/削除/挿入すると、そのビューで INSTEAD OF トリガーが定義されていない限り、ビューの基本表の行も更新/削除/挿入されます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことも、 あるいは対話式に実行することもできます。 これは、動的に準備できる実行可能ステートメントです。このステートメントは、REXX プロシージャーでは使用できません。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- データベース管理者権限
- 挿入操作を指定する場合は、以下のようになります。
- その表やビューについての INSERT 特権、および
- 表またはビューが含まれるスキーマに対する USAGE 特権
- 削除操作を指定する場合は、以下のようになります。
- その表またはビューに対する DELETE 特権
- 表またはビューが含まれるスキーマに対する USAGE 特権
- 更新操作を指定する場合は、以下のようになります。
- 表やビューに対する UPDATE 特権、または
- 更新される各列に対する UPDATE 特権、または
- 表またはビューが含まれるスキーマに対する USAGE 特権
さらに、search-condition、insert-operation、assignment-clause のいずれかに全選択を組み込む場合は、ステートメントの権限 ID の特権に少なくとも以下のいずれか 1 つの権限が含まれていなければなりません。
- 全選択 内で識別された、それぞれの表またはビューごとに、
- 表やビューに対する SELECT 特権、および
- 表またはビューが含まれるスキーマに対する USAGE 特権
- データベース管理者権限
さらに、表またはビューの列を参照する照会を table-reference に組み込む場合は、ステートメントの権限 ID の特権に少なくとも以下のいずれか 1 つの権限が含まれていなければなりません。
- 全選択 内で識別された、それぞれの表またはビューごとに、
- 表やビューに対する SELECT 特権、および
- 表またはビューが含まれるスキーマに対する USAGE 特権
- データベース管理者権限
SQL 特権に対応するシステム権限については、『表またはビューへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-MERGE INTO--+-table-name-+--+--------------------+-----------> '-view-name--' '-correlation-clause-' >--USING--table-reference--ON--search-condition-----------------> .------------------------------------------------------. V | >----WHEN--matching-condition--THEN--+-update-operation-+-+-----> +-delete-operation-+ +-insert-operation-+ '-signal-statement-' .-ELSE IGNORE-. >--+-------------+----------------------------------------------> .-ATOMIC-----------------------------------. >--+------------------------------------------+-----------------> '-NOT ATOMIC--+-STOP ON SQLEXCEPTION-----+-' '-CONTINUE ON SQLEXCEPTION-' .-----------------------------------------. V | >----+-------------------------------------+-+----------------->< +-isolation-clause--------------------+ '-concurrent-access-resolution-clause-' correlation-clause .-AS-. |--+----+--correlation-name--+-----------------------+----------| | .-,-----------. | | V | | '-(----column-name-+--)-' matching-condition |--+-----+--MATCHED--+-----------------------+------------------| '-NOT-' '-AND--search-condition-' update-operation |--UPDATE--+-------------------------+--SET--assignment-clause--| +-OVERRIDING SYSTEM VALUE-+ '-OVERRIDING USER VALUE---' delete-operation |--DELETE-------------------------------------------------------| insert-operation |--INSERT--+-----------------------+--+-------------------------+--> | .-,-----------. | +-OVERRIDING SYSTEM VALUE-+ | V | | '-OVERRIDING USER VALUE---' '-(----column-name-+--)-' >--VALUES--+-+-expression-+-----------+-------------------------| | +-DEFAULT----+ | | '-NULL-------' | | .-,--------------. | | V | | '-(----+-expression-+-+--)-' +-DEFAULT----+ '-NULL-------' 割り当て文節 .-,----------------------------------------------------------. V | |--+---+-column-name--=--+-expression-+-------------------------+-+-+--| | | +-DEFAULT----+ | | | | '-NULL-------' | | | | .-,-----------. .-,--------------. | | | | V | V | | | | '-(----column-name-+--)--=--(--+---+-expression-+-+-+--)-' | | | +-DEFAULT----+ | | | | '-NULL-------' | | | '-row-fullselect-----' | | .-,--------------. | | V | | '-ROW--=--(--+---+-expression-+-+-+--)---------------------------' | +-DEFAULT----+ | | '-NULL-------' | '-row-fullselect-----' isolation-clause |--WITH--+-NC-+-------------------------------------------------| +-UR-+ +-CS-+ +-RS-+ '-RR-'
説明
- table-name または view-name
- マージの更新、挿入、削除の操作のターゲットを指定します。この名前は、現行サーバーに存在する表またはビューを示していなければなりませんが、カタログ表、カタログ表のビュー、読み取り専用ビュー、または、ビューに対して定義された INSTEAD OF トリガーに無関係の削除不能ビューを示すものであってはなりません。table-name が履歴表を識別する場合、MERGE ステートメントに更新操作および挿入操作を指定することはできません。
- AS correlation-name
- 検索条件 やマッチング条件 の中で、または割り当て文節 の右側で、ターゲット表またはビューを指定するために使用できます。表またはビューの列に対する参照を修飾するためには、correlation-name を使用します。相関名 を指定する場合は、列名 も同時に指定することによって、表名 またはビュー名 の列に名前を指定することができます。列リストを指定する場合は、その列リストの中で、表またはビューの各列について、それぞれ名前を指定する必要があります。詳しくは、相関名を参照してください。
- USING table-reference
- ターゲットにマージする結果表として行のセットを指定します。結果表が空の場合、警告が戻されます。
- ON search-condition
- ソース表 からの行とターゲット表の行が一致するかどうかを判定するために使用される述部を指定します。
search-condition に組み込む各 column-name では、ターゲット表またはターゲット・ビューまたは table-reference の列名を指定しなければなりません (ただし、副照会の内部は除きます)。 検索条件に副照会を組み込む場合に、マージとその副照会の基本オブジェクトが同じ表であれば、行の更新/挿入操作が実行される前にその副照会が完全に評価されます。
search-condition は、ターゲット表と table-reference の結果表の各行に適用されます。 table-reference の結果表の行のうち、search-condition の結果が真になった行では、指定した更新/削除操作が実行されます。結果表の行のうち、search-condition の結果が真にならなかった行では、指定した挿入操作が実行されます。
定量副照会、副選択を入れた IN 述部、EXISTS 副照会を search-condition に組み込むことはできません。 基本述部副照会またはスカラー全選択は含めることができます。集約関数または非決定的なスカラー関数を使用した式を組み込むこともできません。
- WHEN matching-condition
- update-operation、delete-operation、insert-operation、
または signal-statement が実行される条件を指定します。それぞれの matching-condition は、指定順で評価されます。matching-condition の評価が真になった行は、その後のマッチング条件の対象になりません。
- MATCHED
- ON search-condition が真になった行で実行する操作を指定します。THEN の後に指定できるのは、UPDATE、DELETE、signal-statement に限られます。
- AND search-condition
- THEN の後に指定する操作の実行に関する ON 検索条件に合致した行に適用する追加の検索条件を指定します。
検索条件 には、EXISTS または IN 述部に副照会を組み込むことはできません。
- NOT MATCHED
- ON search-condition が偽または不明になった行で実行する操作を指定します。THEN の後に指定できるのは、INSERT または signal-statement に限られます。
- AND search-condition
- THEN の後に指定する操作の実行に関する ON 検索条件に合致しなかった行に適用する追加の検索条件を指定します。
検索条件 には、EXISTS または IN 述部に副照会を組み込むことはできません。
- THEN
- マッチング条件 が真と評価された時に実行する操作を指定します。
- update-operation
- matching-condition の評価が真になった行で実行する更新操作を指定します。
- assignment-clause
- 列の更新情報のリストを指定します。
- column-name
- 更新する列を識別します。column-name では、ターゲット表またはターゲット・ビューの列を指定する必要があります。スカラー関数、定数、式から派生するビューの列を column-name で指定することはできません。列名を複数回指定することはできません。
1 つのビューに同じ列から得られる 2 つの列がある場合、その列の値を更新することは可能ですが、その 2 つの列を同一の MERGE ステートメントで更新することはできません。
- ROW
- ターゲット表またはビューのすべての列 (ただし、隠し属性を指定して定義された列以外) を識別します。ビューが指定されている場合、 そのビューの列がまったく、スカラー関数、定数、または式から派生していない場合があります。
- 式、NULL、および DEFAULT の数 (または row-fullselect の結果列の数) は、行の列の数と一致していなければなりません。
- ビューに、そのビューの別の列から派生したビュー列が含まれている場合、そのビューに ROW を指定することはできません。これは、両方の列を同じ UPDATE 内で更新できないためです。
- expression
- 列の新しい値を示します。この式の中で集約関数
を指定することはできません (ただし、集約関数がスカラー全選択の
中にある場合を除きます)。
ターゲットの table-name または view-name の列に対する参照をこの式に組み込むこともできます。更新する行ごとに、式に組み込むターゲット列の参照の値として、行の更新前の列の値を指定します。
expression がソース表の単一の列への参照である場合、ソース表の列の値は、拡張標識変数の値で指定された可能性があります。 そのような標識変数は、assignment-clause の対応するターゲット列に影響を与えます。
拡張標識変数が使用可能であり、式が以下の参照よりも複雑な場合には、拡張標識変数の 値 DEFAULT (-5) または UNASSIGNED (-7) を使用してはなりません。- ソース表の単一の列
- 単一のホスト変数
- DEFAULT
- 列にデフォルト値を割り当てるように指定します。DEFAULT は、デフォルト値のある列のみに対して指定できます。デフォルト値
について詳しくは、CREATE TABLE の DEFAULT 節の説明を参照してください。
ユーザー指定の値をすべて無視 して固有のシステム生成値を使用するよう指示する OVERRIDING USER VALUE が 指定されていない場合、GENERATED ALWAYS として定義された列には DEFAULT を指定する必要があります。GENERATED BY DEFAULT として定義される列に関しては、有効な値を指定することができます。
- NULL
- 列の新しい値に NULL 値を指定します。NULL 可能列にのみ NULL を指定します。
- delete-operation
- matching-condition の評価が真になった行で実行する削除操作を指定します。
- insert-operation
- matching-condition の評価が真になった行で実行する挿入操作を指定します。
- INSERT
- 挿入操作で使用する列名と行値式のリストの前に記述します。
- 行値式にある値の数は、暗黙的または明示的な挿入列リストに含まれている 名前の数と同じでなければなりません。リストの最初の列には VALUES 文節の最初の値が挿入され、 リストの 2 番目の列には VALUES 文節の 2 番目の値が挿入されるというように、 指定した列に対応する値が順に挿入されます。
- (column-name,…)
- 値を挿入する列を指定します。
それぞれの名前は、表またはビューの列を識別する名前でなければなりません。
同じ列を複数回指定することはできません。
拡張標識変数が使用できないと、更新不可能なビュー列を識別することはできません。拡張標識変数が使用できず、挿入操作の対象となるビューに上記のような列がある場合は、列名のリストを指定しなければなりません。
この列名のリストから、値を挿入できない列の名前を除外する必要があります。
ビュー内の更新可能な列の説明については、CREATE VIEWを参照してください。
列名のリストを指定しなかった場合は、該当する表またはビューにあるすべての列を左から右の順序で指定したものと見なされます。 隠し属性で定義されたすべての列が省略されます。このリストは、ステートメントを準備するときに確立されるので、ステートメントを準備した後で表に追加した列をリストに指定してはなりません。
- VALUES
- 挿入する新しい行を指定します。
この節の 各変数は、変数宣言規則に従って宣言された変数を示していなければ なりません。ホスト構造は使用できません。変数について詳しくは、ホスト変数に対する参照を参照してください。
- expression
- 集約関数または列名を含まない、式で説明されているタイプの expression。拡張標識変数が使用可能であり、式が以下の参照よりも複雑な場合には、拡張標識変数の 値 DEFAULT (-5) または UNASSIGNED (-7) を使用してはなりません。
- ソース表の単一の列
- 単一のホスト変数
- 明示的にキャストされるホスト変数
- DEFAULT
- 列にデフォルト値を割り当てるように指定します。DEFAULT は、デフォルト値のある列のみに対して指定できます。デフォルト値
について詳しくは、CREATE TABLE の DEFAULT 節の説明を参照してください。
ユーザー指定の値をすべて無視 して固有のシステム生成値を使用するよう指示する OVERRIDING USER VALUE が 指定されていない場合、GENERATED ALWAYS として定義された列には DEFAULT を指定する必要があります。GENERATED BY DEFAULT として定義される列に関しては、有効な値を指定することができます。
- NULL
- 列の値を NULL 値にすることを指定します。NULL は、NULL 可能列にのみ指定してください。
- OVERRIDING SYSTEM VALUE または OVERRIDING USER VALUE
- ROWID、識別、または行変更タイム・スタンプ列に、システムが生成した値やユーザーが指定した値を使用するかどうかを指定します。OVERRIDING SYSTEM VALUE を指定する場合は、INSERT の暗黙的または明示的な列リストまたは UPDATE の SET 文節に、GENERATED ALWAYS として定義された
ROWID 列、ID 列、または行変更タイム・スタンプ列が含まれていることが必要です。
OVERRIDING USER VALUE を指定する場合は、INSERT の暗黙的または明示的な列リストまたは UPDATE の SET 文節に、GENERATED ALWAYS または GENERATED BY DEFAULT として定義されている列を組み込む必要があります。
- OVERRIDING SYSTEM VALUE
- GENERATED ALWAYS として定義されている列について、VALUES または SET 文節に指定されている値を使用することを指定します。システム生成の値は使用されません。
- 行開始列、行終了列、トランザクション開始 ID 列、または生成式列の値が提供された場合、 それは DEFAULT でなければなりません。
- OVERRIDING USER VALUE
- GENERATED ALWAYS または GENERATED BY DEFAULT として定義されている列について、VALUES または 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 値である場合のみです。BY DEFAULT として定義された識別または行変更タイム・スタンプ列に値を挿入または更新した場合は、その識別または行変更タイム・スタンプ列が固有制約または固有索引内の唯一のキーである場合以外は、データベース・マネージャーはその指定された値が該当の列についての固有な値であるかどうかを検査しません。固有制約も固有索引もない場合は、データベース・マネージャーは、NO CYCLE が有効である
場合に限り、システム生成の値のセットの中でのみ各値の固有性を保証します。
値が指定されていない場合は、データベース・マネージャーは新しい値を生成します。
- signal-statement
- matching-condition の評価が真になったときにエラーを返すために実行する SIGNAL ステートメントを指定します。SIGNALを参照してください。
- ELSE IGNORE
- USING table-reference の行ですべての WHEN 文節の matching-condition が偽になった場合に何の操作も実行しない、という動作を指定します。 その場合は、ELSE IGNORE を指定したかどうかにかかわりなく、何の操作も実行されません。
- ATOMIC または NOT ATOMIC
- エラーを処理する方法を指定します。
- ATOMIC
- update-operation、delete-operation、 または insert-operation の実行中にエラーが発生した場合に MERGE ステートメント全体をロールバックする、という動作を指定します。
- NOT ATOMIC
- update-operation、delete-operation、
または insert-operation の実行中にエラーが発生した場合に、その update-operation、delete-operation、
または insert-operation のみがロールバックされることを指定します。
- STOP ON SQL EXCEPTION
- update-operation、delete-operation、 または insert-operation の実行中にエラーが発生した場合に MERGE ステートメントの処理を停止する、という動作を指定します。
- CONTINUE ON SQL EXCEPTION
- update-operation、delete-operation、 または insert-operation の実行中にエラーが発生した場合に MERGE ステートメントの処理を続行する、という動作を指定します。
- isolation-clause
- このステートメントに関して使用する分離レベルを指定します。
- WITH
- 分離レベルを指定します。次のいずれかになります。
- RR 反復可能読み取り
- RS 読み取り固定
- CS カーソル固定
- UR 非コミット読み取り
- NC コミットなし
- concurrent-access-resolution-clause
- SELECT ステートメントで使用する並行アクセスの解決方法を指定します。詳しくは、concurrent-access-resolution-clauseを参照してください。
MERGE の規則
- 単一の MERGE ステートメントに、複数の update-operation、delete-operation、insert-operation、または signal-statement を 指定できます。
- ターゲットの各行を操作できるのは、1 回に限られます。ターゲットの行は、table-reference の結果表の 1 つの行に対してのみ MATCHED として評価されます。ネストした SQL 操作 (INSTEAD OF トリガー以外のトリガーまたは RI) で、UPDATE、DELETE、INSERT、MERGE の各ステートメントのターゲットとして、ターゲット表 (または同じ階層にある表) を指定することはできません。
拡張標識変数の使用: 使用可能な場合は、正の値および 0 (ゼロ) から -7 以外の標識変数値を設定しないでください。 DEFAULT および UNASSIGNED 拡張標識変数値を、それらがサポートされていないコンテキストに指定しないでください。
拡張標識変数: MERGE ステートメントの挿入部分で、 拡張標識変数値 UNASSIGNED は、列をデフォルト値に設定する 効果があります。
MERGE 制約事項: MERGE ステートメント のターゲット表にトリガーがあるか、または、ターゲット表が参照整合性制約における親である場合、 update-operation または insert-operation に、グローバル変数、 関数、または副選択が含まれていてはなりません。
注
処理の論理順序: NOT ATOMIC の MERGE ステートメントの場合は、各ソース行がそれぞれ別個に処理されます。つまり、各ソース行で別々の MERGE ステートメントが実行されるような動作になります。 例えば、ターゲット行の更新を引き起こすソース行は、行の更新が実行されるときに、トリガー (ステートメント・レベルのトリガーを含む) を起動します。したがって、5 つの行が更新されるとすれば、UPDATE トリガー (ステートメント・レベルの UPDATE トリガーを含む) が 5 回起動されます。
- 1 つのセットとしてまとめて処理する行をソースとターゲットから判別します。このステートメントで特殊レジスターの CURRENT DATE、CURRENT TIME、CURRENT TIMESTAMP のいずれかを使用する場合は、ステートメント全体でクロックの読み取りが 1 回だけ発生します。
- ON 文節を使用して、それらの行を MATCHED または NOT MATCHED のいずれかとして分類します。
- WHEN 文節に含まれている matching-condition を評価します。
- assignment-clause と insert-operation に含まれている式を評価します。
- それぞれの signal-statement を実行します。
- 指定された順序に従って、 それぞれの update-operation、delete-operation、 または insert-operation を該当する行に適用します。 それぞれの update-operation、delete-operation、または insert-operation によってアクティブにされたトリガーが実行されます。ステートメント・レベルのトリガーは、update-operation、delete-operation、 または insert-operation の基準を満たす行がない場合でもアクティブになります。 それぞれの update-operation、delete-operation、 または insert-operation は、 後続のそれぞれの update-operation、delete-operation、 または insert-operation のトリガーに影響する可能性があります。
更新行の数: MERGE ステートメントの実行後、SQL 診断域の ROW_COUNT ステートメント情報項目 (または SQLCA の SQLERRD(3)) には、MERGE ステートメントによって操作された行の数が入ります (ただし、ELSE IGNORE 文節の対象になった行は除外されます)。ROW_COUNT 項目と SQLERRD(3) には、トリガーの結果として操作された行の数は含まれません。DB2_ROW_COUNT_SECONDARY ステートメント情報項目 (または SQLCA の SQLERRD(5)) の値には、それらの行の数が含まれています。
ROW_COUNT および DB2_ROW_COUNT_SECONDARY についての説明は、GET DIAGNOSTICSを参照してください。SQLCA についての説明は、SQLCA (SQL 連絡域)を参照してください。
GET DIAGNOSTICS に関する注意点: MERGE ステートメントの完了時に 1 つ以上のエラーが発生している場合は、MERGE ステートメントの実行後に GET DIAGNOSTICS ステートメントを使用して、どの入力行でエラーが発生したのかを確認できます。GET DIAGNOSTICS のステートメント情報項目 NUMBER には、MERGE ステートメントの実行時に検出された条件 (エラーまたは警告) の数が入ります。さらに、GET DIAGNOSTICS の条件情報項目 DB2_ROW_NUMBER では、それぞれの条件ごとに、エラーの原因になった入力ソース行を確認できます。
挿入行の更新はできない: MERGE ステートメントの実行前に存在しなかったターゲット行 (つまり、MERGE ステートメントによって挿入された行) を更新することはできません。
MERGE のターゲット行の並行変更: MERGE 処理では、update-operations、 delete-operations、 または insert-operations の実行前に、MERGE で影響を受けるターゲット行が確認されます。制限の強い分離レベル (反復可能読み取りなど) を使用する場合を除き、影響を受ける一連のターゲット行が確認されてから、特定の行の update-operation、delete-operation、または insert-operation が処理されるまでの間に、並行処理によって MERGE のターゲット行が挿入/変更されることもあり得ます。そのような並行アクティビティーが発生すると、エラーになる可能性があります。例えば、MERGE 処理で、ソース行がターゲットに存在しない、という状況が確認されたとします。ターゲットでは、1 つの列の値にユニーク・キー制約がかかっています。MERGE がソース・データに基づいて新しい行を挿入しようとする前に、並行処理が同じキー値で行を挿入してしまう可能性があります。そのような状態で MERGE 処理がその行を挿入しようとすると、重複キー・エラーが発生します。
ロッキング: COMMIT(*RR)、COMMIT(*ALL)、COMMIT(*CS)、 または COMMIT(*CHG) が指定されている場合は、正常に実行される MERGE ステートメントの実行中に、 1 つまたは複数の排他的ロックが掛けられます。 そのようなロックがコミットまたはロールバック操作によって解放されるまで、挿入または更新された行は、以下によってのみアクセスすることができます。
- 挿入または更新を行ったアプリケーション・プロセス
- 読み取り専用操作を介して、COMMIT(*NONE) または COMMIT(*CHG) を使用する別のアプリケーション・プロセス
ロックは、他のアプリケーション・プロセスがその表の操作を行うのを防止します。 ロッキングの詳細については、COMMIT、ROLLBACK、および LOCK TABLE ステートメントの説明を参照してください。 また、分離レベルおよび「データベース・プログラミング」も参照してください。
COMMIT(*RR)、COMMIT(*ALL)、COMMIT(*CS)、または COMMIT(*CHG) を指定した場合は、1 つの MERGE ステートメントで最高 500 000 000 行を獲得することができます。行ロックの数には、MERGE のターゲットで挿入/更新/削除された行と、トリガーの結果として同じコミットメント定義で挿入/更新/削除された行が含まれます。 さらに、COMMIT(*ALL) を指定した場合は、USING table-reference で参照されているソース行も行ロックの数に含まれます。
アクティブな行および列アクセス制御がある表: 使用可能な行の許可と列マスクが、MERGE ステートメント内の更新操作や挿入操作にどのように影響を及ぼすかについては、INSERT ステートメントと UPDATE ステートメントの情報を参照してください。
NOT ATOMIC の処理: NOT ATOMIC を指定した場合は、ソース・データ行が別々に処理されます。MERGE ステートメントで特殊レジスター (CURRENT TIMESTAMP など) を参照した場合は、ソース・データの各行が処理されるたびにその参照が評価されます。ステートメント・レベルのトリガーもソース・データの各行の処理時に活動化されます。
ソース・データの行の操作中にエラーが発生すると、そのエラーの時点で処理の対象になっていた行は、挿入/更新/削除されません。 個々の行の処理はアトミック・オペレーションになります。MERGE ステートメントの処理で既に実行された他の変更は、ロールバックされません。CONTINUE ON EXCEPTION を指定した場合は、次の行に移って実行処理が続行されます。
システム期間テンポラル表: システム期間テンポラル表に関する MERGE ステートメントが処理される場合、行は特定のデータ変更操作が呼び出された場合と同様に影響を受けます。
例
MERGE INTO archive ar
USING (SELECT activity, description FROM activities) ac
ON (ar.activity = ac.activity)
WHEN MATCHED THEN
UPDATE SET description = ac.description
WHEN NOT MATCHED THEN
INSERT (activity, description) VALUES(ac.activity, ac.description)
MERGE INTO inventory AS in
USING (SELECT partno, description, count FROM shipment
WHERE shipment.partno IS NOT NULL) AS sh
ON (in.partno = sh.partno)
WHEN MATCHED THEN
UPDATE SET description = sh.description,
quantity = in.quantity + sh.count
WHEN NOT MATCHED THEN
INSERT (partno, description, quantity)
VALUES (sh.partno, sh.description, sh.count)
MERGE INTO account AS a
USING (SELECT id, SUM(amount) sum_amount FROM transaction
GROUP BY id) AS t
ON a.id = t.id
WHEN MATCHED THEN
UPDATE SET balance = a.balance + t.sum_amount
WHEN NOT MATCHED THEN
INSERT (id, balance) VALUES (t.id, t.sum_amount)
MERGE INTO employee_file AS e
USING (SELECT empid, phone, office
FROM (SELECT empid, phone, office,
ROW_NUMBER() OVER (PARTITION BY empid
ORDER BY transaction_time DESC) rn
FROM transaction_log) AS nt
WHERE rn = 1) AS t
ON e.empid = t.empid
WHEN MATCHED THEN
UPDATE SET (phone, office) = (t.phone, t.office)
WHEN NOT MATCHED THEN
INSERT (empid, phone, office)
VALUES(t.empid, t.phone, t.office)
hv1 =
"MERGE INTO employee AS t
USING (VALUES(CAST(? AS CHAR(6)), CAST(? AS VARCHAR(12)),
CAST(? AS CHAR(1)), CAST(? AS VARCHAR(15)),
CAST(? AS SMALLINT), CAST(? AS INTEGER)))
s (empno, firstnme, midinit, lastname, edlevel, salary)
ON t.empno = s.empno
WHEN MATCHED THEN
UPDATE SET salary = s.salary
WHEN NOT MATCHED THEN
INSERT (empno, firstnme, midinit, lastname, edlevel, salary)
VALUES (s.empno, s.firstnme, s.midinit, s.lastname, s.edlevel,
s.salary)";
EXEC SQL PREPARE s1 FROM :hv1;
EXEC SQL EXECUTE s1 USING :hv2, :hv3, :hv4, :hv5, :hv6, :hv7;
MERGE INTO archive ar
USING (SELECT activity, description, date, last_modified
FROM activities_groupA) ac
ON (ar.activity = ac.activity) AND ar.group = 'A'
WHEN MATCHED AND ac.date IS NULL THEN
SIGNAL SQLSTATE '70001'
SET MESSAGE_TEXT = 'Activity cannot be modified. Reason: date is not known'
WHEN MATCHED and ac.date < CURRENT DATE THEN
DELETE
WHEN MATCHED AND as.last_modified < ac.last_modified THEN
UPDATE SET (description, date, last_modified)
= (ac.description, ac.date, DEFAULT)
WHEN NOT MATCHED AND ac.date IS NULL THEN
SIGNAL SQLSTATE '70002'
SET MESSAGE_TEXT = 'Activity cannot be inserted. Reason: date is not known'
WHEN NOT MATCHED AND ac.date >= CURRENT DATE THEN
INSERT (group, activity, description, date)
VALUES ('A', ac.activity, ac.description, ac.date)
ELSE IGNORE