Csharp/C#教程:Oracle存储过程,SYS_REFCURSOR和NHibernate分享


Oracle存储过程,SYS_REFCURSOR和NHibernate

我有一个遗留的Oracle(10.2g)数据库,我正在连接,我想使用NHibernate(2.0.1)从存储过程中返回对象。 有问题的存储过程使用SYS_REFCURSOR返回结果。 根据文档,这应该是可行的,但我在互联网上发现了一些建议,否则。

这是我的释义代码:

映射文件:

           EXEC RS_DB.GETPERSONTEST   

存储过程:

 CREATE OR REPLACE PROCEDURE RS_DB.GETPERSONTEST ( io_cursor IN OUT sys_refcursor ) IS BEGIN OPEN io_cursor FOR SELECT PERSONCODE, PERSON_NAME, PERSON_SURNAME FROM PEOPLE END GETPERSONTEST; 

据我记得这是我几年前在与oracle合作时发现的一个错误,我已经在NH跟踪器中追踪了这个问题并且修复了但是版本为2.1.1GA; 你能证实这是同样的问题吗? https://nhibernate.jira.com/browse/NH-847

这是多么皇家的痛苦。 这终于奏效了。 我把商店程序变成了一个function。 函数返回sys_refcursor。 使用与OP和名称查询类似的映射,如下所示。

   { ? = call RS_DB.GETPERSONTEST }  

链接

根据此页面,您应该使用CALL而不是EXEC。 我没试过这个,所以YMMV。

在你的hibernate中,你声明了一个返回类型,但Oracle程序不会返回任何内容。 也许如果你把它改成一个返回引用光标的函数,它就可以正常工作。 另外,我相信CALL是正确的语法。 EXEC是一个SQL * Plus命令,而不是一个SQL语句。

我今天遇到了同样的问题。 对我们来说,修复是使用“CALL”而不是“EXEC”,将圆括号“()”添加到过程调用中,并用大括号“{}”包装调用:

上述就是C#学习教程:Oracle存储过程,SYS_REFCURSOR和NHibernate分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

   { CALL RS_DB.GETPERSONTEST() }  

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1300342.html

(0)
上一篇 2022年12月23日
下一篇 2022年12月23日

精彩推荐