首页 新闻 搜索 专区 学院

如何用nhibernate调用oracle带输出参数的存储过程

0
悬赏园豆:60 [待解决问题]

请问oracle存储过程有输出参数,用nhibernate调用存储过程时,如何才能获取到一个结果集和这个输出参数呢?

问题补充:

很急很急啊

anny0320的主页 anny0320 | 初学一级 | 园豆:140
提问于:2011-06-02 11:53
< >
分享
所有回答(3)
-1

为了在Hibernate中使用存储过程,你必须遵循一些规则.不遵循这些规则的存储过程将不可用.如果你仍然想要使用他们, 你必须通过session.connection()来执行他们.这些规则针对于不同的数据库.因为数据库 提供商有各种不同的存储过程语法和语义.

对存储过程进行的查询无法使用setFirstResult()/setMaxResults()进行分页。

建议采用的调用方式是标准SQL92: { ? = call functionName(<parameters>) } 或者 { ? = call procedureName(<parameters>}.原生调用语法不被支持。

对于Oracle有如下规则:

  • 函数必须返回一个结果集。存储过程的第一个参数必须是OUT,它返回一个结果集。这是通过Oracle 9或10的SYS_REFCURSOR类型来完成的。在Oracle中你需要定义一个REF CURSOR类型,参见Oracle的手册。

对于Sybase或者MS SQL server有如下规则:

  • 存储过程必须返回一个结果集。.注意这些servers可能返回多个结果集以及更新的数目.Hibernate将取出第一条结果集作为它的返回值, 其他将被丢弃。

  • 如果你能够在存储过程里设定SET NOCOUNT ON,这可能会效率更高,但这不是必需的。

  • 然后需要在任意一个hibernate映射文件中配置一个标签<sql-query>name属性以及result标签,设置result的class属性是你返回的结果集对应的类型,也就是你的实体类,然后call 存储过程名(参数)即可配置完成了

  • 然后获得hibernate的一个session ,调用getnamedquery方法执行你配置好的那个存储过程,然后返回一个list即可对list进行遍历了……

左手年华 | 园豆:338 (菜鸟二级) | 2011-06-02 17:01
oracle10存储过程有输出参数,在c#中用nhibernate调用存储过程时,如何才能获取到一个结果集和这个输出参数呢?
1。存储过程如下:
create or replace procedure P_Get_Customerbylastname(cur_OUT out SYS_REFCURSOR, lastname VARCHAR2,out_id out varchar2,out_input in out varchar2)
is
begin
open cur_OUT for
select *
FROM customer r
WHERE r.lastname = lastname;
out_id:='eee';
out_input:=out_input||'aaa';
end P_Get_Customerbylastname;
2. 代码如下:
hibernate映射文件中配置:()



{call P_Get_Customerbylastname(:lastname,:out_id,:out_input)}


[color=#FF0000]现在就是不知道存储过程有输出参数如何设置配置文件,以及在C#中用nhibernate如何获取这个输出参数,[/color]
3. 代码如下:
//有输出参数,返回结果集和输出参数
public IList GetCustomersByProcName(string lastname, out string outid,ref string outinput)
{
outid =string.Empty;
IQuery query = this.Session.GetNamedQuery("GetCustomersByName");
query.SetString("lastname", lastname);
query.SetString("out_id", outid);//[color=#FF0000]主要是这里不知如何设置输出参数,并返回其值。[/color]return query.List();
}
支持(0) 反对(0) anny0320 | 园豆:140 (初学一级) | 2011-06-03 09:45
必须通过session.connection()来执行他们?这不是打开数据库连接吗?请就我上面的例子给出连接后如何用nhibernate操作?谢谢!
支持(0) 反对(0) anny0320 | 园豆:140 (初学一级) | 2011-06-03 09:46
1

这个问题好象是无解,我之前也遇到过这个问题,在NH2.12里,调用Oracle存贮过程想返回多个值,最后发现只能返回一个值,并且这个值要是游标类型,并且为存贮过程第一个参数。而且这个存贮过程,不能是包中的存贮过程。

给你几个链接:

http://home.cnblogs.com/group/topic/44620.html

http://www.cnblogs.com/1-2-3/archive/2009/11/04/NHibernate-Call-Oracle-Procedure.html

kasoo | 园豆:91 (初学一级) | 2011-06-04 18:29
1

看来好多人都遇到这个问题啊,输出参数真不知道怎么搞,如果谁知道告诉我一声啊,谢谢

千里眼 | 园豆:201 (菜鸟二级) | 2012-08-14 15:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册