gpt4 book ai didi

refcursor 上的 java.sql.SQLSyntaxErrorException : ORA-01722: invalid number while resultSet. next() 我不明白为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:36 25 4
gpt4 key购买 nike

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

存储过程的签名:

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 代码片段:

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);
}

问题:如果我通过在第三个参数中发送 NULL 来调用 GET_PROG_SRCH_BY_CRITERIA,我会得到预期的结果。如果我通过在第三个参数中发送实际值来调用 GET_PROG_SRCH_BY_CRITERIA,则会在行上收到 java.sql.SQLSyntaxErrorException: ORA-01722: invalid number

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() 上会发生这种情况。如果第三个参数为空,那么我不会收到此异常,并且流程按预期工作。

非常感谢这里的任何帮助。

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

最佳答案

也许您需要先对包含的 ResultSet 调用 next() ?

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

关于refcursor 上的 java.sql.SQLSyntaxErrorException : ORA-01722: invalid number while resultSet. next() 我不明白为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31271586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com