Хранимые процедуры Oracle, SYS REFCURSOR и NHibernate

у меня есть устаревшая база данных Oracle (10.2 g), к которой я подключаюсь, и я хотел бы использовать NHibernate (2.0.1), чтобы вернуть мне объекты из хранимой процедуры. Хранимая процедура использует SYS_REFCURSOR для возврата результатов. Согласно документация это должно быть выполнимо, но я нашел несколько посты в интернете, которые говорят об обратном.

вот мой перефразированный код:

сопоставление файл:

<?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 ответов


насколько я помню, это была ошибка, которую я также нашел пару лет назад при работе с oracle, я отследил проблему в NH tracker и исправлен, но на версии 2.1.1 GA; можете ли вы проверить, что это та же проблема, что и у вас? https://nhibernate.jira.com/browse/NH-847


какая это была королевская боль. Это, наконец, работал. Я превратил процедуру хранения в функцию. Функция возвращает sys_refcursor. Используется аналогичное сопоставление как запрос OP и name, как показано ниже.

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

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

ссылке


по данным на этой странице вместо EXEC следует использовать CALL. Я не пробовал это, так что YMMV.


в спящем режиме вы указываете тип возврата, но процедуры Oracle ничего не возвращают. Возможно, если вы изменили его на функцию, которая вернула курсор ref, он будет работать правильно. Кроме того, я считаю, что CALL-правильный синтаксис. EXEC-это команда SQL * Plus, а не оператор SQL.


я столкнулся с этой же проблемой сегодня. Для нас исправление состояло в том, чтобы использовать "вызов", а не" EXEC", добавить круглые скобки " () "к вызову процедуры и обернуть вызов в фигурные скобки" {}":

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

    { CALL RS_DB.GETPERSONTEST() }

</sql-query>