如何在.net代码中访问oracle存储过程的out参数的值 - 通过Nhibernate调用Oracle存储过程?使用Nhibernate使用out参数的Oracle存储过程
示例工作代码将有所帮助。
如何在.net代码中访问oracle存储过程的out参数的值 - 通过Nhibernate调用Oracle存储过程?使用Nhibernate使用out参数的Oracle存储过程
示例工作代码将有所帮助。
你必须使用最新版本的NHibernate(2.1.2)。
<sql-query name="ReturnSomethig" callable="true">
<return class="Somethig" />
{ call ReturnSomethig(:someParameter) }
</sql-query>
Oracle存储过程需要具有第一个参数作为out sys_refcursor参数。
你可以叫这样的命名查询:
IQuery query = currentSession.GetNamedQuery("ReturnSomethig");
query.SetInt64("someParameter", someParameter);
var somethig = query.List<Somethig>();
,它会工作。
请参阅this comment理查德布朗。一些示例代码可以发现here。
不幸的是我无法测试它,所以我不知道它是否有效。
我尝试了2.1.2库,没有多少运气。我不得不根据this article对库进行一些修改。如果你走这条路线,你会想确保你使用的是Oracle.DataAccess DLL,因为它不会与System.DataAccess.OracleClient DLL一起工作。
迟来的回复。
对于oracle,out参数不受nHibernate支持,除非它是一个游标。如果你只是想要一个标量值,解决方法是用oracle函数包装你的存储过程。
然后你就可以做到这一点
<sql-query name="TestOracleFunction" callable="true">
<return-scalar column="MyOutputValue" type="String" />
<![CDATA[
select MyOracleFunction as MyOutputValue from dual
]]>
</sql-query>
这工作!
虽然调查从NHibernate中获取参数,我发现各种链接提示要获取存储的proc输出参数值(而不是使用refcursor),您需要在代码中构造命令而不是使用XML映射文件。
但我发现很难在网上找到一个完整的工作示例。这不是一个美丽的解决方案,但我发布以防万一有人帮助。
实例的Oracle存储过程:
create or replace PACKAGE BODY MY_PACKAGE AS
PROCEDURE add_one
(
p_out out number,
p_in in number
) AS
BEGIN
select p_in + 1 into p_out from dual;
END add_one;
END MY_PACKAGE;
实例C#代码,其中sessionFactory
是NHibernate的ISessionFactory
:
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var command = session.Connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MY_PACKAGE.add_one";
var parmOut = command.CreateParameter();
parmOut.ParameterName = "p_out";
parmOut.DbType = DbType.Decimal;
parmOut.Direction = ParameterDirection.Output;
command.Parameters.Add(parmOut);
var parmIn = command.CreateParameter();
parmIn.ParameterName = "p_in";
parmIn.DbType = DbType.Decimal;
parmIn.Direction = ParameterDirection.Input;
parmIn.Value = 67;
command.Parameters.Add(parmIn);
transaction.Enlist(command);
command.ExecuteNonQuery();
int sixtyEight = (int) (decimal) parmOut.Value;
}
我不能得到这个工作。当我下载源代码时,我实际上不得不利用这个帖子进行一些修改(https://forum.hibernate.org/viewtopic.php?f=25&t=999056)。这也是在2.1.2版本中。 – 2010-04-09 16:06:54
当时我们并没有为我们的问题使用refcursor,但是,我觉得这将是我的问题的解决方案。因此,接受它。 * *请参考上面布雷克的链接。 – publicgk 2011-04-01 14:10:55