2013-06-24 31 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

相关问题