2009-10-30 2 views
1

У меня есть хранимая процедура в Oracle:Вызов процедуры сохранения данных Oracle с NHibernate

procedure Test(results OUT gencursor, id in number) is 
    v_cursor gencursor; 
begin 
OPEN v_cursor FOR 
      select id, name, age from tblcustomers s where s.id = id; 
results:=v_cursor; 
end Test; 

Теперь я хотел бы выполнить эту процедуру с помощью NHibernate ISession.CreateSQLQuery. Все примеры, которые я видел до сих пор, используют ISession.GetNamedQuery().

Итак, я хотел бы сделать что-то вроде (ToDataTable мой собственный метод расширения на IQuery, у меня есть еще методы расширения, которые я хотел бы остаться с использованием в сочетании с хранимыми процедурами):

 var result = session 
      .CreateSQLQuery("call MyPackage.Test(:id)") 
      .SetDecimal("id", 33) 
      .ToDataTable(); 

код выше бросить следующее исключение:

"не удалось выполнить запрос [вызова MyPackage.Test (?)] Имя: идентификатор - Значение: 33 [SQL: вызов MyPackage.Test (?)]"

Я также попытался:

 var result = session 
      .CreateSQLQuery("call MyPackage.Test(:result, :id)") 
      .SetDecimal("id", 33) 
      .ToDataTable(); 

Это один бросить исключение:

Не все названные параметры были набор: [результат] [показать MyPackage.Test (: результат , : идентификатор)]

ответ

2

Я не сейчас, если вы можете позвонить СФС из CreateSQLQuery, но я покажу вам, как мы называем СФС Oracle из NHibernate в моем текущем проекте:

var query = _session.GetNamedQuery("MyPackageTestSp"); 
      query.SetParameter("id", 33); 
      query.ExecuteUpdate(); 

В файле отображения именованного запроса определяется следующим образом:

<sql-query name="MyPackageTestSp"> 
    call MyPackage.Test(:result, :id) 
</sql-query> 

Работает как шарм :-)

+0

Думаю, я больше борюсь с отображением курсора ouput с nHibernate. Как ваш подход обрабатывает выходные результаты? Я прочитал в руководстве, что требования - вывод должен быть в первом параметре (как курсор). – tofi9

+1

Этот ответ отлично подойдёт для меня, но я заметил пару вещей: похоже, что Мартин дважды «вызывается» внутри узла sql-запроса. Мне нужен был только тот, чтобы он работал. Кроме того, УБЕДИТЕСЬ, что вы не оставите конечную точку с запятой после оператора вызова xxx (...). У меня был вызов xxx (...); и мне потребовалось несколько часов, чтобы понять сообщение об ошибке, которое Oracle выслал мне. Надеюсь это поможет. –

+0

Удалено «звонок». –

0

Я нашел, что это проще просто использовать представление. В вашем сопоставлении просто установите mutable = false в свой класс, чтобы он не мог быть обновлен. Представление должно создать уровень абстракции, который вы пытаетесь достичь.

Смежные вопросы