我有一个遗留的Oracle(10.2g)数据库,我正在连接,我想使用NHibernate(2.0.1)从存储过程中返回对象。有问题的存储过程使用SYS_REFCURSOR返回结果。根据{{3}},这应该是可行的,但我在互联网上发现了一个documentation few,但另有说法。
这是我的释义代码:
映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="OracleStoredProcedures" namespace="OracleStoredProcedures">
<class name="Person" mutable="false">
<id name="PersonCode" type="AnsiString" column="PERSONCODE">
<generator class="assigned" />
</id>
<property name="Name" type="String" column="PERSON_NAME" />
<property name="Surname" type="String" column="PERSON_SURNAME" />
</class>
<sql-query name="getpeople">
<return class="Person" />
EXEC RS_DB.GETPERSONTEST
</sql-query>
</hibernate-mapping>
存储过程:
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;
答案 0 :(得分:2)
这是多么皇家的痛苦。这终于奏效了。我把商店程序变成了一个功能。函数返回sys_refcursor。使用与OP和名称查询类似的映射,如下所示。
<sql-query name="getpeople">
<return class="Person" />
{ ? = call RS_DB.GETPERSONTEST }
</sql-query>
答案 1 :(得分:1)
根据this page,您应该使用CALL而不是EXEC。我没试过这个,所以YMMV。
答案 2 :(得分:1)
在你的休眠中,你声明了一个返回类型,但Oracle程序不会返回任何内容。也许如果你把它改成一个返回引用光标的函数,它将正常工作。另外,我相信CALL是正确的语法。 EXEC是SQL * Plus命令,而不是SQL语句。
答案 3 :(得分:1)
据我记得,这是我几年前在使用oracle时发现的一个错误,我在NH跟踪器中追踪了这个问题并修复了2.1.1GA版本;你能证实这是同样的问题吗? https://nhibernate.jira.com/browse/NH-847
答案 4 :(得分:1)
我今天遇到了同样的问题。对我们来说,修复是使用“CALL”而不是“EXEC”,将圆括号“()”添加到过程调用中,并用大括号“{}”包装调用:
<sql-query name="getpeople">
<return class="Person" />
{ CALL RS_DB.GETPERSONTEST() }
</sql-query>