MyBatis Mapper с несколькими SQL-кодами в одном методе с использованием DB2 - PullRequest
2 голосов
/ 18 февраля 2020

Мне нужно выполнить несколько SQL операторов в одном методе MyBatis Mapper, потому что 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 оператор больше не работает, потому что драйвер JDB C выдает следующее исключение:

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

This это просто простой пример, чтобы продемонстрировать проблему. Мне известно, что вы можете отправить каскадный оператор удаления в показанной ситуации.

Я прочитал сообщение StackOverflow, что несколько операторов SQL в одном вызове не поддерживаются некоторыми драйверами JDB C и не поддерживаются рекомендуется, но иногда вам нужно выполнять разные SQL в определенном порядке, поэтому определение нескольких методов сопоставления MyBatis не решает проблему.

Кто-нибудь знает, как этого достичь?

1 Ответ

1 голос
/ 18 февраля 2020

На стороне 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"

или создать и вызвать хранимую процедуру

...