Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

nhibernate, panggil fungsi di Oracle yang mengembalikan refcursor sys

Ada beberapa batasan saat memanggil fungsi/prosedur ORACLE dengan nHibernate.
Seperti yang dinyatakan dalam dokumentasi referensi (17.2.2.1):

Untuk Oracle, aturan berikut berlaku :

Suatu fungsi harus mengembalikan kumpulan hasil. Parameter pertama dari prosedur harus OUT yang mengembalikan kumpulan hasil. Ini dilakukan dengan menggunakan tipe SYS_REFCURSOR di Oracle 9 atau 10. Di Oracle Anda perlu mendefinisikan tipe REF CURSOR, lihat literatur Oracle.

Saya sudah mencoba bermain sedikit dengannya karena saya mengalami masalah yang sama.

Berikut adalah PROSEDUR PAKET:

KEPALA:

create or replace
PACKAGE           "MYPACKAGE" AS

    TYPE ReferenceCursor IS REF CURSOR;

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

END MYPACKAGE;

TUBUH:

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;

Ini file pemetaan saya:

<?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>

dan ini adalah kode yang saya gunakan untuk mengujinya:

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

Seperti yang Anda lihat, REF CURSOR harus menjadi parameter pertama dalam prosedur Anda (pCursor OUT ReferenceCursor ) dan Anda tidak perlu merujuknya dalam pemetaan atau panggilan Anda.

Jika Anda ingin mengembalikan entitas, semuanya menjadi sedikit lebih rumit.

File pemetaan Anda harus menentukan jenis pengembalian (kelas):

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly">
    <sql-query name="GetOrders">
         <return class="MyAssembly.Domain.MyOrder, MyAssembly" />
         { call MYPACKAGE.usp_GetOrders ( :pCompanyCode , :pOrderNumer ) }
    </sql-query>
</hibernate-mapping>

Anda harus mendefinisikan entitas Anda:

public class MyOrder
{
    public virtual string Number { get; set; }
    public virtual int Ver { get; private set; }
    public virtual string Company { get; set; }
    public virtual string Customer { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        Order order = obj as Order;
        if (order == null)
            return false;
        if (this.Number.Trim() == order.Number.Trim() &&
            this.Ver == order.Ver &&
            this.Company.Trim() == order.Company.Trim()
            )
            return true;
        else
            return false;
    }

    public override int GetHashCode()
    {
        int hash = 0;
        hash = hash +
            (null == this.Number ? 0 : this.Number.GetHashCode())
            +
            (this.Ver.GetHashCode())
            +
            (null == this.Company ? 0 : this.Company.GetHashCode());

        return (hash);
    }
}

dan ini adalah file pemetaan untuk entitas Anda:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">
  <class name="MyOrder" table="OCSAORH" mutable="false">
    <composite-id>
      <key-property name="Number" column="OCHORDN" type="String" length="10"></key-property>
      <key-property name="Ver" column="OCHAMND" type="Int32"></key-property>
      <key-property name="Company" column="OCHCOSC" type="String" length="5"></key-property>
    </composite-id>
    <property name="Customer" column="OCHCLII" type="String"></property>
  </class>
</hibernate-mapping>

Ini adalah paket ORACLE saya:

PROCEDURE usp_GetOrders 
          (
          pCursor OUT ReferenceCursor,
          pCompanyCode IN CHAR,
          pOrderNumer IN CHAR
      )

  IS

    err_code NUMBER;
    err_msg VARCHAR2(200);

  BEGIN

  OPEN pCursor FOR
       SELECT 
            OCSAORH.*
      FROM OCSAORH 
            WHERE OCSAORH.OCHAMND = 0
                AND OCSAORH.OCHCOSC = pCompanyCode
                AND OCSAORH.OCHORDN = pOrderNumer;              
    EXCEPTION
            WHEN OTHERS THEN 
          err_code := SQLCODE;
          err_msg := substr(SQLERRM, 1, 200);

END usp_GetOrders;

Dan sekarang Anda dapat dengan mudah mendapatkan pesanan Anda menggunakan parameter:

var listOfOrders = Session.GetNamedQuery("GetOrder")
    .SetParameter<string>("pCompanyCode", "ABC")
        .SetParameter<string>("pOrderNumer", "XYZ")
        .List<Domain.MyOrder>();

Artikel ini membantu saya memahami bagaimana sesuatu harus dilakukan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 50 Nuansa Ujian Sertifikasi Database Oracle

  2. Adaptor Jaringan tidak dapat membuat koneksi saat terhubung dengan Oracle DB

  3. Bagaimana cara membuat Oracle membuat pernyataan tabel di SQL*Plus

  4. Bagaimana saya bisa memasukkan ke dalam kolom BLOB dari pernyataan insert di sqldeveloper?

  5. Bagaimana cara menggunakan urutan Oracle yang ada untuk menghasilkan id dalam hibernasi?