Подтвердить что ты не робот

Что означает следующая ошибка Oracle: недопустимый индекс столбца

При тестировании кода я получил следующую ошибку:

SQLException: недопустимый индекс столбца

Что именно это означает?

Есть ли онлайн-документ, объясняющий, что все коды ошибок Oracle и заявления?

4b9b3361

Ответ 1

Если это SQLException, брошенное Java, это, скорее всего, потому, что вы пытаетесь получить или установить значение из ResultSet, но используемый вами индекс не находится в пределах диапазона.

Например, вы можете попытаться получить столбец из индекса 3 из набора результатов, но из SQL-запроса вы получите только два столбца.

Ответ 2

Похоже, вы пытаетесь SELECT столбца, который не существует.

Возможно, вы пытаетесь ORDER BY столбца, который не существует?

Любые опечатки в вашем заявлении SQL?

Ответ 3

Используя 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 = ?";
    

Ответ 4

У меня была такая же проблема при использовании 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...

Ответ 5

Я также получил эту ошибку типа, проблема в неправильном использовании параметров для оператора вроде: пусть говорят, что у вас есть такой запрос

SELECT * FROM EMPLOYE E WHERE E.ID = ?

и для объекта readyStatement (JDBC), если вы задаете такие параметры, как

preparedStatement.setXXX(1,value);
preparedStatement.setXXX(2,value)

то это приводит к SQLException: Invalid column index

Итак, я удалил эту вторую настройку параметра для подготовленного оператора, а затем решил проблему

Ответ 6

У меня была эта проблема, используя подготовленный оператор. Я не добавил достаточно "?" для "VALUES" мое затмение разбилось после того, как я добавил нужную сумму и потерял эти изменения. Но мне не приходило в голову быть ошибкой, пока я не начал расчесывать SQL, как предлагал p.campbell.

Ответ 7

У меня была эта проблема в одном устаревшем приложении, которое динамически создает подготовленный оператор.

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, имеющим "внутри"; которые нарушают синтаксис.

Ответ 8

У меня есть таблица оракула с ниже структуры

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