Хранимая процедура Oracle с параметром out, использующим Nhibernate - PullRequest
3 голосов
/ 26 ноября 2009

Как получить доступ к значению параметра out хранимой процедуры oracle в коде .net - хранимая процедура Oracle вызывается через Nhibernate?

Пример рабочего кода поможет.

Ответы [ 5 ]

2 голосов
/ 03 декабря 2009

Вы должны использовать последнюю версию 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 голос
/ 10 июня 2016

При поиске параметров из NHibernate я обнаружил различные ссылки, предлагающие, чтобы для получения сохраненного значения параметра proc (вместо использования refcursor) вам нужно было создать команду в коде, а не использовать файл сопоставлений XML.

Но мне было трудно найти полный рабочий пример в Интернете. Это не красивое решение, но я публикую сообщение на случай, если оно кому-нибудь поможет.

  1. Пример хранимого процесса 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;
    
  2. Пример кода 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;
    }
    
1 голос
/ 09 апреля 2010

Я попробовал библиотеки 2.1.2 без особой удачи. Мне пришлось внести некоторые изменения в библиотеку на основе этой статьи . Если вы пойдете по этому пути, вам нужно убедиться, что вы используете dll Oracle.DataAccess, поскольку он не будет работать с dll System.DataAccess.OracleClient.

0 голосов
/ 23 сентября 2010

Запоздалый ответ.

Для оракула параметр out не поддерживается nHibernate, если он не является курсором. Если вы просто хотите получить скалярное значение, обходной путь - обернуть вашу хранимую процедуру функцией оракула.

Тогда вы можете сделать это

  <sql-query name="TestOracleFunction" callable="true">
    <return-scalar column="MyOutputValue" type="String" />
    <![CDATA[
    select MyOracleFunction as MyOutputValue from dual
  ]]>
  </sql-query>

Это работает!

0 голосов
/ 27 ноября 2009

См. этот комментарий от Ричарда Брауна. Пример кода можно найти здесь .
К сожалению, я не могу проверить это, поэтому я не знаю, работает ли он или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...