У меня есть хранимая процедура в 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 (: результат , : идентификатор)]
Думаю, я больше борюсь с отображением курсора ouput с nHibernate. Как ваш подход обрабатывает выходные результаты? Я прочитал в руководстве, что требования - вывод должен быть в первом параметре (как курсор). – tofi9
Этот ответ отлично подойдёт для меня, но я заметил пару вещей: похоже, что Мартин дважды «вызывается» внутри узла sql-запроса. Мне нужен был только тот, чтобы он работал. Кроме того, УБЕДИТЕСЬ, что вы не оставите конечную точку с запятой после оператора вызова xxx (...). У меня был вызов xxx (...); и мне потребовалось несколько часов, чтобы понять сообщение об ошибке, которое Oracle выслал мне. Надеюсь это поможет. –
Удалено «звонок». –