簡體   English   中英

如何從 java 代碼執行批量存儲過程調用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM