我在测试一些代码时遇到以下错误:
SQLException:列索引无效
究竟是什么意思?
是否有在线文档解释所有Oracle错误代码和语句?
答案 0 :(得分:43)
如果这是Java抛出的SQLException,则很可能是因为您尝试从ResultSet中获取或设置值,但您使用的索引不在该范围内。
例如,您可能尝试从结果集中获取索引3处的列,但是您只从SQL查询中返回了两列。
答案 1 :(得分:10)
听起来你正试图SELECT
一个不存在的专栏。
也许你正试图ORDER BY
一个不存在的专栏?
SQL语句中的任何拼写错误?
答案 2 :(得分:7)
使用Spring的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 = ?";
答案 3 :(得分:5)
我也遇到了这种类型的错误,问题是错误地使用参数来表示,比如说你有这样的查询
SELECT * FROM EMPLOYE E WHERE E.ID = ?
和prepareStatement对象(JDBC),如果你设置像
这样的参数preparedStatement.setXXX(1,value);
preparedStatement.setXXX(2,value)
然后会产生SQLException: Invalid column index
所以,我将第二个参数设置删除到准备好的语句然后解决了问题
答案 4 :(得分:2)
使用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 as enabled”:
<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核心包中的错误......
答案 5 :(得分:1)
我使用准备好的声明遇到了这个问题。我没有添加足够的&#34;?&#34;对于&#34; VALUES&#34;在我添加了适当数量后,我的日食已经崩溃,并且丢失了这些变化。但是,在我开始梳理SQL之前,我并没有想到这是错误,正如p.campbell建议的那样。
答案 6 :(得分:0)
我在一个动态创建预准备语句的遗留应用程序中遇到此问题。
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引起的&#39;内;这扰乱了语法。
答案 7 :(得分:0)
最终的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 =
&#39; ?
&#39; ; ";
获取
"select col_1 from table_X where col_2 = ?";
(我在这里找到了解决方案:https://coderanch.com/t/424689/databases/java-sql-SQLException-Invalid-column)
答案 8 :(得分:0)
试试这个修复吧,因为我遇到了你的错误:
去掉问号周围的单引号,这意味着,如果你使用了像 ('?','?','?') 这样的保留参数,你应该让它看起来像这样:
(?,?,?)
答案 9 :(得分:-1)
我有以下结构的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实际上表示preparestatement查询中的列号而不是数据库表中的列号
希望这有助于......
[1]: https://i.stack.imgur.com/vXvMA.png