我有一个只进行更新的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更新。
答案 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文献。*