使用createNativeQuery调用Oracle存储过程

7
我需要使用JPA调用存储过程,并找到了这篇文章:http://www.oracle.com/technology/pub/articles/vasiliev-jpql.html,该文章介绍了如何使用EntityManager.createNativeQuery。然而,这个例子实际上调用了一个带有返回参数的函数。我尝试搜索调用没有返回值的存储过程的示例,但是没有找到任何内容。
我可以使用createNativeQuery来调用存储过程吗?或者需要修改存储过程成为一个函数(可能返回成功/失败的结果)?
谢谢!
3个回答

12

根据JPA维基百科:

1.4 存储过程

JPA没有直接支持存储过程的功能。但是可以通过使用本地查询在JPA中执行某些类型的存储过程。JPA中的本地查询允许执行任何返回空结果或返回数据库结果集的SQL查询。执行存储过程的语法取决于数据库系统。JPA不支持使用OUTPUT或INOUT参数的存储过程。一些数据库,如DB2、Sybase和SQL Server,允许存储过程返回结果集。Oracle不允许返回结果集,只允许返回OUTPUT参数,但它定义了一种CURSOR类型,可以作为一个OUTPUT参数返回。此外,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();

我的建议是:

  • 进行一些实验(即尝试)
  • 如果需要(并且可能的话),修改存储过程
  • 考虑提供商特定的扩展(作为最后的选择)

感谢Pascal提供的链接。我不知道在我的搜索中是如何错过那个页面的。 - sdoca

1
如果可能的话,您可能需要以这种方式包装过程调用:
em.createNativeQuery("BEGIN yourprocedure; END;")

使用过程返回值可能会有问题。将它们传递应该很容易。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接