jdbc - 在 Linux 上使用 JDBC 从 Java 中间层调用 Oracle PL/SQL 存储过程?

标签 jdbc plsql

新手问题...任何人都可以提供高级描述,说明在 PL/SQL 存储过程(驻留在数据库 Linux 服务器中)中需要完成哪些操作才能将数据发送到 Java 程序(在应用程序服务器中) ?

更新 1

elrado 在下面的回答让我前进(谢谢!)。我可以看到 PL/SQL 存储过程只需要将 OUT 参数设置为 REF CURSOR(例如 SYS_REFCURSOR)。然后,调用 Java 例程可以使用如下内容:

import oracle.jdbc.*;
...
// call stored procedure using SQL92 syntax
CallableStatement cs = conn.prepareCall( "{call myStoredProc (?,?,?,?,?)}" );

// set IN parameters
cs.setString(1, in1var);
cs.setString(2, in2var);
cs.setString(3, in3var);

// register OUT parameters
cs.registerOutParameter(4, Types.VARCHAR);
cs.registerOutParameter(5, OracleTypes.CURSOR);

// execute and retrieve Oracle "ref cursor" as a Java "ResultSet"
cs.execute();
rs = (ResultSet) cs.getObject(5);

// process result
while (rs.next()) {
  ...
}

// always retrieve ResultSet before OUT parameters
out1var = cs.getInt(4);

问题 1:上面的内容看起来还行吗?

我在 Oracle 的文档(参见第 4-14 至 4-15 页 http://isu.ifmo.ru/docs/doc112/java.112/e10589.pdf)中看到我应该使用 OracleCallableStatement 而不是 CallableStatement 以便它应该看起来像这样:

// execute and retrieve Oracle "ref cursor" as a Java "ResultSet"
cs.execute();
rs = {(OracleCallableStatement)cs}.getCursor(5);

问题 2:这两种方法都可以吗?如果是这样,使用其中一个的优缺点是什么?

问题 3:我不理解第 4-15 页关于 Oracle 11G 数据库的重要说明:

与过去的版本不同,当 REF CURSOR 在其中具体化的结果集对象关闭时,与 REF CURSOR 关联的游标不会关闭。

这是否意味着当 cs 关闭时 ref cursor 也关闭(与以前的数据库版本相反,后者关闭 ref cursorrs 已关闭)?

最佳答案

如果您想从 Oralce PL/SQL 过程返回结果集,请使用 ref 游标:

http://www.oracle-base.com/articles/misc/UsingRefCursorsToReturnRecordsets.php

Q1:是的,它看起来不错,但我没有测试过。 Q2: 我相信 OracleCallableStatement 只是扩展了 CallableStatement。两者都很好,但只要有可能,我都会使用 Oracle 驱动程序来连接和使用 Oracle 数据库(而不是一些通用驱动程序)。

Q3:我相信你是对的,关闭结果集时光标保持打开状态。(自从我从过程中读取结果集已经有一段时间了,所以我不记得我关闭光标的时间抱歉. 现在我在家,无法访问 Oracle 数据库和我的工作计算机。)

关于jdbc - 在 Linux 上使用 JDBC 从 Java 中间层调用 Oracle PL/SQL 存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549399/

相关文章:

sql - PL/SQL中IF block 的奇数编码风格

java - 编写使用数据库的桌面应用程序。有关如何管理用户对表的访问的建议?

java - 一个 JDBC 连接中可以有两个并发事务吗?

java - 在 Spring 中一起配置 JDBC 和 Hibernate

java - Oracle JDBC 池 SocketException : Connection reset on startup

java - 通过Java调用PL\SQL : Registering out parameter as boolean

oracle - Oracle中的错误 "PLS-00363: expression cannot be used as an assignment target"如何解决?

java - Jdbc方法返回结果不一致

java - 验证请求 - 数据库和 Java 如何存储和处理时区?

sql - 当我想在比较中使用空参数时,应该如何处理 PL/SQL 存储过程中的空参数?