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

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

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

что это значит?

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

9 ответов


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

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


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

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

любые опечатки в вашей инструкции SQL?


используя Simplejdbctemplate Spring, я получил его, когда попытался сделать это:

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 = ?";
    

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

SELECT * FROM EMPLOYE E WHERE E.ID = ?

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

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

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

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


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


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


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

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 что-то вроде:

select col_1 from table_X where col_2 = 'abcd';

я запускаю это внутри моей SQL IDE, и все в порядке.

далее, я пытаюсь построить этот оператор с java:

String queryString= "select col_1 from table_X where col_2 = '?';";
PreparedStatement stmt = con.prepareStatement(queryString);
stmt.setString(1, "abcd"); //raises java.sql.SQLException: Invalid column index

хотя оператор sql (первый, запущенный против базы данных) содержит кавычки вокруг строковых значений, а также заканчивается точкой с запятой, строка, которую я передаю в PreparedStatement, не должна содержать кавычек вокруг подстановочного знака ? не следует заканчивать с полуколонна.

Я просто удалил персонажей, которые появляются на белом фоне

"select col_1 from table_X where col_2 = ' ? ' ; ";

получить

"select col_1 from table_X where col_2 = ?";

(Я нашел решение здесь: https://coderanch.com/t/424689/databases/java-sql-SQLException-Invalid-column)


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

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 фактически представляет столбец no в запросе preparestatement не столбец no в таблице базы данных

надеюсь, это поможет..

  [1]: https://i.stack.imgur.com/vXvMA.png