我正在尝试调用一个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时输出光标是否始终是存储过程中的第一个参数?它有解决方法吗?
答案 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重点页面