Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DB2在一个方法中使用多个SQL的MyBatis映射器_Sql_Annotations_Db2_Mybatis_Mapper - Fatal编程技术网

使用DB2在一个方法中使用多个SQL的MyBatis映射器

使用DB2在一个方法中使用多个SQL的MyBatis映射器,sql,annotations,db2,mybatis,mapper,Sql,Annotations,Db2,Mybatis,Mapper,我需要在一个MyBatis映射器方法中执行几个SQL语句,因为SQL是相互依赖的。对于H2,这是没有问题的: @Delete("DELETE FROM DETAIL_TABLE " + " WHERE MASTER_ID IN " + " (SELECT ID FROM MASTER WHERE BUSINESS_KEY = #{businessKey});" + "DELETE FROM MASTER

我需要在一个MyBatis映射器方法中执行几个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
原因:com.ibm.db2.jcc.am.SqlSyntaxErrorException:db2sql错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=?;从主目录中删除;业务_KEY=;,的尾部;,驾驶员=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"

或者创建并调用存储过程

这是一个常见的需求,有一种称为“事务”的机制来对多个单独的语句调用进行分组。医生是。如果使用mybatis spring或mybatis spring引导,请参阅。对于mybatis guice,。问题不在于事务处理,而在于封装多个命令的DB2语法。谢谢,这就是我要寻找的语句。来自于Oracle的实时编程,DB2有点不同。@ThorstenKitz也许您的DBA会接受激活Oracle兼容性功能