1

我有一个返回 sys_refcursor 的存储过程,我正在尝试使用 JDBC 从 java 中获取游标。

plsql存储过程

 create or replace procedure my_proc(p_deptno IN number,p_emp_no IN varchar2
    , p_cursor OUT SYS_REFCURSOR)
    is
    begin
    open p_cursor FOR
    select *
    from emp
    where deptno = p_deptno and emp_number=p_emp_no;
    end proc;
    /

爪哇代码

callablestatement = connection.prepareCall("{cal my_proc(?,?,?)} ");
callablestatement.setInt(1, param1);
callablestatement.setString(2, param2);
callablestatement.registerOutParameter(3, OracleTypes.CURSOR);
callablestatement.execute();
resultSet = ((OracleCallableStatement)callablestatement).getCursor(4);
            while (resultSet.next()) {
                <classname> = mapList(resultSet);
                logger.info(resultSet.getString(1));
            }

当我执行上述操作时,我收到以下异常

java.lang.NullPointerException at callablestatement.execute();

Non supported SQL92 token at position: 3: cal
4

3 回答 3

1

您的陈述中有错字:

{cal my_proc(?,?,?)} 

应该

{call my_proc(?,?,?)} 
于 2012-06-23T09:44:56.227 回答
0

使用theCallableStatement.setObject( 代替

.setString等等.setInt_

它也theCallableStatement.setNull为空

但保持registerOutParameter不变

方法描述

使用给定对象设置指定参数的值。第二个参数必须是 Object 类型;因此,java.lang 等效对象应该用于内置类型。JDBC 规范指定了从 Java 对象类型到 SQL 类型的标准映射。给定的参数将在发送到数据库之前转换为相应的 SQL 类型。请注意,此方法可用于通过使用特定于驱动程序的 Java 类型来传递特定于数据库的抽象数据类型。如果对象是实现接口 SQLData 的类,则 JDBC 驱动程序应调用方法 SQLData.writeSQL 将其写入 SQL 数据流。另一方面,如果对象属于实现 Ref、Blob、Clob、NClob、Struct、java.net.URL 或 Array 的类,驱动程序应将其作为相应 SQL 类型的值传递给数据库。如果存在歧义,例如,如果对象属于实现多个上述接口的类,则此方法将引发异常。注意:并非所有数据库都允许将非类型 Null 发送到后端。为了获得最大的可移植性,应该使用 setNull 或 setObject(String parameterName, Object x, int sqlType) 方法来代替 setObject(String parameterName, Object x)。

于 2012-06-19T07:51:03.507 回答
0

我已经通过使用与程序中代码相同的函数解决了这个问题,它解决了我的问题。

我使用以下方式调用了我的函数。

private final String FUNCTIONAME= "begin ? :=myfunc(?,?,?); end;"";

谢谢

于 2012-06-26T06:49:12.237 回答