Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wywołanie procedury składowanej z kursorami zgłasza niepoprawny wyjątek nazwy kolumny

Prosty przykład, jak możesz to osiągnąć:

  1. Schemat bazy danych.
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. Definicja encji.
@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. I użycie:
List<Order> orders = session.createNamedStoredProcedureQuery("fetch_patient_orders")
    .setParameter("patientId", 2L)
    .getResultList();

Został przetestowany z hibernacją 5.4.12.Final, ojdbc8.jar , Oracle12cDialect .Zobacz także hibernację dokumentacja .

Opisane powyżej podejście będzie działać w czystej aplikacji do hibernacji, ale nie w wiosennej aplikacji rozruchowej.

Według wiosennego rozruchu dokumentacja :

Tak więc spring boot domyślnie używa puli połączeń HikariCP JDBC. I wygląda na to, że ma problem z REF_CURSOR rejestracja parametrów:

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]

Kiedy korzystam z puli źródeł danych Oracle w application.properties :

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

wszystko działa dobrze.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jaki jar jdbc użyć z oracle 11g i jdk 1.6 i jak podłączyć się do samego db

  2. Jak zidentyfikować dni powszednie w Oracle?

  3. Grupowanie/porządkowanie Oracle SQL

  4. Uzyskaj liczbę wszystkich tabel w schemacie

  5. Jak uzyskać dostęp do struktury i uzyskać listę kolumn, typy danych refcursora?