2010-05-26 127 views
0

我已經遇到了一些挫折試圖與JDBC簡單Oracle遊標檢索過程的工作。我一直在得到一個錯誤「[Oracle] [ODBC] [Ora] ORA-06553:PLS-306:調用'GETNAME'時錯誤的參數數量或類型」,但我無法弄清楚我是什麼我做錯了。檢索Oracle遊標與JDBC

這是我在Java代碼:

CallableStatement stmt = connection.prepareCall("call getName(?)"); 
stmt.registerOutParameter(1, OracleTypes.CURSOR); 
stmt.execute(); 

stmt.close(); 
con.close(); 

這裏是我的過程中甲骨文:上stmt.execute()發生

CREATE OR REPLACE PROCEDURE getName(cur out SYS_REFCURSOR) 
IS 
BEGIN 
    OPEN cur FOR 
     SELECT name FROM customer; 
END; 

錯誤。

在此先感謝。

順便說一句,我與Oracle 10.2.0工作。

+0

什麼JDBC jar文件在編譯和與執行? – 2010-05-26 19:29:49

回答

2

我本質上是一回事嘗試,它爲我工作。唯一的區別是我使用的Oracle JDBC庫沒有方法registerOutputParameter;我用registerOutParameter代替。也許你正在調用一種通用的JDBC方法,而不是支持Oracle類型的特定於Oracle的方法。

我能想到的唯一其他的解釋是,你的Java代碼連接到錯誤的模式,並訪問不同的getName對象。

+0

對不起,我輸錯了方法名稱。是否有任何Oracle設置或與代碼無關的問題可能導致此錯誤? – BeginnerAmongBeginners 2010-05-26 19:21:14

+0

原來,遊標可以很好地與JDBC Oracle瘦客戶端配合使用,但與ODBC無關。不確定原因,因爲我確實爲ODBC啓用了結果集。 – BeginnerAmongBeginners 2010-06-08 19:24:40

0

不,這是不對的。你不應該返回一個原始光標。您應該調用存儲過程並遍歷ResultSet。

+0

取決於數據庫...例如,SQL Server和Sybase可以從存儲過程返回結果集 - 但在Oracle中,您需要返回一個Cursor。 – AWhitford 2012-06-07 01:26:28

+0

不,我兩年前* *正在從持久層中返回一個裸遊標或ResultSet。您應該遍歷它,將內容加載到數據結構,對象或某種集合中,然後關閉遊標或ResultSet。你不會有內存泄漏或最大遊標數超過這個方式。我想你誤會了。你可能想重新考慮你的反對票。 – duffymo 2012-06-07 01:28:50