sql - MyBatis Mapper 使用 DB2 在一种方法中包含多个 SQL
问题描述
我需要在一个 MyBatis Mapper 方法中执行多个 SQL 语句,因为这些 SQL 是相互依赖的。使用 H2,这没问题:
@Delete("DELETE FROM DETAIL_TABLE " +
" WHERE MASTER_ID IN " +
" (SELECT ID FROM MASTER WHERE BUSINESS_KEY = #{businessKey});" +
"DELETE FROM MASTER " +
" WHERE BUSINESS_KEY = #{businessKey}; ")
void delete(@Param("businessKey") Integer businessKey);
当切换到 DB2 时,该语句不再起作用,因为 JDBC 驱动程序抛出以下异常:
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=?;DELETE FROM MASTER WHERE;TAIL WHERE BUSINESS_KEY =;<space>, DRIVER=4.26.14
这只是一个简单的例子来演示这个问题。我知道您可以在所示情况下发送级联删除语句。
我读了一篇 StackOverflow 的帖子,说一些 JDBC 驱动程序不支持一次调用中的多个 SQL 语句,不推荐使用,但有时您需要按一定顺序执行不同的 SQL,因此定义多个 MyBatis 映射器方法并不能解决问题。
有谁知道如何实现这一目标?
解决方案
在 DB2 端,您可以运行复合语句
"BEGIN ATOMIC" +
" DELETE FROM DETAIL_TABLE" +
" WHERE MASTER_ID IN" +
" (SELECT ID FROM MASTER WHERE BUSINESS_KEY = #{businessKey});" +
" DELETE FROM MASTER" +
" WHERE BUSINESS_KEY = #{businessKey};" +
"END"
或创建并调用存储过程
推荐阅读
- angular - 如何删除/隐藏按列重复的单元格文本
- android - 如何在 recyclerView 中的两个不同项目之间显示不同的项目?
- go - 如何配置 go 以使用 px 代理?
- sharepoint-online - 我们可以自定义 SharePoint 现代应用栏吗
- json - 如何显示所有寄存器,同时按id过滤,其中id应该等于数组中的另一个id(VUE 3)
- python - 如果未选择任何选项,则短跑回调
- arrays - 想要用定义的结构替换 ruby 中的过滤器数组
- android - 无法在 Flutter http 包中捕获 SocketException
- reactjs - 更改 React 状态需要时间,因此它在功能逻辑中采用旧状态
- c# - Unity - 在一行中获取组件并检查空值?