如何在java中从oracle SP返回sys_refcursor?

问题描述 投票:0回答:4

我在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 网站上使用的 SP,所以我想按原样重复使用它。有人可以解释一下为什么这可能不起作用吗?或者是否有替代代码可用于从 Oracle SP 返回游标?谢谢。

stored-procedures jdbc oracle-cursor
4个回答
4
投票

请尝试一下,也许可以解决问题。

更换这个

rs = stmt.getCursor(2);

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

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

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

1
投票

你也可以这样尝试:

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

我这边运行正常


0
投票

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

如果您只想返回

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

问候


0
投票
public LoanResponse getActiveLoan(LoanOverview loanDetails) {
    LoanResponse response = new LoanResponse();
    ErrorResponse error = null;
    try {
        SimpleJdbcCall procedure = new SimpleJdbcCall(jdbc).withProcedureName("GET_ALL_LOAN_DETAILS_BY_USER")
                .returningResultSet("P_ASSET_RESULT", new LOAN_OVERVIEW_ROWMAPPER()));
        MapSqlParameterSource input = new MapSqlParameterSource().addValue("P_UUID", loanDetails.getUuid());
        Map<String, Object> result = procedure.execute(input);
        List<LoanOverview> loanDtls = (List) result.get("P_ASSET_RESULTS");
        if (!CollectionUtils.isEmpty(loanDtls) ) {
            response.setLoanOverview(loanDtls);
            error = SUCCESS_ERROR;
        } else {
            error = NODATA_ERROR;
        }
    } catch (Exception e) {
        log.error(e.getMessage());
        error = EXCEPTION_ERROR;
    }
    response.setError(error);
    return response;
}
© www.soinside.com 2019 - 2024. All rights reserved.