在JAVA中使用Oracle的MERGE以及INSERT ALL语法

转载至:http://blog.csdn.net/kkdelta/article/details/7198355


在JAVA开发中通常碰到这样的需求,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.

如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,

同时性能也不好,要来回数据库两次.

使用merge的话则可以一条SQL语句完成.

下面是JAVA代码的示例:(这里简单起见,没有对异常下连接关闭做处理)

    private static void testMerge() throws SQLException {

        // create table testtb(id int,val varchar2(10))
        
        String sqlstr = "merge into testtb "
                + "using (select ? as newid,? as newval from dual) newData "
                + "ON (testtb.id=newData.newid) "
                + "WHEN NOT MATCHED THEN "
                + "INSERT VALUES (newid,newval) "
                + "WHEN MATCHED THEN " + "UPDATE SET testtb.val=newData.newval";

        Connection conn = NONXADBUtil.getConnection("jdbc:oracle:thin:@147.151.100.19:1521:orcl", "user", "pwd");

        PreparedStatement sta = conn.prepareStatement(sqlstr);
        
        sta.setInt(1, 1);
        sta.setString(2, "new value");
        
        sta.executeUpdate();

        sta.close();
        conn.commit();
        conn.close();

    }
同样,Oracle的insert all语法支持一条SQL语句一次插入到多个表,如:
INSERT ALL
   INTO tx1 VALUES (1000, 1)
   INTO tx2  VALUES (2000, 1)
SELECT * FROM dual;
    private static void testInsertAll() throws SQLException {
        
        String sqlstr = "INSERT ALL  INTO tx1 VALUES (?, ?) INTO tx2  VALUES (?, ?) SELECT * FROM DUAL";

        Connection conn = NONXADBUtil.getConnection("jdbc:oracle:thin:@147.xx:orcl", "xx", "xx");

        PreparedStatement sta = conn.prepareStatement(sqlstr);
        
        sta.setInt(1, 1000);
        sta.setInt(2, 1);
        sta.setInt(3, 2000);
        sta.setInt(4, 1);

        sta.executeUpdate();

        sta.close();
        conn.commit();
        conn.close();
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值