带有out参数的Oracle存储过程使用Nhibernate

时间:2009-11-26 17:25:17

标签: oracle nhibernate stored-procedures

如何在.net代码中访问oracle存储过程的out参数的值 - 通过Nhibernate调用Oracle存储过程?

示例工作代码会有所帮助。

5 个答案:

答案 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.

  1. 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;
    
  2. 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>

这有效!