【问题标题】:What does the following Oracle error mean: invalid column index以下Oracle错误是什么意思:无效的列索引
【发布时间】:2021-10-29 14:34:29
【问题描述】:

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

SQLException: 无效的列索引

这到底是什么意思?

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

【问题讨论】:

  • 您能否编辑您的问题以包含该错误引发的确切 SQL 语句?也许包括确切的错误详细信息以及 ORA 编号?
  • 请求中的参数声明不正确。符号错误。
  • 有时你也做 select * from foo_table;这也会导致同样的错误

标签: java sql oracle


【解决方案1】:

听起来您正在尝试SELECT 一个不存在的列。

也许您正在尝试ORDER BY 一个不存在的列?

您的 SQL 语句中是否有拼写错误?

【讨论】:

    【解决方案2】:

    如果这是 Java 抛出的 SQLException,很可能是因为您试图从 ResultSet 获取或设置值,但您使用的索引不在范围内。

    例如,您可能试图从结果集中获取索引 3 处的列,但 SQL 查询只返回了两列。

    【讨论】:

    • 就我而言,我使用的是 JayDeBeApi(python 中的 Java 包装器),并将查询参数作为顺序参数而不是单个元组传递。它应该是cursor.execute(query, (arg1, arg2)),而不是cursor.execute(query, arg1, arg2)。 pyodbc 库允许任何一种形式,我已经习惯了后者,但 DB API 只指定了前者,所以从现在开始我将使用它来确保跨库实现的一致性。
    【解决方案3】:

    使用 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 = ?";
      

    【讨论】:

    • 对我来说就是这样。 JdbcTemplate 可以为该异常提供更好的消息。
    【解决方案4】:

    我在使用 Spring Security 3.1.0 时遇到了完全相同的问题。和甲骨文 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】:

      我在使用准备好的语句时遇到了这个问题。我没有添加足够的“?”对于“值”,在我添加了适当的数量后,我的 Eclipse 崩溃了,并且丢失了这些更改。但是直到我按照 p.campbell 的建议开始梳理 SQL 之前,我并没有想到这是错误。

      【讨论】:

        【解决方案6】:

        我也遇到了这种类型的错误,问题是语句中参数的使用错误,假设你有这样的查询

        SELECT * FROM EMPLOYE E WHERE E.ID = ?
        

        对于preparedStatement 对象(JDBC),如果你设置了类似的参数

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

        然后它会导致SQLException: Invalid column index

        所以,我将第二个参数设置删除到准备好的语句中,然后问题就解决了

        【讨论】:

          【解决方案7】:

          我在一个动态创建预准备语句的旧应用程序中遇到了这个问题。

          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有'within;扰乱语法。

          【讨论】:

            【解决方案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】:

              试试这个修复,因为我遇到了你的错误:

              去掉问号周围的单引号,这意味着,如果你使用了保留参数,如 ('?','?','?'),你应该让它看起来像这样:

              (?,?,?)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-09-01
                • 1970-01-01
                相关资源
                最近更新 更多