Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Lệnh gọi thủ tục được lưu trữ với con trỏ ném ngoại lệ tên cột không hợp lệ

Ví dụ đơn giản về cách bạn có thể đạt được điều đó:

  1. Lược đồ cơ sở dữ liệu.
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. Định nghĩa thực thể.
@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. Và cách sử dụng:
List<Order> orders = session.createNamedStoredProcedureQuery("fetch_patient_orders")
    .setParameter("patientId", 2L)
    .getResultList();

Nó đã được thử nghiệm với hibernate 5.4.12.Final, ojdbc8.jar , Oracle12cDialect .Xem thêm ở chế độ ngủ đông tài liệu .

Cách tiếp cận được mô tả ở trên sẽ hoạt động trong một ứng dụng ngủ đông thuần túy, nhưng không hoạt động trong ứng dụng khởi động mùa xuân.

Theo tài liệu khởi động mùa xuân :

Vì vậy, khởi động mùa xuân sử dụng nhóm kết nối HikariCP JDBC theo mặc định. Và có vẻ như nó gặp sự cố với REF_CURSOR đăng ký tham số:

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]

Khi tôi sử dụng nhóm nguồn dữ liệu cụ thể của oracle trong application.properties :

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

tất cả đều hoạt động tốt.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nối hoặc đính kèm một đối tượng json bên trong một đối tượng json đối tượng json khác với plsql

  2. Oracle - Câu lệnh SELECT tốt nhất để nhận được sự khác biệt trong vài phút giữa hai cột DateTime?

  3. Tại sao dấu chấm phẩy không thể đặt trong CommandText của OracleCommand khi C #

  4. Thiếu biểu thức khi chọn tất cả các cột và một cột khác

  5. Hiểu đầy đủ về PDO ATTR_PERSISTENT