我正在使用 JOOQ 调用现有的 MySql 存储过程。我的代码是用 Java 编写的。一切都很好,但在批量插入方面我有点困惑。例如,我有这样简单的:
private void executeBatch(DSLContext context, LinkedList<AbstractRoutine<Void>> procedures) {
BatchBindStep step = null;
for (AbstractRoutine<Void> procedure : procedures) {
step = context.batch (context.select(procedure.asField()));
}
step.execute();
}
提供的 LinkedList 中的每个过程都是一个更新或插入过程,具有自己的参数集,并且实际上已准备好执行。我只是想将它们绑定(bind)在一起以进行批处理。
当我尝试执行上面的代码时,出现错误:
Caused by: java.sql.BatchUpdateException: Can not issue SELECT via executeUpdate().
我做错了什么?我应该修理什么?我试图在网上搜索答案,但似乎使用 JOOQ 两个批处理存储过程调用并不那么流行。为了与我的 JOOQ 前应用程序的其余部分保持兼容性,我必须这样做....
最佳答案
As discussed on the user group ,目前(从 jOOQ 3.10 开始)在 jOOQ 中没有对批处理存储过程的开箱即用支持。待处理的功能请求在这里: https://github.com/jOOQ/jOOQ/issues/6813
解决方法
针对您的特定用例,有多种解决方法,包括:
- 使用暂存表并在其中加载数据/参数集。
- 使用 jOOQ 的 batching API 将数据直接加载到目标表中或 data loading API
- 如果您的数据库支持,则使用表值参数
- 绕过 jOOQ 并求助于普通 JDBC
关于java - 如何使用 JOOQ 批量执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47185044/