Хранимые процедуры 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>