0

次のように、JPAを使用して出力カーソルを返すOracleストアドプロシージャを呼び出そうとしています

  create or replace PROCEDURE stored_proc(ret_cursor OUT sys_refcursor, inputParam IN NUMBER)
   -- body 
  END stored_proc;

  @Entity
  @NamedNativeQuery(name = "callStoredProc",  
         resultClass = Result.class,  
         query = "{call stored_proc(?,:inputParam)}",  
        callable = true,
        readOnly=true
  )
  public class Result{
    // map the result set params.
  }  

  //JPA code to get result set 
  List<Result> resultList =  getEntityManager().createNamedQuery("callStoredProc")
                                        .setParameter("inputParam", inputParam)
                            .getResultList();

これはすべて正常に機能しますが、プロシージャ定義を変更してカーソルを2番目のパラメーターとして変更し、対応するパラメーターをJPAコードでも変更しようとすると、機能しません。エラーが発生します

[4/30/12 11:42:30:505 CDT] 00000025 SystemErr R 原因: java.sql.SQLException: ORA-06550: 行 1、列 7: PLS-00306: 呼び出しの引数の数または型が正しくありません'stored_proc'

    create or replace PROCEDURE stored_proc(inputParam IN NUMBER,ret_cursor OUT sys_refcursor)

JPAを使用する場合、出力カーソルは常にストアドプロシージャの最初のパラメータにする必要がありますか? 回避策はありますか?

4

3 に答える 3

0

UdayとSteveはどちらも正しいです。

今のところ、OUTパラメータが最初の引数である必要があります。

また、ストアドプロシージャのサポートを取得するには、JPA2.1のリリースまで待つ必要があります。

ここでJPA2.1仕様を確認でき ます

今すぐjpa2.1の実装が必要な場合は、EclipseLinkがその競争に勝っています。EclipseLinkによるJPA2.1の実装状況はここにあります-http ://wiki.eclipse.org/EclipseLink/Development/JPA_2.1 および例はここにあります-http: //wiki.eclipse.org/EclipseLink/Examples/JPA/StoredProcedures

また、 https: //blogs.oracle.com/arungupta/entry/jpa_2_1_early_draftのArunGuptaによるJPA2.1ハイライトのページにアクセスすることもできます。

于 2013-01-27T08:43:13.010 に答える
0

Uday が言うように、現在、結果を返すために使用する OUT パラメータは最初のパラメータでなければなりません。

とはいえ、ご覧になりたい場合 (さらにはフィードバックを提供したい場合) は、GitHub マスターで CallableStatement のサポートを改善するためのサポートが既に提供されています: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core /src/main/java/org/hibernate/StoredProcedureCall.java

StoredProcedureCall spc = session.createStoredProcedureCall( "stored_proc", Result.class )
spc.registerStoredProcedureParameter( 2, ResultSet.class, ParameterMode.REF_CURSOR );
// registering IN parameters is generally optional

// thinking I will change this method name to execute()....
StoredProcedureOutputs spo = spc.getOutputs();
StoredProcedureReturn spr = spo.getNextReturn();
assert spr.isResultSet();
StoredProcedureResultSetReturn sprsr = (StoredProcedureResultSetReturn) spr;
List<Result> results = (List<Result>) sprsr.getResultList();

これはすべて、JPA 2.1 EG の一部として追加するストアド プロシージャ機能をサポートするためのものです。

于 2012-10-06T15:09:01.633 に答える
0

はい、プロバイダーとして Hibernate を使用している場合は、OUTパラメーターを最初のパラメーターとして使用する必要があります。

ドキュメントを参照してください。

于 2012-08-15T00:02:30.773 に答える