我在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
上我自己的扩展方法,我有更多的扩展方法,我希望与存储过程结合使用) :
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)]
答案 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,这样就无法更新。视图应该创建您想要实现的抽象级别。