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

时间:2012-06-25 21:33:11

标签: stored-procedures jdbc oracle-cursor

我在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返回游标?感谢。

3 个答案:

答案 0 :(得分:2)

请试试这个,它可能会解决问题。

替换此

rs = stmt.getCursor(2);

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

除了调用你的程序外,还可以使用这句话。

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

答案 1 :(得分:1)

您也可以这样尝试:

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

它在我这边正常运行

答案 2 :(得分:0)

  

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

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

此致