C# 使用nHibernate调用Oracle存储过程

C# 使用nHibernate调用Oracle存储过程,c#,.net,nhibernate,stored-procedures,C#,.net,Nhibernate,Stored Procedures,我在Oracle中有一个存储过程: 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; 现在,我想使用nHibernateISession.CreateS

我在Oracle中有一个存储过程:

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
上的扩展方法,我有更多的扩展方法,我希望与存储过程结合使用):

上面的代码引发以下异常:

“无法执行查询[调用] MyPackage.Test(?)名称:id-值:33 [SQL:调用MyPackage.Test(?)”

我也试过:

        var result = session
            .CreateSQLQuery("call MyPackage.Test(:result, :id)")
            .SetDecimal("id", 33)
            .ToDataTable();
那一个抛出异常:

并非所有命名参数都已命名 set:[result][call MyPackage.Test(:result, :id)]


我现在不知道您是否可以从CreateSQLQuery调用sps,但我将向您展示如何在当前项目中从NHibernate调用Oracle sps:

var query =  _session.GetNamedQuery("MyPackageTestSp");
            query.SetParameter("id", 33);
            query.ExecuteUpdate();
在映射文件中,命名查询的定义如下:

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

调用MyPackage.Test(:result,:id)

工作起来很有魅力:-)

我发现只使用视图更容易。在映射中,只需在类上设置mutable=false,这样它就不能被更新。视图应该创建您试图实现的抽象级别。

我想我更难将输出光标映射到nHibernate。您的方法如何处理输出结果?我在手册中读到,要求是输出应该在第一个参数中(作为游标)。这个答案对我来说非常有用,但我注意到了两件事:看起来Martin在sql查询节点中放置了两次“调用”。我只需要一个就可以让它工作了。另外,请确保在call xxx(…)语句后不要留下尾随分号。我打电话给xxx(…);我花了好几个小时才弄明白甲骨文向我吐出的胡说八道的错误信息。希望这有帮助。
<sql-query name="MyPackageTestSp">
    call MyPackage.Test(:result, :id)
</sql-query>