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

Panggilan prosedur tersimpan dengan kursor melempar pengecualian nama kolom yang tidak valid

Contoh sederhana bagaimana Anda dapat mencapainya:

  1. Skema database.
create table MY_PATIENT
(
   PAT_RECID  number,
   PAT_NAME varchar2(100),
   
   constraint PAT_PK primary key(PAT_RECID)
);

create table MY_ORDER
(
   ORD_RECID  number,
   ORD_CODE varchar2(15),
   ORD_PATID number,
   
   constraint ORD_PK primary key(ORD_RECID),
   constraint ORD_PAT_FK foreign key(ORD_PATID) references MY_PATIENT(PAT_RECID),
   constraint ORD_CODE_UNIQUE unique (ORD_CODE)
);

CREATE OR REPLACE PROCEDURE fetch_patient_orders(
  patientId IN NUMBER, 
  patientOrders OUT SYS_REFCURSOR)
AS
BEGIN
   OPEN patientOrders FOR
   SELECT *
   FROM MY_ORDER
   WHERE ORD_PATID = patientId;
END;
 
  1. Definisi entitas.
@NamedStoredProcedureQueries(
   @NamedStoredProcedureQuery(
      name = "fetch_patient_orders",
      procedureName = "fetch_patient_orders",
      resultClasses = Order.class, 
      parameters = {
         @StoredProcedureParameter(
            name = "patientId",
            type = Long.class,
            mode = ParameterMode.IN
         ),
         @StoredProcedureParameter(
            name = "patientOrders",
            type = Class.class,
            mode = ParameterMode.REF_CURSOR
         )
      }
   )
)
@Entity
@Table(name = "MY_ORDER")
public class Order
{
   @Id
   @Column(name = "ORD_RECID")
   private Long id;
   
   @Column(name = "ORD_CODE")
   private String code;

   @ManyToOne
   @JoinColumn(name = "ORD_PATID")
   private Patient patient;
}
 
  1. Dan penggunaan:
List<Order> orders = session.createNamedStoredProcedureQuery("fetch_patient_orders")
    .setParameter("patientId", 2L)
    .getResultList();
 

Itu diuji dengan hibernate 5.4.12.Final, ojdbc8.jar , Oracle12cDialect .Lihat juga hibernate dokumentasi .

Pendekatan yang dijelaskan di atas akan berfungsi dalam aplikasi hibernasi murni, tetapi tidak pada aplikasi booting musim semi.

Menurut dokumentasi boot musim semi :

Jadi, boot musim semi menggunakan kumpulan koneksi HikariCP JDBC secara default. Dan sepertinya ada masalah dengan REF_CURSOR pendaftaran parameter:

o.h.r.j.i.ResourceRegistryStandardImpl : Registering statement [[email protected] wrapping oracle.jdbc.driver.[email protected]] o.h.type.descriptor.sql.BasicBinder : binding parameter [patientId] as [BIGINT] - [2] o.h.s.i.AbstractServiceRegistryImpl : Initializing service [role=org.hibernate.engine.jdbc.cursor.spi.RefCursorSupport] o.h.engine.jdbc.spi.SqlExceptionHelper : Error registering REF_CURSOR parameter [patientOrders] [n/a]

Ketika saya menggunakan kumpulan sumber data khusus Oracle di application.properties :

# com.zaxxer.hikari.HikariDataSource (default value)
spring.datasource.type=oracle.jdbc.pool.OracleDataSource
 

semua berfungsi dengan baik.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa mendapatkan akses awal ke pembaruan Oracle Java, sehingga saya dapat menguji RIA saya dan menghindari latihan kebakaran saat pembaruan ini dipublikasikan?

  2. ORACLE SDO_GEOMETRY ToString()?

  3. Bagaimana Anda bisa menjalankan kueri yang sama beberapa kali menggunakan loop di PL/SQL?

  4. Mengonversi CLOB ke NUMBER untuk dibandingkan - Oracle

  5. Bagaimana saya bisa menghindari kesalahan panjang variabel mentah yang terlalu panjang di SQL Developer?