【发布时间】:2012-03-21 21:45:43
【问题描述】:
新手问题...任何人都可以提供关于在 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 数据库的 Important 注释:
Unlike in past releases, the cursor associated with a REF CURSOR is not closed when the result set object in which the REF CURSOR was materialized is closed.
这是否意味着ref cursor 在cs 关闭时关闭(与之前的数据库版本相反,在rs 关闭时ref cursor 关闭)?
【问题讨论】: