NHibernate получить данные из хранимой процедуры через ref_cursor - PullRequest
1 голос
/ 27 июля 2011

У меня также возникают проблемы с получением данных из хранимой процедуры через ref_cursor.Может быть, вы могли бы посоветовать, как вы решили эту проблему -

Моя ошибка: "ORA-06553: PLS-306: неправильное число или типы аргументов при вызове 'GET_SAMPLE_LIST'"} Я предполагаю, что типы аргументов ввызов - это проблема

Вот мой код:

HBM

<?xml version="1.0" encoding="utf-8" ?>
<!-- Generated by MoreGen 28-Apr-2008 11:27:28 -->
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Infra"
               namespace="Infra.Entities">

<class name="Sample" table="MY_PACK.Get_Sample_List" lazy="true">
<id name="Id" column="ID">
  <generator class="native" />
</id>
<property name="Makat8" column="makat8" />
<property name="SerialNumber" column="serial_number" />

<loader query-ref="MY_PACK.Get_Sample_List"/>
</class>
<sql-query name="MY_PACK.Get_Sample_List" callable="true" >
<query-param name="p_crs" type="OracleDbType.RefCursor" />
<query-param name="p_1" type="int" />
<query-param name="p_2" type="string" />
<query-param name="p_3" type="int" />
<query-param name="p_4" type="date" />
<query-param name="p_5" type="date" />
<return alias="MY_PACK.Get_Sample_List" class="Sample">
  <return-property name="Makat8" column="makat8" />
  <return-property name="SerialNumber" column="serial_number" />

</return>
call MY_PACK.Get_Sample_List  (:p_crs, :p_1 , :p_2 , :p_3 , :p_4 , :p_5)


</sql-query>
</hibernate-mapping>

Элемент SAmple:

public class Sample
{
    public virtual int Id { get; set; }
    public virtual int Makat8 { get; set; }
    public virtual int SerialNumber { get; set; }
}

Конфигурация сеанса - это свободно, новсе тот же:

       m_Factory  = Fluently.Configure()  //cfgRules
              .Database(OracleClientConfiguration.Oracle10.Dialect("NHibernate.Dialect.Oracle10gDialect")
           .ConnectionString(x => x.FromConnectionStringWithKey("MyDBCONNSTRING"))
             .Driver<NHibernate.Driver.OracleDataClientDriver>().ShowSql())
             .ExposeConfiguration(c => c.Properties.Add("hbm2ddl.keywords", "none"))
            .Mappings(m =>
           {
               m.FluentMappings.AddFromAssemblyOf<MyEntityMapping>();
               m.HbmMappings.AddFromAssemblyOf<MyHBMMapping>();
               m.MergeMappings();
           })
           .BuildConfiguration()
           .BuildSessionFactory();

Есть тест:

using (ISession Session = NHibernateSessionProvider.GetSession("MyDBCONNSTRING"))
        {
            using (NHibernate.ITransaction Tran =    Session.BeginTransaction(System.Data.IsolationLevel.Serializable))
            {
                IQuery query = (IQuery)Session.GetNamedQuery("MY_PACK.Get_Sample_List").SetResultTransformer(Transformers.AliasToBean(typeof(Sample))); ;



                query.SetParameter("p_crs", OracleDbType.RefCursor);
                query.SetParameter("p_1", 1);
                query.SetParameter("p_2", 12345678);
                query.SetParameter("p_3", 1);
                query.SetDateTime("p_4", null);
                query.SetDateTime("p_5", null);




                IList result = query.List();

            }
        }

Любая помощь будет оценена!

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Прошло много времени с тех пор, как я использовал NHibernate с Oracle, но мне кажется, что я кое-что помню о том факте, что он не работает, если имя параметра хранимой процедуры ref_cursor не является конкретным значением (попробуйте поискать влинии), и был первым параметром процедуры (как у вас).

0 голосов
/ 23 февраля 2012

REF CURSOR должен быть первым параметром в вашей процедуре (pCursor OUT ReferenceCursor):

Тело пакета :

PROCEDURE usp_GetDual
    (
          pCursor OUT ReferenceCursor,
          a IN CHAR,
          b IN CHAR
    )

  IS

    err_code NUMBER;
    err_msg VARCHAR2(200);

  BEGIN

  OPEN pCursor FOR
    SELECT * FROM dual;

   EXCEPTION
    WHEN OTHERS THEN 
        err_code := SQLCODE;
        err_msg := substr(SQLERRM, 1, 200);

END usp_GetDual;

и XML вашего отображения:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly">
    <sql-query name="GetDaul">
        { call MYPACKAGE.usp_GetDual ( :a, :b ) }
    </sql-query>
</hibernate-mapping>

Теперь вы можете просто запросить, используя это:

var value = Session.GetNamedQuery("GetDaul")
    .SetParameter<string>("a", "AAA")
    .SetParameter<string>("b", "BBB")
    .UniqueResult();

Вы можете найти лучшее объяснение здесь .

Эта статья может помочь вам понять вещи.

...