jpa使用输出游标调用存储过程

时间:2012-04-30 16:05:57

标签: hibernate jpa

我正在尝试调用一个oracle存储过程,它返回一个输出游标,使用JPA,如下所示

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

这一切都很好但是,如果我尝试更改过程定义以将光标更改为 第二个参数并在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时输出光标是否始终是存储过程中的第一个参数?它有解决方法吗?

3 个答案:

答案 0 :(得分:0)

是的,如果您使用Hibernate作为提供者,则需要使用OUT参数作为第一个参数。

请参阅documentation

答案 1 :(得分:0)

正如Uday所说,目前要用于返回结果的OUT参数必须是第一个参数。

也就是说,如果你想看一眼(甚至提供反馈),GitHub master已经支持改进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的一部分添加的存储过程功能。

答案 2 :(得分:0)

Uday和Steve都是对的。

截至目前,OUT参数应该是第一个参数。

我们必须等到JPA 2.1发布才能获得对存储过程的支持。

您可以查看JPA 2.1 Spec here

如果您现在想要jpa 2.1实现,那么EclipseLink在该竞赛中处于领先地位。 你可以在这里找到EclipseLink的JPA 2.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

中的Arun Gupta的JPA 2.1重点页面