我在 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/