Неверный индекс столбца в readyStatement

1

Я пытаюсь вставить значение в таблицу 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, но он жалуется, что эти индексы отсутствуют, я тоже пробовал другие вещи, но я не могу заставить это работать.

Что я делаю не так?

  • 0
    Вы готовите 32 значения, но у вас есть 27? Я не знаю, это то, как работают подготовленные заявления Java
  • 0
    Их 28, если я правильно посчитал. Кроме того, установка различных идентификаторов базы данных с использованием (предположительно) псевдослучайных чисел вызывает большие сомнения.
Показать ещё 2 комментария
Теги:
jdbc
prepared-statement

3 ответа

1
Лучший ответ

В этой инструкции вставки имеется 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.

  • 0
    Можете ли вы объяснить, что такое sysdate, пожалуйста? так что я могу полностью понять ваш ответ, чтобы проголосовать за
  • 0
    Я думаю, это системная дата?
Показать ещё 3 комментария
2

Удалить

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.... и т.д.

  • 0
    этот ответ был помечен как некачественный ответ. пожалуйста, отправьте некоторые объяснения на ваш пост.
  • 0
    после этого я продолжаю получать ORA-00932: несовместимые типы данных: ожидаемый DATE получил NUMBER
Показать ещё 1 комментарий
0

Ваш запрос 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню