簡體   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