【问题标题】:Errors when fetching sys cursor from plsql using jdbc使用 jdbc 从 plsql 获取 sys 游标时出错
【发布时间】:2012-06-21 05:06:41
【问题描述】:

我有一个返回 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));
            }

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

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

Non supported SQL92 token at position: 3: cal

【问题讨论】:

  • callablestatement.execute(); 谢谢
  • 看看prepareCall 行。应该是call my_proc 而不是cal my_proc

标签: java stored-procedures jdbc plsql oracle10g


【解决方案1】:

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

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

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

谢谢

【讨论】:

    【解决方案2】:

    您的陈述中有错字:

    {cal my_proc(?,?,?)} 
    

    应该是

    {call my_proc(?,?,?)} 
    

    【讨论】:

    • 当我在 stackoverflow.com 中复制时,这是一个错字。谢谢
    • @Polappan 你确定吗?因为该错字也包含在您问题的错误消息中。
    【解决方案3】:

    请改用theCallableStatement.setObject(

    .setString.setInt

    它还有 theCallableStatement.setNull 为 null

    但保持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).

    【讨论】:

    • -1 没有评论我怎么能学会不犯同样的错误!请张贴原因。
    • 我已经设法通过使用函数而不是过程来解决这个问题。
    • 我不是反对者,但您可以编辑您的回复并解释您所说的“代替”是什么意思。而不是……什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多