2013-03-21 4 views
4

код, который вызывает исключение состоит в следующем:исключение Обновление с помощью JDBC DB2 на

for (int i = 0; i < updateParams.size(); i++) { 
     s = con.prepareStatement(sSQL); 
     params = (String[][]) updateParams.get(i); 
     setParamsPreparedStatement(s, params); 
     log.debug("executeUpdates: " + sSQL + "[params:" + Arrays.deepToString(params) + "]"); 
     Date d = new Date(); 
     s.execute(); 
     log.info("STATEMENT EXECUTE TIME IN SECOND=" + (new Double(new Date().getTime() - d.getTime())/1000)); 
     rowcount += s.getUpdateCount(); 
     s.close(); 
    } 

Точная строка за исключением является s.execute.

stracktrace является:

com.ibm.db2.jcc.c.SqlException: The value of a host variable in the EXECUTE or OPEN statement is out of range for its corresponding use. 
    at com.ibm.db2.jcc.c.fg.d(fg.java:1340) 
    at com.ibm.db2.jcc.b.gb.k(gb.java:351) 
    at com.ibm.db2.jcc.b.gb.a(gb.java:60) 
    at com.ibm.db2.jcc.b.w.a(w.java:52) 
    at com.ibm.db2.jcc.b.wb.c(wb.java:213) 
    at com.ibm.db2.jcc.c.gg.ab(gg.java:1779) 
    at com.ibm.db2.jcc.c.gg.d(gg.java:2324) 
    at com.ibm.db2.jcc.c.gg.d(gg.java:2420) 
    at com.ibm.db2.jcc.c.gg.X(gg.java:1332) 
    at com.ibm.db2.jcc.c.gg.execute(gg.java:1316) 

Запрос вставка:

insert into CMP_RULES_ACTIONS (RULE_ID, ACTION_ID, CAMPAIGN_ID, creation_date, LAST_UPDATE_DATE, expiry_date, activation_date, enabled, priority, GROUP_ID, owner) values (?, ?, ?, sysdate, sysdate, to_date(?,'YYYY/MM/DD HH24:MI'), to_date(?,'YYYY/MM/DD HH24:MI'), 1, ?, ?, ?) 

Params являются:

[params:[[freebuy_wv_scomm_bonus_perc_863, 12], [sendgenericbonuslist, 12], [863, 4], [2101/01/31 00:00, 12], [2013/03/21 16:14, 12], [0, 4], [null, 12], [null, 12]]] 

погуглить сообщение об исключении ничего не дает. Я новичок в DB2. Кто-нибудь может мне помочь?

UPDATE

Пример того, как я установил параметры в PreparedStatement:

public void setParamsPreparedStatement(PreparedStatement s, String[][] params) throws Exception { 
    log.debug("Params are: " + Arrays.deepToString(params)); 
    for (int i = 0; i < params.length; i++) { 
     if (params[i][1].equals(ParamTypes.ORA_TYPE_INTEGER)) { 
      if (params[i][0] != null && !params[i][0].trim().equals("")) { 
       s.setInt(i + 1, Integer.parseInt(params[i][0])); 
      } else { 
       s.setNull(i + 1, Types.INTEGER); 
      } 
     } 

... 
} 

РЕШЕНИЕ

Я пытался поставить длинную строку в поле, которое было слишком короткая. Теперь поле длиннее, и мой код преуспевает.

+0

При настройке параметров на 'PreparedStatement', вы используете индексы на основе 1? –

+0

Кроме того, это те столбцы даты 'DATE' или' TIMESTAMP': столбец 'DATE' не имеет временной части, тогда как' TIMESTAMP' делает (и для этого мне нужно использовать 'TO_TIMESTAMP' вместо –

+0

@MarkRotteveel, это было проблема поля, которое было слишком коротким для значения, которое я пытался вставить. –

ответ

1

Проблема заключалась в том, что поле, а именно RULE_ID, было слишком коротким (VARCHAR (30)) для значения, которое я пытался вставить («freebuy_wv_scomm_bonus_perc_863»).

Смежные вопросы