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

#java #sql #oracle

#java #sql #Oracle

Вопрос:

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

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

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

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

Комментарии:

1. Можете ли вы отредактировать свой вопрос, чтобы включить точную инструкцию SQL, вызванную этой ошибкой? Возможно, включите точные сведения об ошибке вместе с номером ORA?

2. Сообщения об ошибках Oracle: download.oracle.com/docs/cd/E11882_01/server.112/e17766/toc.htm

3. Неправильно объявленные параметры в запросе. Неправильные обозначения.

4. иногда вы также выполняете select * из foo_table ; это также приводит к той же ошибке

Ответ №1:

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

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

Комментарии:

1. В моем случае я использовал JayDeBeApi (Java-оболочку в python) и передавал параметры запроса в виде последовательных аргументов вместо одного кортежа. Это должно быть cursor.execute(query, (arg1, arg2)) , а не cursor.execute(query, arg1, arg2) . Библиотека pyodbc допускает любую форму, и я привык к последней, но DB API указывает только первую, так что с этого момента я буду использовать именно ее для обеспечения согласованности во всех реализациях библиотеки.

2. В моем случае у меня был MyBatis mapper с ${columnName} вместо #{columnName}

Ответ №2:

Звучит так, как будто вы пытаетесь SELECT использовать столбец, который не существует.

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

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

Ответ №3:

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

Комментарии:

1. Это было так для меня. У JdbcTemplate могло бы быть лучшее сообщение для этого исключения.

Ответ №4:

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

 SELECT * FROM EMPLOYE E WHERE E.ID = ?
  

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

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

затем это приводит к SQLException: Invalid column index

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

Ответ №5:

Просто попробуйте это исправить, поскольку я столкнулся с вашей ошибкой:

Удалите одинарные кавычки вокруг вашего вопросительного знака, что означает, что если вы использовали зарезервированные параметры, такие как (‘?’,’?’,’?’) вы должны сделать так, чтобы это выглядело следующим образом:

 (?,?,?)
  

Ответ №6:

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

Ответ №7:

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

Ответ №8:

окончательный оператор 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 )

Ответ №9:

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

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