Oracle
 sql >> база данни >  >> RDS >> Oracle

Извикването на съхранена процедура с курсори хвърля изключение за невалидно име на колона

Простият пример как можете да го постигнете:

  1. Схема на базата данни.
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. Определението на обект.
@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. И употреба:
List<Order> orders = session.createNamedStoredProcedureQuery("fetch_patient_orders")
    .setParameter("patientId", 2L)
    .getResultList();

Беше тестван с hibernate 5.4.12.Final, ojdbc8.jar , Oracle12cDialect .Вижте също хибернацията документация .

Описаният по-горе подход ще работи в чисто приложение за хибернация, но не и в приложение за пролетно зареждане.

Според пролетното зареждане документация :

И така, пролетното зареждане използва HikariCP JDBC набор от връзки по подразбиране. И изглежда, че има проблем с REF_CURSOR регистриране на параметър:

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]

Когато използвам специфичния за Oracle набор от източници на данни в application.properties :

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

всичко работи добре.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle - Как да създам таблица, която има автоматично увеличаващ се уникален ключ за ID

  2. Услуги за бази данни на AWS и Oracle Cloud Platform

  3. Как мога да махна ограничение, което не е нула в Oracle, когато не знам името на ограничението?

  4. Преобразуване на Unixtime в Datetime SQL (Oracle)

  5. как да променя съществуващо ограничение за проверка?