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();

यह हाइबरनेट 5.4.12 के साथ परीक्षण किया गया था। अंतिम, 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]

जब मैं application.properties . में oracle विशिष्ट डेटा स्रोत पूल का उपयोग करता हूं :

# 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 में CHARTOROWID () फ़ंक्शन

  2. Oracle में कस्टम रिकॉर्ड प्रकारों की सूची लाने के लिए MyBatis मैपिंग

  3. ORA-22288:फ़ाइल या LOB कार्रवाई FILEOPEN विफल रही। फ़ाइल नाम, निर्देशिका का नाम गलत है

  4. Oracle स्कीमा प्राप्त करें

  5. PLSQL में अल्पविराम से अलग किए गए पैरामीटर में क्वेरी