Синтаксическая ошибка при создании процедуры в MySQL - PullRequest
0 голосов
/ 12 июня 2018

У меня есть этот запрос.

SELECT distinct c.reportingDate, c.clientId
FROM clients AS c
WHERE NOT EXISTS 
      ( SELECT 1
        FROM accounts_europe AS e
        WHERE e.reportingDate = c.reportingDate
          AND e.clientId = c.clientId

        union

        SELECT 1 -- line A. unexpected select error
        FROM accounts_usa AS u
        WHERE u.reportingDate = c.reportingDate
          AND u.clientId = c.clientId
      ) ;

, когда он выполняется в MySQL, он отображает синтаксическую ошибку, которая говорит "неожиданный выбор" в строке A.

Однако, поскольку запросверно, когда я выполняю его, он действительно выполняется и возвращает правильные результаты.

Когда я пытаюсь создать процедуру, которая содержит точно такую ​​же вещь, она не может быть скомпилирована.Исходный код:

CREATE PROCEDURE `proc_sample`()
BEGIN
    SELECT distinct c.reportingDate, c.clientId
    FROM clients AS c
    WHERE NOT EXISTS 
          ( SELECT 1
            FROM accounts_europe AS e
            WHERE e.reportingDate = c.reportingDate
              AND e.clientId = c.clientId

            union

            SELECT 1 -- line A. unexpected select error
            FROM accounts_usa AS u
            WHERE u.reportingDate = c.reportingDate
              AND u.clientId = c.clientId
          ) ;
END

Отображаемое сообщение: «Оператор DDL объекта содержит синтаксические ошибки».Я что-то не так делаю или это ошибка в MySQL верстак?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Эта ошибка возникает из-за ошибки грамматики MySQL *, которая была исправлена.Вместо этого попробуйте последнюю версию Workbench (в настоящее время WB 8.0.11 RC, см. «Разработки для разработчиков» на странице загрузки).Это должно работать для вас.

(*) MySQL Workbench использует ANTLR4 для анализа кода SQL.Это требует грамматики MySQL для генерации парсера.

0 голосов
/ 12 июня 2018

Ваш запрос синтаксически правильный.Это может быть ошибка рабочего места.Переходя к хранимой процедуре, вы сможете создать его с этим запросом.Попробуйте создать SP, используя запрос ниже.В моем случае я могу создать SP, используя это.Скопируйте этот запрос, откройте новый редактор запросов в рабочей среде и вставьте его туда, выберите все и нажмите Ctrl + Shift + Enter

USE `YOUR_DB`;
DROP procedure IF EXISTS `proc_sample`;

DELIMITER $$
USE `YOUR_DB`$$
CREATE DEFINER=`admin`@`%` PROCEDURE `proc_sample`()
BEGIN
    SELECT distinct c.reportingDate, c.clientId
    FROM clients AS c
    WHERE NOT EXISTS 
          ( SELECT 1
            FROM accounts_europe AS e
            WHERE e.reportingDate = c.reportingDate
              AND e.clientId = c.clientId

            union

            SELECT 1
            FROM accounts_usa AS u
            WHERE u.reportingDate = c.reportingDate
              AND u.clientId = c.clientId
          ) ;
END$$

DELIMITER ;
...