如何在.net代码中访问oracle存储过程的out参数的值 - 通过Nhibernate调用Oracle存储过程?
示例工作代码会有所帮助。
答案 0 :(得分:2)
您必须使用最新版本的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>();
它会起作用。
答案 1 :(得分:1)
我没有太多运气就尝试了2.1.2库。我必须基于this article对库进行一些修改。如果你走这条路,你需要确保使用的是Oracle.DataAccess dll,因为它不能与System.DataAccess.OracleClient dll一起使用。
答案 2 :(得分:1)
Whilst looking into getting out parameters from NHibernate I found various links suggesting that to get a stored proc out parameter value (rather than using a refcursor) you need to construct the command in code rather than using the XML mappings file.
But I found difficulty finding a complete working example online. It's not a beautiful solution, but I post in case it helps someone.
Example Oracle stored proc:
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;
Example C# code, where sessionFactory
is an 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;
}
答案 3 :(得分:0)
查看Richard Brown的 this comment 。可以找到一些示例代码 here 不幸的是我无法测试它,所以我不知道它是否有效。
答案 4 :(得分:0)
迟来的回复。
对于oracle,nHibernate不支持out参数,除非它是游标。如果您只想要标量值,那么解决方法是使用oracle函数包装存储过程。
然后你可以这样做
<sql-query name="TestOracleFunction" callable="true">
<return-scalar column="MyOutputValue" type="String" />
<![CDATA[
select MyOracleFunction as MyOutputValue from dual
]]>
</sql-query>
这有效!