2013-06-24 30 views
2

這是函數:如何執行使用NHibernate返回sys_refcursor的Oracle函數?

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。這是通過在Oracle 9或10中使用SYS_REFCURSOR類型 完成的。在Oracle中,您需要定義一個REF CURSOR類型的 ,請參見Oracle文獻。

有全映射和存儲過程的代碼測試工作在https://github.com/nhibernate/nhibernate-core/tree/master/src/NHibernate.Test/SqlTest/Custom/Oracle

+0

是的,我的函數返回一個結果集。它使用sys_refcursor。但是......文件沒有說明你是如何把所有這些東西放在一起的。 –

+1

你應該有一個**輸出參數**,而不是返回值。查看添加的鏈接。 –

+0

@DiegoMijelshon真的沒辦法使用返回sys_refcursor的函數嗎?我支持一些代碼,這種模式適用於NHibernate 3.1,但在更新NHibernate後不起作用 – Sash0k

相關問題