2010-07-05 186 views
6

我需要調用使用JPA存儲過程並發現這篇文章:調用Oracle存儲過程使用createNativeQuery

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

這也解釋瞭如何使用EntityManager.createNativeQuery。但是,該示例實際上調用了具有返回參數的函數。我試過尋找一個調用沒有返回的存儲過程的例子,但一直沒能找到任何東西。

我可以使用createNativeQuery調用過程嗎?還是該過程需要修改爲一個函數(可能返回成功/失敗結果)?

謝謝!

回答

11

從JPA維基:

1.4 Stored Procedures

JPA沒有對存儲過程的任何直接支持。通過使用原生查詢,某些類型的存儲過程可以在JPA中執行。 JPA中的本地查詢允許任何不返回任何SQL的SQL,或返回要執行的數據庫結果集。執行存儲過程的語法取決於數據庫。 JPA不支持使用OUTPUT或INOUT參數的存儲過程。某些數據庫(如DB2,Sybase和SQL Server)允許存儲過程返回結果集。 Oracle不允許返回結果集,僅允許OUTPUT參數,但確實定義了可作爲OUTPUT參數返回的CURSOR類型。 Oracle還支持可以返回單個值的存儲函數。通過從Oracle DUAL表中選擇函數值,通常可以使用本機SQL查詢來執行存儲函數。

某些JPA提供程序擴展了對存儲過程的支持,有些還支持使用存儲過程或自定義SQL重寫實體的任何CRUD操作。一些JPA提供者支持CURSOR OUTPUT參數。

例執行甲骨文

EntityManager em = getEntityManager(); 
Query query = em.createNativeQuery("BEGIN VALIDATE_EMP(P_EMP_ID=>?); END;"); 
query.setParameter(1, empId); 
query.executeUpdate(); 

一個存儲過程,我的建議是:

  • 做一些性實驗(即嘗試)
  • 如果需要的話(如果可能的話)修改存儲過程
  • 考慮提供商特定的擴展(作爲最後的手段)
+0

感謝帕斯卡爾的鏈接。我不知道我在搜索中錯過了那個頁面。 – sdoca 2010-07-05 16:23:00

1

如果可能的話,你可能需要包裝的過程調用是這樣的:

​​3210

獲取返回值回可能是程序問題。傳遞他們應該很容易。