我需要在一个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"
或创建并调用存储过程