2014-01-10 54 views
1

我有点卡在这里。我在Oracle中有一个小笨函数,并尝试用Java访问它。返回值应该是一个SYS_REFCURSOR。但是如果我尝试用Java调用它,我会得到一个错误。访问Oracle SYS_REFCURSOR

这是Oracle功能:

FUNCTION GET_TBL_AS_CUR 
RETURN SYS_REFCURSOR 
IS 
    Tbl SYS_REFCURSOR; 
BEGIN 

    OPEN Tbl FOR SELECT * FROM test_tbl; 
    RETURN Tbl; 

END; 

这是Java中的呼叫:

String stmt = "callStmt: {?= call dbschema.pkg_tbl_tools.get_tbl_as_cur()}"; 
callableStatement = conn.prepareCall(stmt); 
callableStatement.registerOutParameter(1, OracleTypes.CURSOR); 
System.out.println("Executing... " + stmt + "\n"); 

callableStatement.execute(); 

rs = ((OracleCallableStatement)callableStatement).getCursor(1); 

} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 

的错误信息是:

Unknown SQL-Type: sqlKind = UNINITIALIZED 

我在做什么错?

+0

你在哪一行得到错误信息?它是最后一行,你调用'getCursor'? – rgettman

+0

'getCursor'调用后没有任何反应。只是“catch(Exception)”。显示的错误消息将打印在那里。 – Ben

+0

PL/SQL函数在Oracle中工作吗?在Java代码中,您是否尝试过'getObject(1)'并将所返回的内容转换为“ResultSet”? – rgettman

回答

0

问题已解决。

感谢您的帮助。总结最后的“诀窍”,我会在这里发布解决方案。

这种调用方式适用于Oracle中的任何函数或过程IF函数将不返回集合作为引用游标。

String stmt = "{call ? := dbschema.pkg_tbl_tools.get_tbl_as_cur()}"; 

这种风格的作品在甲骨文就好了,即使返回值是一个参考光标

String stmt = "BEGIN ? := dbschema.pkg_tbl_tools.get_tbl_as_cur(); END;"; 

下面一行

rs = ((OracleCallableStatement)callableStatement).getCursor(1); 

能化作

rs = (ResultSet) callableStatement.getObject(1); 

不知道为什么。但它现在起作用了。再次感谢:)

+0

很高兴听到:) –

+0

“ stmt',因为它返回'ORA-00900';我期望它看起来像'stmt =“{call?:= dbschema ....()}”'。这相当于你的'BEGIN' /'END'版本。我的Oracle数据库和驱动程序不知道'callStmt:'是什么,或者'?= call'而不是'call? :='。您是直接使用JDBC驱动程序,还是通过框架? –

+0

我只会在12c Oracle上进行测试。 'BEGIN ...; END;'也会工作'{打电话? := ...}'。我在其他网站上找到的其他组合,他们可能最有可能buillsh;)我编辑了我的答案。 – Ben