Oracle存储过程,SYS_REFCURSOR和NHibernate

我有一个遗留的Oracle(10.2g)数据库,我正在连接,我想使用NHibernate(2.0.1)从存储过程中返回对象。 有问题的存储过程使用SYS_REFCURSOR返回结果。 根据文档,这应该是可行的,但我在互联网上发现了一些建议,否则。

这是我的释义代码:

映射文件:

           EXEC RS_DB.GETPERSONTEST   

存储过程:

 CREATE OR REPLACE PROCEDURE RS_DB.GETPERSONTEST ( io_cursor IN OUT sys_refcursor ) IS BEGIN OPEN io_cursor FOR SELECT PERSONCODE, PERSON_NAME, PERSON_SURNAME FROM PEOPLE END GETPERSONTEST; 

据我记得这是我几年前在与oracle合作时发现的一个错误,我已经在NH跟踪器中追踪了这个问题并且修复了但是版本为2.1.1GA; 你能证实这是同样的问题吗? https://nhibernate.jira.com/browse/NH-847

这是多么皇家的痛苦。 这终于奏效了。 我把商店程序变成了一个function。 函数返回sys_refcursor。 使用与OP和名称查询类似的映射,如下所示。

   { ? = call RS_DB.GETPERSONTEST }  

链接

根据此页面,您应该使用CALL而不是EXEC。 我没试过这个,所以YMMV。

在你的hibernate中,你声明了一个返回类型,但Oracle程序不会返回任何内容。 也许如果你把它改成一个返回引用光标的函数,它就可以正常工作。 另外,我相信CALL是正确的语法。 EXEC是一个SQL * Plus命令,而不是一个SQL语句。

我今天遇到了同样的问题。 对我们来说,修复是使用“CALL”而不是“EXEC”,将圆括号“()”添加到过程调用中,并用大括号“{}”包装调用:

   { CALL RS_DB.GETPERSONTEST() }