簡體   English   中英

如何從 Java 中的 Oracle SP 返回 sys_refcursor?

[英]How do I return a sys_refcursor from oracle SP in java?

我在 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 返回游標? 謝謝。

請試試這個,它可能會解決問題。

替換這個

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);
}

它在我這邊運行正常

有人可以闡明為什么這可能不起作用嗎? 或者是否有替代代碼用於從 Oracle SP 返回游標?

如果您只想返回resultsets (記錄),那么為什么不使用返回sys_refcursor的函數而不是存儲過程呢? 當然,如果您在性能方面使用procedurefunction ,這沒有任何區別,因為function將是最佳實踐,因為您的procedure除了select語句外沒有做任何事情。

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM