Что означает следующая ошибка 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