Хранимые процедуры Oracle, SYS_REFCURSOR и NHibernate - PullRequest
7 голосов
/ 11 марта 2009

У меня есть устаревшая база данных Oracle (10.2g), к которой я подключаюсь, и я хотел бы использовать 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 ]

2 голосов
/ 21 ноября 2010

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

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

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

Ссылка

1 голос
/ 24 января 2011

Я столкнулся с этой же проблемой сегодня. Для нас было исправлено использование «ВЫЗОВА» вместо «EXEC», добавление круглых скобок «()» к вызову процедуры и завершение вызова в фигурные скобки «{}»:

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

    { CALL RS_DB.GETPERSONTEST() }

</sql-query>
1 голос
/ 20 августа 2009

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

1 голос
/ 19 октября 2010

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

1 голос
/ 13 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...