2017-07-18 104 views
0

我知道我的問題類似於這個問題:UPDATE on INSERT duplicate primary key in Oracle?MERGE JDBCTemplate問題

實際上確切的副本。

我是春季框架的新手。所以這是我第一次嘗試。我嘗試過很多例子,但都失敗了。

所以這裏是事情。

我的源和目標是相同的。我想要的是更新記錄,如果它在Db中,否則插入。

我正在使用以下方法。我的插入查詢工作正常。但是,當我使用MERGE。我收到錯誤。

public void insertAllPointss(final List<AllPoints> allpoints) { 


//  String sql = "INSERT INTO myTable " + 
//     "(WIFI_SEQ_NO, my_urlL, street_number, house_number, street_name, last_update) VALUES (seq_w.NEXTVAL, ?, ?, ?, ?, ?) "; 

     String sql = "MERGE INTO myTable M" + 
        " USING (SELECT ? AS my_urlL, ? AS street_number, ? AS house_number,? AS street_name, ? AS last_update FROM dual) N"+ 
        " ON (M.street_number = N.street_number AND M.house_number = N.house_number AND M.street_name = N.street_name)"+ 
        " WHEN MATCHED THEN UPDATE SET M.last_update = N.last_update"+ 
        " WHEN NOT MATCHED THEN INSERT(WIFI_SEQ_NO, my_urlL, street_number, house_number, street_name, last_update)"+ 
             " VALUES(seq_w.NEXTVAL, N.my_urlL, N.street_number, N.house_number, N.street_name, N.last_update)"; 

      getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() { 

       Calendar calendar = Calendar.getInstance(); 
       java.sql.Date ourJavaDateObject = new java.sql.Date(calendar.getTime().getTime()); 
      @Override 
      public void setValues(PreparedStatement ps, int i) throws SQLException { 
       AllPoints allpoints = AllPointss.get(i); 
       ps.setString(1, AllPoints.getWebsite()); 
       ps.setDouble(2, allpoints.getStreetNumber()); 
       ps.setDouble(3, allpoints.getHouseNumber()); 
       ps.setString(4, allpoints.getStreetName()); 
       ps.setDate(5, ourJavaDateObject); 
      } 

      @Override 
      public int getBatchSize() { 
       return AllPointss.size(); 
      } 
      }); 


     } 

以下是我的日誌文件

[7/18/17 8:24:00:952 CST] 00000043 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8203I: Database product name : H2 
[7/18/17 8:24:00:952 CST] 00000042 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8203I: Database product name : H2 
[7/18/17 8:24:00:952 CST] 00000043 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8204I: Database product version : 1.4.195 (2017-04-23) 
[7/18/17 8:24:00:952 CST] 00000042 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8204I: Database product version : 1.4.195 (2017-04-23) 
[7/18/17 8:24:00:952 CST] 00000043 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8205I: JDBC driver name : H2 JDBC Driver 
[7/18/17 8:24:00:952 CST] 00000042 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8205I: JDBC driver name : H2 JDBC Driver 
[7/18/17 8:24:00:952 CST] 00000043 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8206I: JDBC driver version : 1.4.195 (2017-04-23) 
[7/18/17 8:24:00:952 CST] 00000042 com.ibm.ws.rsadapter.spi.DatabaseHelper      I DSRA8206I: JDBC driver version : 1.4.195 (2017-04-23) 
[7/18/17 8:24:01:108 CST] 00000042 SystemErr             R Exception in thread "SimpleAsyncTaskExecutor-1" 
[7/18/17 8:24:01:108 CST] 00000043 SystemErr             R Exception in thread "SimpleAsyncTaskExecutor-2" 
[7/18/17 8:24:01:108 CST] 00000043 SystemErr             R org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [MERGE INTO myTable M USING (SELECT ? AS my_urlL, ? AS street_number, ? AS house_number,? AS street_name, ? AS last_update FROM dual) N ON (M.street_number = N.street_number AND M.house_number = N.house_number AND M.street_name = N.street_name) WHEN MATCHED THEN UPDATE SET M.last_update = N.last_update WHEN NOT MATCHED THEN INSERT(WIFI_SEQ_NO, my_urlL, street_number, house_number, street_name, last_update) VALUES(seq_w.NEXTVAL, N.my_urlL, N.street_number, N.house_number, N.street_name, N.last_update) 

我覺得有一個問題我的MERGE SQL語句,我尋找一些幫助/指導

回答

1

正確的語法使用:

MERGE INTO people AS t 
USING (
    VALUES (5, 'Chuck', 'Norris'), 
       (6, 'John', 'Smith'), 
       (7, 'Abraham', 'Lincoln') 
       -- maybe more rows 
     ) AS s (id, name, surname) 
    ON t.id = s.id 
    WHEN MATCHED THEN 
     UPDATE SET t.name=s.name, t.surname=s.surname 
    WHEN NOT MATCHED THEN 
     INSERT (id, name, surname) 
       VALUES (s.id, s.name, s.surname) 

Oracle Merge