如何在 java 中从 oracle SP 返回sys_refcursor



我在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);error: cannot find symbol rs = stmt.getCursor(2);它说它找不到OracleType和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 网站上使用的 SP,因此我想按原样重用它。 有人可以阐明为什么这可能不起作用吗? 或者,是否有替代代码位可用于从 Oracle SP 返回游标? 谢谢。

请尝试此操作,它可能会解决问题。

替换此

rs = stmt.getCursor(2);

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

此外,对于调用过程,请使用以下语句。

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

你也可以这样尝试:

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

它在我这边运行正常

有人可以阐明为什么这可能不起作用吗? 或者,如果有替代代码位可用于返回游标 来自甲骨文 SP?

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

问候

最新更新