Oracle存储过程,SYS_REFCURSOR和NHibernate

时间:2009-03-11 18:48:21

标签: c# oracle nhibernate stored-procedures

我有一个遗留的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;

5 个答案:

答案 0 :(得分:2)

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

<sql-query name="getpeople">
 <return class="Person" />

 { ? = call RS_DB.GETPERSONTEST }
</sql-query>

Link

答案 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>