При тестировании кода я получил следующую ошибку:
SQLException: недопустимый индекс столбца
Что именно это означает?
Есть ли онлайн-документ, объясняющий, что все коды ошибок Oracle и заявления?
При тестировании кода я получил следующую ошибку:
SQLException: недопустимый индекс столбца
Что именно это означает?
Есть ли онлайн-документ, объясняющий, что все коды ошибок Oracle и заявления?
Если это SQLException, брошенное Java, это, скорее всего, потому, что вы пытаетесь получить или установить значение из ResultSet, но используемый вами индекс не находится в пределах диапазона.
Например, вы можете попытаться получить столбец из индекса 3 из набора результатов, но из SQL-запроса вы получите только два столбца.
Похоже, вы пытаетесь SELECT
столбца, который не существует.
Возможно, вы пытаетесь ORDER BY
столбца, который не существует?
Любые опечатки в вашем заявлении SQL?
Используя Spring SimpleJdbcTemplate, я получил его, когда попытался сделать это:
String sqlString = "select pwy_code from approver where university_id = '123'";
List<Map<String, Object>> rows = getSimpleJdbcTemplate().queryForList(sqlString, uniId);
У меня был аргумент queryForList, который не соответствовал знаку вопроса в SQL. Первая строка должна была быть:
String sqlString = "select pwy_code from approver where university_id = ?";
У меня была такая же проблема при использовании Spring Security 3.1.0. и Oracle 11G. Я использовал следующий запрос и получил недопустимую ошибку индекса столбца:
<security:jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT A.user_name AS username, A.password AS password FROM MB_REG_USER A where A.user_name=lower(?)"
Оказывается, мне нужно было добавить: "1 как разрешено" к запросу:
<security:jdbc-user-service data-source-ref="dataSource" users-by-username query="SELECT A.user_name AS username, A.password AS password, 1 as enabled FROM MB_REG_USER A where A.user_name=lower(?)"
После этого все работало. Я считаю, что это может быть ошибкой в базовом пакете Spring JDBC...
Я также получил эту ошибку типа, проблема в неправильном использовании параметров для оператора вроде: пусть говорят, что у вас есть такой запрос
SELECT * FROM EMPLOYE E WHERE E.ID = ?
и для объекта readyStatement (JDBC), если вы задаете такие параметры, как
preparedStatement.setXXX(1,value);
preparedStatement.setXXX(2,value)
то это приводит к SQLException: Invalid column index
Итак, я удалил эту вторую настройку параметра для подготовленного оператора, а затем решил проблему
У меня была эта проблема, используя подготовленный оператор. Я не добавил достаточно "?" для "VALUES" мое затмение разбилось после того, как я добавил нужную сумму и потерял эти изменения. Но мне не приходило в голову быть ошибкой, пока я не начал расчесывать SQL, как предлагал p.campbell.
У меня была эта проблема в одном устаревшем приложении, которое динамически создает подготовленный оператор.
String firstName;
StringBuilder query =new StringBuilder("select id, name from employee where country_Code=1");
query.append("and name like '");
query.append(firstName + "' ");
query.append("and ssn=?");
PreparedStatement preparedStatement =new prepareStatement(query.toString());
когда он пытается установить значение для ssn, он выдавал неверную ошибку индекса столбца и, наконец, обнаружил, что он вызван firstName, имеющим "внутри"; которые нарушают синтаксис.
У меня есть таблица оракула с ниже структуры
SQL> desc demo
Name Null? Type
----------------------------------------- -------- ------------
ID NUMBER(38)
NAME VARCHAR2(20)
SALARY NUMBER(6)
****************************
Я пытался вставить значения ниже кода и получил ошибку
****************************
PreparedStatement stmt=con.prepareStatement("update demo set salary=? where id=?" );
stmt.setInt(3,288800);
stmt.setInt(1,8);
************************
SQLException: недопустимый индекс столбца
Правильный код
************************
PreparedStatement stmt=con.prepareStatement("update demo set salary=? where id=?" );
stmt.setInt(1,288800);
stmt.setInt(2,8);
*******************
stmt.setInt(1,288800);//1 represents salary i.e first '?'
stmt.setInt(2,8);//2 represents id i.e second '?'
Здесь 1 фактически представляет столбец нет в запросе на подготовку не столбцы нет в таблице базы данных
Надеюсь, что это поможет...
[1]: https://i.stack.imgur.com/vXvMA.png