[英]How can I execute batch stored procedure call from java code?
我在 oracle 數據庫中有一個程序,它采用兩個參數:
procedure some_procedure(int x, int y)
我的項目使用 spring 啟動 + hibernate。 所以,問題是我如何使用 java 代碼中的批處理(例如 100)來執行這個存儲過程?
我發現了一些使用 @Procedure 注釋以及 StoredProcedureQuery 的示例 - 但這些僅用於簡單的非批處理調用。
還有人可以解釋我什么時候應該使用@Procedure 注釋而不是 StoredProcedureQuery?
調用存儲過程時,會得到OUT參數,不能通過調用改變。 如果存儲過程返回 ref_cursor,並且您想限制記錄,請更改存儲過程。
使用StoredProcedureQuery
,您將編寫更多代碼並手動管理調用過程(獲取 entityManager、打開事務、撥打電話、關閉事務......)。 使用 JPA 存儲庫,您可以通過注釋和 go 描述過程。 但兩種方法都有效。
升級版:
哦,小誤會。 您可以使用 StoredProcedureQuery 在一個事務中多次調用過程,這是您想要的嗎? 代碼如下所示:
public class ProcedureCall {
@Autowired
private EntityManagerFactory entityManagerFactory;
public void executeProcedureWithoutResult(Map<String, ?> parameters, String procedureName) {
EntityManager em = entityManagerFactory.createEntityManager();
StoredProcedureQuery procedureQuery1 = em.createNamedStoredProcedureQuery(procedureName);
StoredProcedureQuery procedureQuery2 = em.createNamedStoredProcedureQuery(procedureName);
fillProcedureParameters(procedureQuery1, parameters);
fillProcedureParameters(procedureQuery2, parameters);
try {
em.getTransaction().begin();
procedureQuery1.execute();
procedureQuery2.execute();
em.getTransaction().commit();
} catch (Exception e) {
rollbackTransaction(e, em.getTransaction());
} finally {
if (em.isOpen()) {
em.close();
}
}
}
private void fillProcedureParameters(StoredProcedureQuery sp, Map<String, ?> parameters) {
if (parameters.size() > 0) {
for (HashMap.Entry<String, ?> rec : parameters.entrySet()) {
sp.setParameter(rec.getKey(), rec.getValue());
}
}
}
如果您執行一個 procedureQuery 兩次,也許它甚至可以工作,但我沒有嘗試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.