Java JDBC CallableStatement和Oracle SYS_REFCURSOR在参数中?

Java JDBC CallableStatement和Oracle SYS_REFCURSOR在参数中?,java,oracle,jdbc,cursor,Java,Oracle,Jdbc,Cursor,就像标题里说的,这到底是怎么回事 基本上我需要传递一个空值?将游标作为存储过程的IN参数引用 /** spring's PreparedStatementSetter#setValues(...) */ public void setValues(PreparedStatement ps) throws SQLException { CallableStatement cs = (CallableStatement) ps; cs.setString(1,"constant");

就像标题里说的,这到底是怎么回事

基本上我需要传递一个空值?将游标作为存储过程的IN参数引用

/** spring's PreparedStatementSetter#setValues(...) */
public void setValues(PreparedStatement ps) throws SQLException {
    CallableStatement cs = (CallableStatement) ps;
    cs.setString(1,"constant");
    //this is the IN param
    cs.setNull(2, OracleTypes.CURSOR);
    //this is the OUT param
    cs.registerOutParameter(3, OracleTypes.CURSOR);
}
这在以下情况下失败:

caused by: java.sql.SQLException: Unsupported feature: sqlType=-10
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    at oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4399)
    at oracle.jdbc.driver.OraclePreparedStatement.setNullInternal(OraclePreparedStatement.java:4161)
    at oracle.jdbc.driver.OracleCallableStatement.setNull(OracleCallableStatement.java:4472)

我在这里不知所措,尝试了几种不同的方法来实现这一点,但我找不到任何关于这一点的示例,也不知道如何正确地实现这一点。

我的java有点生锈,但您应该能够在PL/SQL块中初始化REF CURSOR变量:

String statement = "DECLARE\n" +
                       "l_cursor SYS_REFCURSOR;\n" +
                   "BEGIN\n" +
                       "your_procedure(?, l_cursor, ?);\n" +
                   "END;"
CallableStatement cs = yourConnection.prepareCall(statement);
// bind first and last parameter
cs.setString(1,"constant");
cs.registerOutParameter(2, OracleTypes.CURSOR);

我的java有点生疏,但您应该能够在PL/SQL块中初始化REF CURSOR变量:

String statement = "DECLARE\n" +
                       "l_cursor SYS_REFCURSOR;\n" +
                   "BEGIN\n" +
                       "your_procedure(?, l_cursor, ?);\n" +
                   "END;"
CallableStatement cs = yourConnection.prepareCall(statement);
// bind first and last parameter
cs.setString(1,"constant");
cs.registerOutParameter(2, OracleTypes.CURSOR);

这种方法的问题是,我使用Spring批处理和StoredProcedureItemReader,我只为其提供一个字符串参数(即过程名称)和一个创建CallableStatement的SqlParameter对象列表,请参见:,因此,除非sring核心jdbc功能中存在特殊内容,我将仅限于直接使用CallableStatement引用来设置parameters@deebo:在这种情况下,您可以创建一个PL/SQL过程包装器,该包装器只接受这两个参数,并使用空参数调用存储过程。问题的根源是Oracle JDBC驱动程序,其中我有一个版本不支持参数中的游标。我升级了驱动程序,一切都开始神奇地工作。这种方法的问题是,我使用了Spring批处理和StoredProcedureItemReader,为此我只给出了一个字符串参数(即过程名称)和一个创建CallableStatement的SqlParameter对象列表,请参见:,因此,除非sring核心jdbc功能中存在特殊的东西,否则我将仅限于直接使用CallableStatement引用来设置parameters@deebo:那样的话,您可以创建一个PL/SQL过程包装器,该包装器只接受这两个参数,并使用空参数调用存储过程。问题的根源是Oracle JDBC驱动程序,我有一个版本不支持参数中的游标。我升级了驱动程序,一切都开始神奇地运转起来。