我有一个正在连接的旧 Oracle (10.2g) 数据库,我想使用 NHibernate (2.0.1) 从存储过程中返回对象。有问题的存储过程使用 SYS_REFCURSOR 返回结果。根据documentation这应该是可行的,但我找到了 few posts互联网上有其他建议。
这是我解释的代码:
映射文件:
<?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;
最佳答案
这是多么痛苦的事情啊。这终于奏效了。我把存储过程变成了一个函数。函数返回 sys_refcursor。使用类似的映射作为 OP 和名称查询,如下所示。
<sql-query name="getpeople">
<return class="Person" />
{ ? = call RS_DB.GETPERSONTEST }
</sql-query>
关于c# - Oracle 存储过程、SYS_REFCURSOR 和 NHibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/635848/