2009-03-11 2 views
7

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

Вот мой перефразировал код:

Mapping файла:

<?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; 

ответ

1

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

+0

Хорошо, наконец, обдумал это в нашем коде. Я написал обходное решение, но это было глупо. С тех пор мы обновили NHibernate 3.0 и использовали синтаксис в предоставляемой ссылке ({call employmentsForRegion (: regionCode)}), и он сработал !. Спасибо за поздний ответ :). –

1

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

1

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

2

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

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

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

Link

+1

У меня такая же проблема, и я не могу заставить это решение работать. Можете ли вы предоставить какой-либо код? –

+0

индекс вне диапазона для функции, возвращающей sys_refcursor через сопоставление {? = вызов RS_DB.GETPERSONTEST (?,?)} в NHibernate 4.0.4 – Sash0k

1

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

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

    { CALL RS_DB.GETPERSONTEST() } 

</sql-query> 
Смежные вопросы