0

我正在尝试调用一个返回输出游标 usign 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();

这一切都很好,但是,如果我尝试更改过程定义以将光标更改为第二个参数并在 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 所说,目前您要用于返回结果的 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 的一部分添加的存储过程功能。

于 2012-10-06T15:09:01.633 回答
0

乌代和史蒂夫都是对的。

到目前为止,OUT 参数应该是第一个参数。

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

您可以在 这里查看 JPA 2.1 规范

如果您现在想要 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 亮点页面

于 2013-01-27T08:43:13.010 回答
0

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

请参阅文档

于 2012-08-15T00:02:30.773 回答