以下Oracle错误意味着什么:无效的列索引

时间:2011-05-11 18:46:08

标签: java sql oracle

我在测试一些代码时遇到以下错误:

  

SQLException:列索引无效

究竟是什么意思?

是否有在线文档解释所有Oracle错误代码和语句?

10 个答案:

答案 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