2014-03-11 2 views
2

У меня есть приложение, использующее MyBatis, и я пытаюсь добавить SQL-запрос, содержащий несколько операторов.MySQL, MyBatis, ошибка грамматики

<select id="getReleaseDetails" resultType="maingrid" statementType="STATEMENT"> 
    DROP TEMPORARY TABLE IF EXISTS vrTmp; 
    DROP TEMPORARY TABLE IF EXISTS vrTmp2; 

    CREATE TEMPORARY TABLE vrTmp AS (
     SELECT vr.*, v.Code 

... и т.п.

Однако, я получаю сообщение об ошибке:

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP TEMPORARY TABLE IF EXISTS vrTmp2; 

    CREATE TEMPORARY TABLE vrTmp AS (
     S' at line 2 
] 
2014-03-11 12:48:20,069 [bio-8080-exec-3] DEBUG DataSourceUtils    - Returning JDBC Connection to DataSource 
2014-03-11 12:48:20,085 [bio-8080-exec-3] ERROR VRMService      - Error in getDetails : 
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP TEMPORARY TABLE IF EXISTS vrTmp2; 

    CREATE TEMPORARY TABLE vrTmp AS (
     S' at line 2 
The error may exist in mappings/mapping.xml 

SQL, прекрасно работает в SQLyog, используя один и тот же логин базы данных.

Что мне не хватает? Это похоже на то, что не нравится ";" для разделения отдельных заявлений.

Thanks

+0

Еще несколько поисков сегодня утром дали этот вопрос, в котором говорится, что в MySQL можно выполнить несколько SQL-запросов: http://stackoverflow.com/questions/7174225/mybatis-executing-multiple-sql-statements-in-one- идти-это-что-это возможно. У меня должно быть что-то еще не так. –

ответ

1

Вот некоторые проблемы.

  1. Вы не можете использовать несколько операторов в одном теге в mybatis. Следовательно, вы не можете использовать «;»
  2. Если вообще вы хотите использовать инструкцию create table, используйте тег insert.

Решение заключается в использовании хранимой процедуры для запуска нескольких операторов.

Ниже приведен пример хранимой процедуры и способа ее вызова из mybatis.

CREATE OR REPLACE PROCEDURE KP_PRC AS 
BEGIN 
     execute immediate 'DROP TEMPORARY TABLE IF EXISTS vrTmp'; 
     execute immediate 'DROP TEMPORARY TABLE IF EXISTS vrTmp2'; 
     execute immediate 'CREATE TEMPORARY TABLE vrTmp AS (SELECT vr.*, v.Code'; 
    commit; 

EXCEPTION 
    WHEN OTHERS THEN 
    RAISE; 

END KP_PRC; 

Mybatis xml.

<select id="kpSpCall" statementType="CALLABLE"> 
     {CALL KP_PRC()} 
</select> 
+0

Я не согласен с частью этого ответа. Вы можете делать несколько операторов в выборе Mybatis; пока последний является фактическим окончательным выбором. Мы делаем это все время с помощью приложений MSSQL. Мы просто бросаем «идти» между каждым, и это работает как шарм. Я стараюсь держаться подальше от маршрута хранимой процедуры. Когда вы идете по этому маршруту, это означает, что развертывание вашего приложения должно быть синхронизировано с обновлениями базы данных. Это можно сделать, это просто еще один уровень сложности, который я пытаюсь избежать. –

+0

Я считаю, что вы используете подзапрос или что-то для выбора ..... не многократное утверждение –

2

Понял, что по умолчанию соединение MySQL не позволяет выполнять несколько SQL-запросов. Он должен быть указан в URL:

url="jdbc:mysql://ln-ct-dv-my1:3306/TestDB?allowMultiQueries=true" 

... и мне пришлось удалить «StatementType» из файла отображения.

Смежные вопросы