2016-05-26 7 views
0

次のような状況がある:jdbctemplate/JDBCを使用して配列することにより生成された主キーを取得

私は1つのテーブル(GUI_FILTER)と1つの配列(GUI_FILTER_SEQ) IはまたとしてコアJDBCを使用することができ、springjdbctemplateを使用してデータを挿入していますを有していますよく insertクエリでは、sequence.nextvalを取得しています。キーホルダーを使用して、これをjavaに戻して以下のように取得します。 私は両方が失敗している

returnRowCount = namedJdbctmplt.update(sql.toString(), namedParameters, keyHolder, keyColumnNames); 

returnRowCount = jdbctemplate.update(psc, keyHolder); 

を使用してのようないくつかの方法を試してみました私は、シーケンス生成部を削除した場合、

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00936: missing expression 



StringBuilder sql = new StringBuilder(); 
     sql.append(" Insert Into MAPS_AMPS.AMPS_GUI_FILTER "); 
     sql.append(" (FILTER_PRESET_ID,USER_ID,FILTER_PAGE_TXT,FILTER_DISPLY_NM,FILTER_DATA_TXT,ROW_CREATE_TMS,LAST_UPDT_TMS) "); 
     sql.append(" values(Select MAPS_AMPS.AMPS_GUI_FILTER_SEQ.NEXTVAL,?,?,?,?,CURRENT_TIMESTAMP ,null from dual) "); 
     final String sqlQuery = sql.toString(); 

30またはので、それが正常に動作しているような一定のものにMAPS_AMPS.AMPS_GUI_FILTER_SEQ.NEXTVALを選択します。

挿入コマンドとしてシーケンス値を取得する方法はありますか、同時にjdbcを使用して主キーを取得する方法はありますか?

完全なコードは以下のとおりです。

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = DataAccessException.class) 
public Long addFilterPreset(final String userId, final String filterPageCd, 
     final String filterPresetDisplayName, 
     final String serializedTaskBrowserSearchObj) { 

    logger.debug("Start of FilterPresetDaoImpl - addFilterPreset() method"); 

    if(!countSavedFilterPresets(userId,filterPageCd)) 
     return null; 

    //StringBuilder sql = new StringBuilder(); 
    Map<String, Object> parameterMap = new HashMap<String, Object>(); 

    //sql.append(" Insert Into MAPS_AMPS.AMPS_GUI_FILTER "); 
    //sql.append(" (FILTER_PRESET_ID,USER_ID,FILTER_PAGE_TXT,FILTER_DISPLY_NM,FILTER_DATA_TXT,ROW_CREATE_TMS,LAST_UPDT_TMS) "); 
    //sql.append("Values(Select MAPS_AMPS.AMPS_GUI_FILTER_SEQ.NEXTVAL,:userId,:filterPageCd,:filterPresetDisplayName,:filterPresetData,CURRENT_TIMESTAMP ,null)"); 

    /*parameterMap.put("userId", userId); 
    parameterMap.put("filterPageCd", filterPageCd); 
    parameterMap.put("filterPresetDisplayName", filterPresetDisplayName); 
    parameterMap.put("filterPresetData", serializedTaskBrowserSearchObj); 
    */ 
    StringBuilder sql = new StringBuilder(); 
    sql.append(" Insert Into MAPS_AMPS.AMPS_GUI_FILTER "); 
    sql.append(" (FILTER_PRESET_ID,USER_ID,FILTER_PAGE_TXT,FILTER_DISPLY_NM,FILTER_DATA_TXT,ROW_CREATE_TMS,LAST_UPDT_TMS) "); 
    sql.append(" values(Select MAPS_AMPS.AMPS_GUI_FILTER_SEQ.NEXTVAL,?,?,?,?,CURRENT_TIMESTAMP ,null from dual) "); 
    final String sqlQuery = sql.toString(); 

    logger.info("SQL Add Filter Preset Query : {}", sqlQuery); 
    int returnRowCount = 0; 
    KeyHolder keyHolder = new GeneratedKeyHolder(); 
    final String[] keyColumnNames = {"FILTER_PRESET_ID"}; 
    SqlParameterSource namedParameters = new MapSqlParameterSource(parameterMap); 

    PreparedStatementCreator psc = new PreparedStatementCreator() { 
     @Override 
     public PreparedStatement createPreparedStatement(Connection connection) 
       throws SQLException  { 
      PreparedStatement ps = connection.prepareStatement(sqlQuery, keyColumnNames); 
      ps.setString(1, userId); 
      ps.setString(2, filterPageCd); 
      ps.setString(3, filterPresetDisplayName); 
      ps.setString(4, serializedTaskBrowserSearchObj); 
      return ps; 
     } 
    }; 

    try{ 
     long startValue = System.currentTimeMillis(); 
     //returnRowCount = namedJdbctmplt.update(sql.toString(), namedParameters, keyHolder, keyColumnNames); 
     returnRowCount = jdbctemplate.update(psc, keyHolder); 
     long endValue = System.currentTimeMillis(); 
     logger.info("Filter Preset added in {} seconds", (endValue - startValue)/1000); 
    }catch(Exception e){ 
     logger.info("Exception while adding filter preset - " + "userId : "+userId+" filterPageCd : "+filterPageCd +" filterPresetData : "+serializedTaskBrowserSearchObj); 
    }finally{ 
     logger.debug("End of FilterPresetDaoImpl - addFilterPreset() method"); 
    } 
    if (returnRowCount > 0) 
     return keyHolder.getKey().longValue(); 
    return null; 
} 

エラー

enter image description here

答えて

1

クエリからの結果を挿入するときは、VALUESキーワードは必要ありません。 RETURNING句を使用してみてください挿入された値を取得するには

StringBuilder sql = new StringBuilder(); 
     sql.append(" Insert Into MAPS_AMPS.AMPS_GUI_FILTER "); 
     sql.append(" (FILTER_PRESET_ID,USER_ID,FILTER_PAGE_TXT,FILTER_DISPLY_NM,FILTER_DATA_TXT,ROW_CREATE_TMS,LAST_UPDT_TMS) "); 
     sql.append(" (Select MAPS_AMPS.AMPS_GUI_FILTER_SEQ.NEXTVAL,?,?,?,?,CURRENT_TIMESTAMP ,null from dual) "); 
     final String sqlQuery = sql.toString(); 

:しかし、あなたはVALUESキーワードを使用する場合にのみ、INSERT用のRETURNING句を使用することができ、そうすることができますいくつかの詳細は、この記事でOracle's RETURNING INTO usage in Java (JDBC, Prepared Statement)

を議論しています」両方持っている。ここで議論されている通り:PLSQL Insert into with subquery and returning clause (Oracle)

関連する問題