java.sql.SQLSyntaxErrorException:ORA-01722:refcursor上的resultSet.next()无效数字,我不明白为什么?

时间:2015-07-07 14:32:52

标签: java jdbc oracle11g ojdbc

我有一个问题吃了好几个小时,我无法找到它发生的确切原因? 我使用ResultSet.next()迭代存储过程的refcursor out参数时得到 java.sql.SQLSyntaxErrorException:ORA-01722:无效数。 困扰我的是,即使实际上没有结果可以迭代,也会发生这种情况。

存储过程的签名:

PROCEDURE GET_PROG_SRCH_BY_CRITERIA
       (p_orgID                  IN    NUMBER,
        p_MEPID                  IN    NUMBER,
        p_prog_prg_id            IN    NUMBER,
        p_pcom_enrol_date        IN    VARCHAR2,
        p_pcom_enrol_year_from   IN    VARCHAR2,
        p_pcom_enrol_year_to     IN    VARCHAR2,
        p_pcom_non_prtcm_date    IN    VARCHAR2,
        p_pcom_completion_date   IN    VARCHAR2,
        p_pcom_status_code       IN    VARCHAR2,        
        p_sys_cursor             OUT   SYS_REFCURSOR
       );

Java code snippet:

statement = connection.prepareCall("call PROG_TOOLS.GET_PROG_SRCH_BY_CRITERIA(?,?,?,?,?,?,?,?,?,?)");
statement.setLong(1, searchCriteria.getOrganizationID());
/*
 * Code to Set other 8 Parameters comes here
 */
statement.registerOutParameter(10, oracle.jdbc.OracleTypes.CURSOR);
statement.executeQuery();
resultSet = (ResultSet) statement.getObject(10);
/*
 * Code to Initialize necessary value Objects comes here
 */
while (resultSet.next()) {
    /*
     * Code to get values from resultSet using column named index
     * and initialize value objects
     * Few example:
     */
     dataVO = new DataVO();
     dataVO.setPcomID(result.getLong("PCOM_ID"));
     dataVO.setPersonID(result.getLong("PERSON_ID"));
     .
     .
     programList.add(dataVO);
}

问题: 如果我通过在第3个参数中发送NULL来调用GET_PROG_SRCH_BY_CRITERIA,我得到预期的结果。 如果我通过在第3个参数中发送实际值来调用GET_PROG_SRCH_BY_CRITERIA,那么我会在行上获得 java.sql.SQLSyntaxErrorException:ORA-01722:无效数字

  

while(resultSet.next()){

异常追踪:

java.sql.SQLSyntaxErrorException: ORA-01722: invalid number
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1030)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:183)
    at oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:1000)
    at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:314)
    at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:228)
    at weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.next(Unknown Source)
    at org.app.ejb.program.dao.ProgDAO.searchProgEnrollees(ProgDAO.java:136)

我通过使用SQLDeveloper工具直接测试它来检查程序,方法是发送上述Java代码使用的相同参数。它工作得很好。

我尝试过使用OJDBC14和OJDBC6驱动程序,但没有运气。

我不知道为什么会在resultSet.next()上发生这种情况。如果第3个参数为null,那么我不会得到此异常,并且流程按预期工作。

非常感谢任何帮助。

使用的技术:   - Java 6,ejb   - Oracle 11g数据库R2(11.2.0.3)   - Oracle Weblogic 10g(10.3.0)

1 个答案:

答案 0 :(得分:0)

也许您需要先在包含ResultSet上调用next()?

statement.registerOutParameter(10, oracle.jdbc.OracleTypes.CURSOR);
ResultSet rs1 = statement.executeQuery();
rs1.next();
resultSet = (ResultSet) statement.getObject(10);