2013-06-24 3 views
2

Это функция:Как выполнить функцию Oracle, которая возвращает sys_refcursor с помощью NHibernate?

FUNCTION GET_ALL(P_USER_ID IN VARCHAR2) RETURN SYS_REFCURSOR IS 
    C SYS_REFCURSOR; 
BEGIN 
    OPEN C 
    FOR 'SELECT * FROM XYZ WHERE USER_ID = :P_USER_ID' 
    USING P_USER_ID; 

    RETURN C; 
END; 

Я пытаюсь вызвать эту функцию с помощью NHibernate, как это:

Session 
    .CreateSQLQuery("BEGIN ? = PKG.GET_ALL(:P_USER_ID); END;") 
    .SetString("P_USER_ID", "SOMEONE") 
    .List<XYZ>(); 

Любой код, советы дыма знаки приветствуются.

PS: Я использую NHibernate 3.3.0.GA

+0

Возможные дублей: http://stackoverflow.com/a/4237147/232279 и http://stackoverflow.com/questions/5901638/nhibernate-call-function-in-oracle-which-returns-sys-refcursor? Rq = 1 – ThinkJet

ответ

1

От official docs:

Для Oracle применяются следующие правила:

Функция должна возвращать набор результатов , Первым параметром процедуры должен быть OUT, который возвращает набор результатов. Это делается с помощью с использованием типа SYS_REFCURSOR в Oracle 9 или 10. В Oracle вам необходимо, чтобы определял тип REF CURSOR, см. Литературу Oracle.

Есть рабочие тесты с полным отображением и код хранимой процедуры на https://github.com/nhibernate/nhibernate-core/tree/master/src/NHibernate.Test/SqlTest/Custom/Oracle

+0

Да, и моя функция возвращает набор результатов. И он использует sys_refcursor. Но ... документы не говорят, как вы объединяете все эти вещи. –

+1

У вас должен быть параметр ** out **, а не возвращаемое значение. См. Добавленную ссылку. –

+0

@DiegoMijelshon действительно не может использовать функцию, возвращающую sys_refcursor? Я поддерживаю некоторый код, и этот шаблон работает для NHibernate 3.1, но не работает после обновления NHibernate – Sash0k

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