新手问题...任何人都可以提供高级描述,说明在 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 cursor
时rs
已关闭)?
最佳答案
如果您想从 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/