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 .hibernate も参照してくださいドキュメント

    上記のアプローチは、純粋なHibernateアプリケーションでは機能しますが、SpringBootアプリでは機能しません。

    スプリングブートによると、ドキュメント

    そのため、スプリングブートはデフォルトでHikariCPJDBC接続プールを使用します。また、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でオラクル固有のデータソースプールを使用する場合 :

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

    すべて正常に動作します。




    1. 前月の合計の新しい列を紹介します

    2. SQLSTATE [HY000][2005]不明なMySQLサーバーホスト'localhost:3306'(2)

    3. OctoberCMS:双方向の友情関係を維持する方法は?

    4. LinuxでデフォルトのMySQL/MariaDBポートを変更する方法