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



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

procedure some_procedure(int x, int y)

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

我找到了一些使用@Procedure注释和 StorageProcedureQuery 的示例 - 但这些仅用于简单的非批处理调用。

还有人可以解释我什么时候应该使用@Procedure注释而不是 StorageProcedureQuery?

调用存储过程时,会获取 OUT 参数,并且无法通过调用来更改它。如果存储过程返回ref_cursor,并且您希望限制记录,请更改存储过程。

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

上级:

哦,小误会。您可以使用 StorageProcedureQuery 在一个事务中多次调用过程,这是您想要的吗?代码如下所示:

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());
}
}
}

也许它甚至有效,如果你执行一个过程查询两次,但我没有尝试。

最新更新