在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(); }