私は次のステートメントを使用して、お客様が署名した現在のドキュメントバージョンを挿入または更新します。
MERGE INTO schema.table ccv
USING (select :customer_id as customer_id, :doc_type as doc_type, :version as Version FROM DUAL) n
ON (ccv.customer_id = n.customer_id and ccv.doc_type = n.doc_type)
WHEN MATCHED
THEN UPDATE
set ccv.version = n.version
DELETE WHERE ccv.version is null
WHEN NOT MATCHED
THEN INSERT
( customer_id, doc_type, version)
VALUES
(:customer_id,:doc_type,:version)
基本的に、DELETE WHEREステートメントで削除するときに、同じ条件で挿入することは避けたいと思います。
重要なのは、3つの異なるドキュメントタイプ(doc_type)がありますが、シミュレートされた署名が行われるのは1つまたは2つだけであるということです。
クライアントがドキュメントに署名した場合、そのバージョンを保存したいのですが、そうでない場合は、そのドキュメントを含むレコードをデータベースに保存したくありません。
したがって、新しい:versionがnullの場合、既存の行を削除します。それはうまくいきます。問題は、その顧客のドキュメントが保存されていない場合、Oracleが実際にバージョン=NULLのレコードを挿入することです。
:versionがnullの場合にレコードの挿入を回避するにはどうすればよいですか?
マージを分割して、削除、更新、挿入のステートメントを分離することが、それを行う唯一の方法ですか?