Что означает следующая ошибка Oracle: неверный индекс столбца - PullRequest
32 голосов
/ 11 мая 2011

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

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

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

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

Ответы [ 9 ]

47 голосов
/ 12 мая 2011

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

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

10 голосов
/ 11 мая 2011

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

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

Есть ли опечатки в вашем операторе SQL?

7 голосов
/ 10 февраля 2012

С помощью SpringJ 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 = ?";
    
5 голосов
/ 23 сентября 2015

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

SELECT * FROM EMPLOYE E WHERE E.ID = ?

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

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

тогда получается SQLException: Invalid column index

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

2 голосов
/ 18 апреля 2012

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

1 голос
/ 05 марта 2015

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

0 голосов
/ 05 января 2018

последний 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)

0 голосов
/ 15 ноября 2017

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

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
0 голосов
/ 18 декабря 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...