如何从 Java 中的 oracle SP 返回 sys_refcursor?

Posted

技术标签:

【中文标题】如何从 Java 中的 oracle SP 返回 sys_refcursor?【英文标题】:How do I return a sys_refcursor from oracle SP in java? 【发布时间】:2012-06-25 21:33:11 【问题描述】:

我在 oracle 中有一个存储过程 (SP):

CREATE OR REPLACE 
PROCEDURE "SP_SEL_LOGIN_INFO" (
p_username IN varchar2,
p_ResultSet OUT sys_refcursor
) AS

begin

OPEN p_ResultSet FOR
SELECT * FROM user_accounts
WHERE p_username = username;

end;

在我的 java 类中,我有以下代码行来调用 SP:

currentCon = connectionpackage.ConnectionManager.getConnection(dbSource);
CallableStatement stmt = currentCon.prepareCall("call SP_SEL_LOGIN_INFO(?, ?)");
stmt.setString(1, username); 
stmt.registerOutParameter(2, OracleTypes.CURSOR); //REF CURSOR
stmt.execute();
rs = stmt.getCursor(2);

这就是我在网上找到的调用 SP 并返回游标的方法。当我尝试编译时,出现以下两个错误:

error: cannot find symbol stmt.registerOutParameter(2, OracleTypes.CURSOR); AND error: cannot find symbol rs = stmt.getCursor(2); 哪里说找不到 OracleTypes 和 getCursor。

我尝试导入import oracle.jdbc.driver.*;import oracle.jdbc.*; 并分别得到错误error: package oracle.jdbc does not exist import oracle.jdbc.driver.*;error: package oracle.jdbc does not exist import oracle.jdbc.*;

我在正确的文件夹中也有 ojdbc14.jar 文件,并且可以使用查询字符串进行连接。只是在尝试使用 SP 时给我带来了麻烦。

SP 是我们在当前 CF 网站上使用的一个,所以我想按原样重复使用它。有人可以解释一下为什么这可能行不通吗?或者是否有其他代码可用于从 Oracle SP 返回游标?谢谢。

【问题讨论】:

【参考方案1】:

请试试这个,它可能会解决问题。

替换这个

rs = stmt.getCursor(2);

 rs = ((OracleCallableStatement)stmt).getCursor(2);

另外,对于调用过程,使用下面的语句。

CallableStatement stmt = conn.prepareCall("BEGIN SP_SEL_LOGIN_INFO(?, ?); END;");

【讨论】:

谢谢。我发现我缺少一个 jar 文件,但是一旦我添加了它,我仍然使用强制转换为 OracleCallableStatement。【参考方案2】:

你也可以这样试试:

rs = (ResultSet) stmt.getObject(2);
while (rs.next()) 
     String field1 = rs.getString(1);
     System.out.println(field1);

它在我这边运行正常

【讨论】:

【参考方案3】:

有人可以解释一下为什么这可能不起作用吗? 或者,如果有其他代码可用于返回游标 来自 Oracle SP?

如果您只想返回 resultsets(records) 那么为什么不使用返回 sys_refcursor 的函数而不是存储过程呢?当然没有任何区别 如果您在性能方面使用procedurefunction,因为function 将是最佳实践,因为您的procedure 除了select 声明之外没有做任何事情。

问候

【讨论】:

以上是关于如何从 Java 中的 oracle SP 返回 sys_refcursor?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .NET 中的存储过程返回 oracle 输出参数

从 oracle SP 返回隐式字符串

如何从 java 程序中读取存储过程源代码? [复制]

oracle如何执行存储过程以及如何返回一个table

如何在 JDBC 数据源级别限制从 Oracle 返回的行数?

如何从存储过程中获取嵌套游标 - Java & Oracle