かなめのロジック

フリーSEの雑記ブログ。ORACLEやPostgreSQL、情報セキュリティ、金融について主に書いています。

MERGE文、エラーになるケース3つ

time 2016/03/16

MERGE文、エラーになるケース3つ

ORACLEのMERGE文、1回のSQLでデータ登録と更新を実現する便利なSQL文ですが、気をつけないと実行エラーとなることがあります。
本記事では、MERGE文のエラーになるケース3つを紹介します。

sponsored link

ON句で指定した項目については、更新が出来ない

ON句で指定した項目については、更新が出来ません。

ON句で指定した項目を更新しようとすると、エラー(ORA-38104)が発生します。

マージ元テーブルに同一キーのデータが複数(データ登録時)

マージ先テーブルに同一キーのデータが存在しない場合、MERGE文ではデータ登録を行います。
その場合でマージ元テーブルに同一キーのデータが複数存在した場合で、かつ、マージ先テーブルに主キーや一意キーが設定されている場合、キー重複エラー(ORA-00001)が発生します。

1件目でデータ登録、2件目でデータを更新というような動作はしません。(そもそもどちらを最終値とするか、という問題になるため、エラーとして落とした方が分かりやすいので、よい動作かと個人的には思います)

マージ元テーブルに同一キーのデータが複数(データ更新時)

マージ先テーブルに同一キーのデータが存在する場合、MERGE文ではデータ更新を行います。
その場合でマージ元テーブルに同一キーのデータが複数存在した場合、エラー(ORA-30926)が発生します。

それぞれのデータで、2回更新というような動作はしません。(これについても、そもそもどちらを最終値とするか、という問題になるため、エラーとして落とした方が分かりやすいので、よい動作かと個人的には思います)

ただし、私の環境だとマージ元とマージ先で全て同一データであった場合、エラーとならない現象が起こりました。
マージ元テーブルに同一キーのデータが複数あっただけで、エラーになるというわけではなさそうなので注意が必要です。(テストでは問題なかったけど、本番で異常終了するなど)

まとめ

MERGE文について、気をつけるべき3つのエラーケースを見てきました。

特にマージ元テーブルに同一キーのデータが複数というのは、「テスト時にはそういったデータが発生することを想定していなかったので問題にならず、本番で障害が発生した」ということが起こりえます。

便利なMERGE文ですが、使う際には注意が必要です。

関連


sponsored link

管理人

かなめ

フリーの業務系システムエンジニア。情報処理安全確保支援士。 ORACLEと金融と子育ての狭間で、元気に楽しくやってます。 [詳細]

管理人twitter

ブログ村



sponsored link