3

私は次のステートメントを使用して、お客様が署名した現在のドキュメントバージョンを挿入または更新します。

        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の場合にレコードの挿入を回避するにはどうすればよいですか?

マージを分割して、削除、更新、挿入のステートメントを分離することが、それを行う唯一の方法ですか?

4

1 に答える 1

3

10gを使用している場合は、インサートの条件も使用できます。

http://www.oracle-developer.net/display.php?id=310

Rgds。

于 2012-05-15T12:32:32.417 に答える