【问题标题】:Retrieving Oracle Cursor with JDBC使用 JDBC 检索 Oracle 游标
【发布时间】:2011-02-24 08:15:35
【问题描述】:

我在尝试使一个简单的 Oracle 游标检索过程与 JDBC 一起工作时遇到了一些挫折。

我不断收到错误消息“[Oracle][ODBC][Ora]ORA-06553: PLS-306: wrong number or types of arguments in call to 'GETNAME'”,但我不知道我是什么做错了。

这是我的 Java 代码:

CallableStatement stmt = connection.prepareCall("call getName(?)");
stmt.registerOutParameter(1, OracleTypes.CURSOR);
stmt.execute();

stmt.close();
con.close();

这是我在 Oracle 中的程序:

CREATE OR REPLACE PROCEDURE getName(cur out SYS_REFCURSOR)
IS
BEGIN
    OPEN cur FOR
        SELECT name FROM customer;
END;

错误发生在stmt.execute()。

提前致谢。

顺便说一句,我正在使用 Oracle 10.2.0。

【问题讨论】:

  • 你用什么 JDBC jar 文件编译和执行?

标签: oracle jdbc plsql ora-06553


【解决方案1】:

我尝试了基本相同的方法,它对我有用。唯一的区别是我使用的 Oracle JDBC 库没有方法registerOutputParameter;我改用registerOutParameter。也许您调用的是通用 JDBC 方法,而不是支持 Oracle 类型的特定于 Oracle 的方法。

我能想到的唯一其他解释是您的 Java 代码连接到错误的架构,并访问了不同的 getName 对象。

【讨论】:

  • 对不起,我打错了方法名。是否有任何 Oracle 设置或非代码相关问题可能导致此错误?
  • 原来游标在 JDBC Oracle 瘦客户端上运行良好,但在 ODBC 上不行。不确定原因,因为我确实为 ODBC 启用了结果集。
【解决方案2】:

不,这是错误的。您不应该返回原始游标。您应该调用存储的过程并遍历 ResultSet。

【讨论】:

  • 取决于数据库...例如,SQL Server 和 Sybase 可以从存储过程中返回结果集——但在 Oracle 中,您需要返回游标。
  • 不,我在 两年前 谈论的是从持久层返回原始游标或 ResultSet。您应该对其进行迭代,将内容加载到某种数据结构、对象或集合中,然后关闭游标或 ResultSet。这样您就不会出现内存泄漏或最大游标数。我想你误会了。您可能需要重新考虑您的反对票。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2012-10-29
  • 2018-01-09
  • 1970-01-01
  • 2016-08-11
相关资源
最近更新 更多