gpt4 book ai didi

java - 如何从java代码执行批量存储过程调用?

转载 作者:行者123 更新时间:2023-12-01 16:46:48 26 4
gpt4 key购买 nike

我在 oracle 数据库中有一个过程,它需要两个参数:

procedure some_procedure(int x, int y)

我的项目使用的是spring boot + hibernate。那么,问题是如何使用 java 代码中的批处理(例如 100)来执行此存储过程?

我发现了一些使用 @Procedure 注释以及 StoredProcedureQuery 的示例 - 但这些仅用于简单的非批处理调用。

有人可以解释一下我什么时候应该使用 @Procedure 注释而不是 StoredProcedureQuery 吗?

最佳答案

调用存储过程时,得到的是OUT参数,不能通过调用来改变。如果存储过程返回ref_cursor,并且您想限制记录,请更改存储过程。

使用StoredProcedureQuery,您将编写更多代码并手动管理调用流程(获取entityManager、打开事务、进行调用、关闭事务...)。使用 JPA 存储库,您可以通过注释来描述过程并继续。但这两种方法都有效。

更新:

哦,小误会。您可以使用 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 两次,也许它甚至可以工作,但我没有尝试。

关于java - 如何从java代码执行批量存储过程调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com