2011-07-24 25 views
2

如何從JDBC Callablestatement訪問此存儲過程?如何從JDBC Callablestatement訪問此存儲過程?

public class TestOCIApp { 

public static void main(String args[]) throws ClassNotFoundException, 
SQLException { 

try { 
Class.forName("oracle.jdbc.driver.OracleDriver"); 
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcle", "scott", "tiger"); 

CallableStatement cs = conn.prepareCall("{call test(?,?)}"); 
cs.setInt(1, 10); 

cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); 

ResultSet rs = (ResultSet)cs.getObject(2); 

while(rs.next()) 
{ 
System.out.println(rs.getString(2)); 
} 

conn.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
} 

我得到異常的

值java.sql.SQLException:無效的列索引 *在oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180)* *甲骨文。在Oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:285)* *上的oracle.jdbc.driver.OracleStatement.prepare_for_new_get(OracleStatement。 java:2804)* * at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:4983)* * at oracle.jdbc.d river.OracleStatement.getObjectValue(OracleStatement.java:4964)* *在oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:586)* *在TestOCIApp.main(TestOCIApp.java:23)*

create or replace procedure test(p_deptno IN number 
, p_cursor OUT SYS_REFCURSOR) 
is 
begin 
open p_cursor FOR 
select * 
from emp 
where deptno = p_deptno; 
end test; 
/

回答

4

與Oracle遊標交互時,CallableStatement對象將轉換爲OracleCallableStatement以使用getCursor方法,該方法是標準JDBC應用程序編程接口(API)的Oracle擴展,並將REF CURSOR返回給ResultSet對象。

cstmt.registerOutParameter(1, OracleTypes.CURSOR); 
cstmt.execute(); 
cursor = ((OracleCallableStatement)cstmt).getCursor(1); 

while (cursor.next()){ 
System.out.println (cursor.getString(1)); 
} 

但是,這將耦合你的代碼到Oracle數據庫[:(]