我正在尝试将创建过程查询从节点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','');
我希望应该从节点成功执行创建过程查询
答案 0 :(得分:0)
DELIMITER
指令不是MySQL Server SQL的一部分。仅与交互式 client 实用程序一起使用,该实用程序将输入流或屏幕上文本框的内容解析为单独的语句-例如工作台或(大概)“ hedis”(可能是这样) 。
使用编程库发送查询时不使用它。
只需将过程声明作为单个查询发送即可。在此之前,将USE
语句作为单独的查询发送。
第一个查询:
USE qwe
(服务器实际上并不希望在第一个查询中使用尾部分号,但如果您将其发送,则是允许的。)
第二个查询:
CREATE PROCEDURE ...
...
END
不应在DELIMITER //
之前,也不应在//
之后。这些都是客户端构造,对服务器没有意义。
无需使用您的formattdSQL.replace(...)
语句删除换行符。这样做只会使您的代码不可读,并且不需要。