使用createNativeQuery调用Oracle存储过程

时间:2010-07-05 15:46:34

标签: java oracle stored-procedures jpa

我需要使用JPA调用存储过程并找到这篇文章:

http://www.oracle.com/technology/pub/articles/vasiliev-jpql.html

解释了如何使用EntityManager.createNativeQuery。但是,该示例实际上调用了一个具有return参数的函数。我已经尝试搜索一个调用没有返回但仍无法找到任何内容的存储过程的示例。

我可以使用createNativeQuery来调用过程吗?或者是否需要将过程修改为函数(可能返回成功/失败结果)?

谢谢!

3 个答案:

答案 0 :(得分:12)

来自JPA wiki:

  

1.4 Stored Procedures

     

JPA对存储过程没有任何直接支持。可以通过使用本机查询在JPA中执行某些类型的存储过程。 JPA中的本机查询允许任何不返回任何内容的SQL,或返回要执行的数据库结果集。执行存储过程的语法取决于数据库。 JPA不支持使用OUTPUT或INOUT参数的存储过程。某些数据库(如DB2,Sybase和SQL Server)允许存储过程返回结果集。 Oracle不允许返回结果集,只返回OUTPUT参数,但确实定义了可以作为OUTPUT参数返回的CURSOR类型。 Oracle还支持存储函数,可以返回单个值。通常可以使用本机SQL查询通过从Oracle DUAL表中选择函数值来执行存储函数。

     

某些JPA提供程序扩展了对存储过程的支持,有些还支持使用存储过程或自定义SQL覆盖实体的任何CRUD操作。一些JPA提供程序支持CURSOR OUTPUT参数。

     

在Oracle

上执行存储过程的示例
EntityManager em = getEntityManager();
Query query = em.createNativeQuery("BEGIN VALIDATE_EMP(P_EMP_ID=>?); END;");
query.setParameter(1, empId);
query.executeUpdate();

所以我的建议是:

  • 做一些实验(即试试)
  • 如果需要(如果可能)修改存储过程
  • 考虑提供商特定的扩展(作为最后的手段)

答案 1 :(得分:1)

如果可能,您可能需要以这种方式包装过程调用:

em.createNativeQuery("BEGIN yourprocedure; END;")

获取返回值可能会导致程序出现问题。传递它们应该很容易。

答案 2 :(得分:1)

如前所述,JPA规范尚不支持StoredProcedures,但EclipseLink JPA提供程序确实如此:

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#Using_EclipseLink_JPA_Extensions_for_Stored_Procedure_Query