繁体   English   中英

使用createNativeQuery调用Oracle存储过程

[英]Call Oracle Stored Procedure Using createNativeQuery

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

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

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

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

谢谢!

来自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(); 

所以我的建议是:

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

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

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

通过程序获得返回值可能会有问题。 传递它们应该很容易。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM