ORACLEのMERGE INTOで、UPDATEは出来るのに、INSERTできない

投稿日:

最近、Oracleのエラーの話しか書いてない気がするw

 

 

便利というか、トランザクション内の処理も1つで済むので、MERGE INTO文を使うことがあります。
実際、

  • 新規データならINSERT文
  • 変更ならUPDATE文

を実行したいことってよくある。

MERGE INTO文のメリット

ただ、INSERT文とUPDATE文をそれぞれ作って、分岐させて、トランザクションの管理をして・・・

ってのは、少し面倒くさかったりもする。

そんな時に、MERGE INTOは重宝してます。

管理するSQLも1箇所で済むので、個別の修正モレの可能性も減るし。

MERGE INTO文のデメリット

正しく使えれば、デメリットでも何でもないんだけど、SQL文が長くなる。

INSERTとUPDATEの処理を1つに纏めてるのだから、当然っちゃ当然なんだけどw

自分は、MERGE INTO分は苦手。

ON句で対象となる条件の記載方法が良く分からなかったから・・・

ON句の書き方

ぶっちゃけ、ON句が良く分からん\(^o^)/

なので、作成されたMERGEのSQL文を修正することはあっても、自分では極力作らないようにしていた。

っていうか、正しく動くMERGE文が作れなかったから・・・

ということで、どハマリした内容。

それの1つがこれだった。

参考URL
スレッド: MERGE INTOのINSERT文が働かない。
http://www.oracle.co.jp/forum/thread.jspa?threadID=35002915

分かってる人からしたら、至極当然な内容なんだけど、一応、自分なりに分かるように解釈すると、

  • USING句に自テーブル(UPDATEやINSERTの対象)を指定すると、USING句内でSelectされた結果と言うのは、ヒットするかしないかになる
  • ヒットすればWHEN MATCHED THEN以降のUPDATE(これは記載する状況で変わる)文が実行される
  • USING句でヒットしないときにON句での比較そのものが出来ないみたいで、WHEN NOT MATCHED THEN以降のINSERT(これは記載する状況で変わる)文が実行されない

なので、USING句では、対象の主キーなどの条件でレコードが存在するか否かではなく、存在有無を判定したい値をDUALテーブルなんかを使って定義すれば、とりあえずは大丈夫な感じらしい。

今のSQLの知識的にはこんな理解。







-ORACLE
-

関連記事

[ORACLE]oracleのログの場所(リスナーログ、アラートログ)

ぶっちゃけ、ログの場所なんて普段意識してないわwww 存在は知ってるものの、ぶっちゃけ、普段からそんな場所など意識していたことがない。 もちろん、何かあったときは、ファイル検索で見つけりゃいいや~と思 …

[Oracle]破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。

破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。 破棄されたオブジェクトかどうかの判断(MSDK) MSDNでも破棄さ …

C# OracleDbAccessを使用して、SQL実行時にORA-00911 文字が無効です のエラー

表題のとおり、C#でOracleDbAccessを使用して、SQLを実行させる時に発生しました。 ネットで探すと、 全角スペースが原因 とか出てきたので、SQL内のスペースを全て半角スペースに置き換え …

[ORACLE]Oracleに接続できない時に確認すること

Oracleを新しくインストールした時に、中々接続できなかったので、その時に確認しておくべき事項のまとめ。 少なくとも、これは先にやっておいた方がいいこととか。 前提条件 前提と書くとものものしいけど …

何度だって引っかかるORACLEのエラー・・・。ORA-01008:バインドされていない変数があります。

今日も今日とて、ORA-01008のエラーに悩まされる。 無慈悲に「バインドされていない変数があります。」ってメッセージは出してくれるんだけど、ビンゴの位置は教えてくれないわけで・・・ 何度目だろう・ …


カテゴリー