Mysql:ER_PARSE_ERROR:从节点js发送创建过程代码时

时间:2019-05-04 09:30:23

标签: mysql node.js stored-procedures escaping

我正在尝试将创建过程查询从节点js发送到MYSQL。 我正在阅读Mysql.proc表以获取存储过程定义。

从mysql客户端(如workbench或hedis)提交时,mysql代码工作正常

从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 :(得分:0)

DELIMITER指令不是MySQL Server SQL的一部分。仅与交互式 client 实用程序一起使用,该实用程序将输入流或屏幕上文本框的内容解析为单独的语句-例如工作台或(大概)“ hedis”(可能是这样) 。

使用编程库发送查询时不使用它。

只需将过程声明作为单个查询发送即可。在此之前,将USE语句作为单独的查询发送。

第一个查询:

USE qwe

(服务器实际上并不希望在第一个查询中使用尾部分号,但如果您将其发送,则是允许的。)

第二个查询:

CREATE PROCEDURE ...
...
END

不应在DELIMITER //之前,也不应在//之后。这些都是客户端构造,对服务器没有意义。

无需使用您的formattdSQL.replace(...)语句删除换行符。这样做只会使您的代码不可读,并且不需要。