使用nHibernate调用Oracle存储过程

时间:2009-10-30 11:30:08

标签: 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;

现在,我想使用nHibernate ISession.CreateSQLQuery执行此过程。我见过的所有例子都使用ISession.GetNamedQuery()

所以,我想做一些事情(ToDataTableIQuery上我自己的扩展方法,我有更多的扩展方法,我希望与存储过程结合使用) :

        var result = session
            .CreateSQLQuery("call MyPackage.Test(:id)")
            .SetDecimal("id", 33)
            .ToDataTable();

上面的代码抛出以下异常:

  

“无法执行查询[call   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)]

2 个答案:

答案 0 :(得分:2)

如果你可以从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>

像魅力一样: - )

答案 1 :(得分:0)

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