Mysql: ER_PARSE_ERROR: при отправке кода создания процедуры с узла js - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь отправить запрос на создание процедуры из узла js в MYSQL. Я читаю таблицу Mysql.proc, чтобы получить определения хранимых процедур.

MySQL код работает нормально при отправке из клиента MySQL, как Workbench или Hedis

Получение следующей ошибки при отправке кода из NodeJS

{ Error: ER_PARSE_ERROR: 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 'CREATE PROCEDURE `qwe`.`USP_GET_ALL_STOCK_WITH_INDICATORS`( IN `IPV_DATE` DATE )' at line 1
    .
    .
    .
  code: 'ER_PARSE_ERROR',
  errno: 1064,
  sqlMessage:
   '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 \'CREATE PROCEDURE `qwe`.`USP_GET_ALL_STOCK_WITH_INDICATORS`( IN `IPV_DATE` DATE )\' at line 1',
  sqlState: '42000',
  index: 0,
  sql:
   'USE qwe;    CREATE PROCEDURE `qwe`.`USP_GET_ALL_STOCK_WITH_INDICATORS`( IN `IPV_DATE` DATE )BEGIN IF NOT EXISTS(SELECT 1 FROM StockCandle where `DATE`=IPV_DATE) THEN SET @D:=(SELECT MAX(`DATE`) FROM StockCandle); ELSE SET @D:=IPV_DATE; END IF; -- select @D; SELECT  SM.Symbol, SM.MA13, SM.MA8, SM.MA5, CASE WHEN SM.MA5>SM.MA8 AND SM.MA8>MA13 THEN \'>>>\' WHEN SM.MA5<SM.MA8 AND SM.MA8<MA13 THEN \'<<<\' ELSE NULL
END ALLIGATOR ,SM.RSI, SM.BHAVTIME, SM.CANDLEINDICATOR FROM StockMaster SM  where SM.DATE=@D; END // ' }

попробовал код ниже, чтобы сократить sql в узле

formattdSQL = formattdSQL.replace(/(?:\\[rtn]|[\r\t]+)+/g, ' ');

Запрос на получение процедуры

SELECT `name`, CONVERT(param_list USING utf8), CONVERT(body USING utf8)
INTO @spname, @spparams, @spbody
FROM mysql.proc WHERE `name` = 'USP_GET_ALL_STOCK_WITH_INDICATORS' AND db = v_oldDB;
SET @sql = CONCAT(@sql, '\r\n', 'DELIMITER //','\r\n','CREATE PROCEDURE `', v_newDB, '`.`', @spname, '`(', @spparams,')',@spbody, ' //', '\r\n','');

Я ожидаю, что запрос на создание процедуры должен быть успешно выполнен с узла

1 Ответ

0 голосов
/ 05 мая 2019

Директива DELIMITER не является частью MySQL Server SQL. Это используется только с интерактивными клиентскими утилитами, которые анализируют входной поток или содержимое экранного текстового поля в отдельные операторы - такие как верстак или (предположительно) "хедис" (что бы это ни было).

Вы не используете его, когда используете библиотеку программирования для отправки запроса.

Просто отправьте объявление процедуры в виде одного запроса. Перед этим отправьте оператор USE в виде отдельного запроса.

Первый запрос:

USE qwe

(Завершающая точка с запятой в первом запросе на самом деле не ожидается сервером, но разрешена, если вы ее отправите.)

Второй запрос:

CREATE PROCEDURE ...
...
END

Не должно быть ни DELIMITER // до, ни // после. Это все клиентские конструкции, не имеющие значения для сервера.

Нет необходимости использовать ваше заявление formattdSQL.replace(...) для удаления новых строк. Это только делает ваш код нечитаемым и не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...