带条件插入的 Oracle Merge 语句

Posted

技术标签:

【中文标题】带条件插入的 Oracle Merge 语句【英文标题】:Oracle Merge statement with conditional insert 【发布时间】:2012-05-15 11:51:57 【问题描述】:

我使用以下语句插入或更新我们的客户已签署的当前文档版本:

        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 语句删除时,我想避免在相同的条件下插入。

问题是,存在三种不同的文档类型 (doc_type),但可能只有一种或两种被同时签名。

如果客户签署了一份文件,那么我想存储它的版本,如果没有,那么我不想在数据库中记录该文件。

因此,当新的 :version 为 null 时,我会删除现有行。这很好用。 问题是,当没有存储该客户的文档时,oracle 实际上会插入一条 version = NULL 的记录。

当 :version 为空时如何避免插入记录?

将合并拆分为单独的删除、更新和插入语句是唯一的方法吗?

【问题讨论】:

【参考方案1】:

如果你使用 10g,你也可以使用条件插入:

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

Rgds.

【讨论】:

以上是关于带条件插入的 Oracle Merge 语句的主要内容,如果未能解决你的问题,请参考以下文章

带条件的 Oracle SQL 合并语句

merge into报错ORA-00926ORA-38014

Mybatis 批量插入带oracle序列例子+ORA-02287: 此处不允许序号

在 ORACLE 中使用 MERGE 语句删除和插入

Oracle:更新列,如果它不在 Merge 语句的条件下

Oracle Merge语句