Oracle通过命名查询仅使用NHibernate更新存储过程

时间:2014-08-07 09:11:14

标签: nhibernate oracle11g nhibernate-mapping

我有一个只进行更新的Oracle存储过程。这是一个遗留存储过程,我必须使用它。它无法改变。

我可以使用Nhibernate从C#调用并执行它,如下所示:

var query = Session.CreateSQLQuery("call myPackage.mySproc(:param1, :param2, :param3)");
query.SetInt64("param1", 123456);
query.SetInt64("param2", 654321);
query.ExecuteUpdate();

如果可能,我更愿意使用命名查询。我尝试了以下内容:

Session
.GetNamedQuery("myNamedQuery")
.SetInt64("param1", 123456)
.SetInt64("param2", 654321)
.ExecuteUpdate();

我的命名查询如下所示:

<sql-query name="myNamedQuery">

        { call myPackage.mySproc(:param1, :parm2) }
    </sql-query>

当我尝试这个时,我收到错误:

  

无法执行本机批量操作查询

内部异常:

  

ORA-06550:第1行第7列:PLS-00306:错误的数字或类型   调用'mySproc'ORA-06550时的参数:第1行第7列:PL / SQL:   声明被忽略

现在我当然要仔细检查我的参数列表,它在代码中匹配,映射xml和sproc本身。

我离开了吗?这有可能吗?即使没有返回数据,我是否需要映射?它只执行SQL更新。

2 个答案:

答案 0 :(得分:0)

你试过了吗?

<sql-query name="myNamedQuery">
        { call myPackage.mySproc(:param1, :param2, :param3) }
</sql-query>

答案 1 :(得分:0)

<强> 18.2.2.1。使用存储过程的规则/限制

... *对于Oracle,以下规则适用:

函数必须返回结果集。过程的第一个参数必须是返回结果集的OUT。这是通过在Oracle 9i或更高版本中使用SYS_REFCURSOR类型来完成的。在Oracle中,您需要定义REF CURSOR类型,请参阅Oracle文献。*

Chapter 18. Native SQL