2016-05-26 9 views
0

ist die Situation wie folgt:Fetch Primärschlüssel, erzeugt durch Sequenz jdbctemplate/Jdbc

Ich habe eine Tabelle (GUI_FILTER) und eine Folge (GUI_FILTER_SEQ) I-Daten am Einfügen springjdbctemplate verwenden, können auch Kern Jdbc verwenden, wie Gut. In der Einfügeabfrage erhalte ich sequence.nextval und benutze auch einen Schlüsselhalter, um das zurück zu Java wie unten zu holen. Ich habe mehr Möglichkeiten ausprobiert wie

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

returnRowCount = jdbctemplate.update(psc, keyHolder); 

mit beiden versagen,

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

Wenn ich den Sequenzerzeugungsteil Select MAPS_AMPS.AMPS_GUI_FILTER_SEQ.NEXTVAL etwas konstant wie 30 zu entfernen oder so ist es gut funktioniert.

Gibt es eine Möglichkeit, Sequenzwert als Befehl einzufügen und gleichzeitig den Primärschlüssel mit jdbc holen?

Kompletter Code ist wie folgt.

@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; 
} 

Fehler

enter image description here

Antwort

1

Sie brauchen nicht das Schlüsselwort VALUES, wenn ein Ergebnis aus Abfrage einfügen.

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

Um ein eingeführter Wert versuchen, mit RETURNING-Klausel zu erhalten: einige Details in diesem Beitrag Oracle's RETURNING INTO usage in Java (JDBC, Prepared Statement)

jedoch diskutiert werden, können Sie RETURNING-Klausel für INSERT nur verwenden, wenn Sie das Schlüsselwort VALUES verwenden, so können Sie‘ Ich habe beides. Wie es hier diskutiert wird: PLSQL Insert into with subquery and returning clause (Oracle)

Verwandte Themen