使用createNativeQuery调用Oracle存储过程

sdo*_*oca 7 java oracle stored-procedures jpa

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

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

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

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

谢谢!

Pas*_*ent 12

来自JPA维基:

1.4存储过程

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

一些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();
Run Code Online (Sandbox Code Playgroud)

所以我的建议是:

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