Java 使用jdbc从plsql获取sys游标时出错

Java 使用jdbc从plsql获取sys游标时出错,java,stored-procedures,jdbc,plsql,oracle10g,Java,Stored Procedures,Jdbc,Plsql,Oracle10g,我有一个返回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 =

我有一个返回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;
    /
java代码

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


使用CallableStatement.setObject(代替 的

.setString
.setInt

它还有callablestatement.setNull
表示null

但是保持
registerOutParameter
相同

方法说明

使用给定对象设置指定参数的值 第二个参数必须是Object类型;因此,java.lang 内置类型应使用等效对象 规范指定了从Java对象类型到 SQL类型。给定的参数将转换为相应的 SQL类型。请注意,此方法可能会 用于通过使用 特定于驱动程序的Java类型。如果对象是实现 接口SQLData时,JDBC驱动程序应调用该方法 SQLData.writeSQL将其写入SQL数据流。如果 另一方面,对象属于实现Ref、Blob、Clob、NClob、, 结构、java.net.URL或数组,驱动程序应将其传递给 数据库作为相应SQL类型的值。此方法引发 如果存在歧义,例如,如果对象为 实现上述多个接口的类的。 注意:并非所有数据库都允许向 为了最大的可移植性,setNull或setObject(字符串 应使用parameterName、Object x、int sqlType)方法,而不是 setObject(字符串参数名称,对象x)


使用CallableStatement.setObject(
代替 的

.setString
.setInt

它还有callablestatement.setNull
表示null

但是保持
registerOutParameter
相同

方法说明

使用给定对象设置指定参数的值 第二个参数必须是Object类型;因此,java.lang 内置类型应使用等效对象 规范指定了从Java对象类型到 SQL类型。给定的参数将转换为相应的 SQL类型。请注意,此方法可能会 用于通过使用 特定于驱动程序的Java类型。如果对象是实现 接口SQLData时,JDBC驱动程序应调用该方法 SQLData.writeSQL将其写入SQL数据流。如果 另一方面,对象属于实现Ref、Blob、Clob、NClob、, 结构、java.net.URL或数组,驱动程序应将其传递给 数据库作为相应SQL类型的值。此方法引发 如果存在歧义,例如,如果对象为 实现上述多个接口的类的。 注意:并非所有数据库都允许向 为了最大的可移植性,setNull或setObject(字符串 应使用parameterName、Object x、int sqlType)方法,而不是 setObject(字符串参数名称,对象x)


您的声明中有一个拼写错误:

{cal my_proc(?,?,?)} 
应该是

{call my_proc(?,?,?)} 

您的声明中有一个拼写错误:

{cal my_proc(?,?,?)} 
应该是

{call my_proc(?,?,?)} 

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

我用下面的方式调用了我的函数

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

谢谢

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

我用下面的方式调用了我的函数

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

感谢
callablestatement.execute();
感谢查看
prepareCall
行。那应该是
call my_proc
而不是
callablestatement.execute()
谢谢看一看
prepareCall
行。那应该是
调用my_proc
而不是
cal my_proc
?-1没有任何评论,我如何才能学会不犯同样的错误!!!请发布原因。我已经通过使用函数而不是过程来解决问题。我不是下一个投票人,但你可以编辑你你的回答并解释你所说的“代替”是什么意思。而不是…什么?-1没有评论我如何才能学会不犯同样的错误!!!请发布原因。我已经通过使用函数而不是过程来解决问题。我不是投票人,但你可以编辑你的回答并解释你所说的“代替”是什么意思。而不是…什么?我在stackoverflow.com上复制的时候是个打字错误。Thanks@Polappan你确定吗?因为你的问题中的错误信息中也包含了这个输入错误。当我在stackoverflow.com复制时,这是一个输入错误。Thanks@Polappan你确定吗?因为你的问题中的错误信息中也包含了打字错误。