Я пытаюсь вставить значение в таблицу DB, и я продолжаю спотыкаться об ошибке индекса недопустимого столбца.
Здесь пример кода:
String insertNewAlarmStat =
"insert into alarmes (id_alarm, alarm_key, id_notif, sever, urgency, date_hour_start, date_hour_modif, date_hour_end, " +
"state, state_rec, date_hour_rec, id_user_rec, id_system_rec, " +
"type, cause, " +
"num_events, id_entity_g, type_entity_g, " +
"desc_entity_g, problem, " +
"time_urg_act, max_urg_act, time_end, time_arq, lim, rec_oblig, dn, num_events_ps, id_alarm_o, id_notif_o, text_ad, domain, date_hour_reg) " +
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE, SYSDATE, SYSDATE, SYSDATE, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
PreparedStatement prpstmt = null ;
try {
prpstmt = conn.prepareStatement(insertNewAlarmStat);
prpstmt.setInt(1, randomNumberGenerator());
prpstmt.setString(2, UUID.randomUUID().toString());
prpstmt.setString(3, UUID.randomUUID().toString());
prpstmt.setInt(4, randomNumberGenerator());
prpstmt.setInt(5, 8);
prpstmt.setInt(6, 8524);
prpstmt.setString(7, UUID.randomUUID().toString());
prpstmt.setString(8, UUID.randomUUID().toString());
prpstmt.setString(9, UUID.randomUUID().toString());
prpstmt.setString(10, UUID.randomUUID().toString());
prpstmt.setString(11, "KABOOM");
prpstmt.setInt(12, 8);
prpstmt.setDate(13, getCurrentDate());
prpstmt.setDate(14, getCurrentDate());
prpstmt.setDate(15, getCurrentDate());
prpstmt.setDate(16, getCurrentDate());
prpstmt.setInt(17, 43);
prpstmt.setString(18, UUID.randomUUID().toString());
prpstmt.setString(19, UUID.randomUUID().toString());
prpstmt.setString(20, UUID.randomUUID().toString());
prpstmt.setString(21, UUID.randomUUID().toString());
prpstmt.setInt(22, 2);
prpstmt.setInt(23, 224);
prpstmt.setInt(24, 2);
prpstmt.setInt(25, 224);
prpstmt.setInt(26, 2);
prpstmt.setInt(27, 4);
prpstmt.setInt(28, 2);
prpstmt.setString(29, null);
prpstmt.setString(30, UUID.randomUUID().toString());
prpstmt.setString(31, UUID.randomUUID().toString());
prpstmt.setInt(32, 2);
prpstmt.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Я попытался удалить prpstmt
с 13 до 16, но он жалуется, что эти индексы отсутствуют, я тоже пробовал другие вещи, но я не могу заставить это работать.
Что я делаю не так?
В этой инструкции вставки имеется 33 столбца. Есть 33 значения - 28 ?
держателей мест и 5 буквальных значений (sysdate
). Индексы в методах setXYZ
относятся к индексу ?
заполнители, а не индекс в значениях инструкции insert.
Для значений sysdate
вам не нужно ничего делать, поэтому удалите эти вызовы в setDate
. Но для значений за первые 4 sysdate
s вам просто нужно использовать следующее значение, которое равно 13
, а не 17
.
prpstmt.setInt(1, randomNumberGenerator());
// snip
prpstmt.setInt(12, 8);
// calls to 'setDate(13-16, getCurrentDate());' removed
prpstmt.setInt(13, 43); // changed 17 to 13
// snip
prpstmt.setInt(28, 2); // changed 32 to 28
Что такое sysdate
?
sysdate
- это функция Oracle, которая возвращает текущую date/timestamp
sysdate
date/timestamp
, эквивалентную Calendar.getInstance()
в Java. Для целей JDBC
это значение, которое уже представлено в инструкции insert.
Удалить
prpstmt.setDate(13, getCurrentDate());
prpstmt.setDate(14, getCurrentDate());
prpstmt.setDate(15, getCurrentDate());
prpstmt.setDate(16, getCurrentDate());
и вместо 17, начните с 13 снова..
?,?,?,?,?,?,?,?,?,?,?,?,?, SYSDATE, SYSDATE, SYSDATE, SYSDATE,?,?,?,?,?,?,?,?,?,?,??,?,?,?,?,?,?, SYSDATE
1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12, SYSDATE, SYSDATE, SYSDATE, SYSDATE, 13,14.... и т.д.
Ваш запрос String
содержит 28 вопросительных знаков, я написал программу для подсчета для вас
String str = "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE, SYSDATE, SYSDATE, "
+ "SYSDATE, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
int count = 0;
for (char ch : str.toCharArray()) {
if (ch == '?') {
count++;
}
}
System.out.println(count);
Таким образом, вы не можете связать 32 параметра. Я думаю, что ваш
prpstmt.setDate(13, getCurrentDate());
prpstmt.setDate(14, getCurrentDate());
prpstmt.setDate(15, getCurrentDate());
prpstmt.setDate(16, getCurrentDate());
В запросе жестко закодированы SYSDATE
. Итак, удалите четыре SYSDATE
(s) в середине запроса
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
+ "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
И вам будет 32.