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