MySQL用JSON数组按LIKE批量创建新表出现1064语法错误如何解决
报错原因
一共有3个核心语法错误导致执行失败:
- MySQL自定义函数必须显式声明返回值类型,你创建的
example()函数没有定义RETURNS子句,如果不需要返回值应该改用存储过程(PROCEDURE)而不是函数,这也是你收到的报错指向BEGIN位置的直接原因。 CREATE TABLE等DDL语句不支持直接将JSON_VALUE()的返回值作为表名标识符,必须通过动态预处理SQL的方式拼接语句后执行。- 循环内的
CREATE TABLE语句末尾缺少分号结束符,不符合SQL语法规范。
解决方法
把自定义函数改成存储过程,内部用预处理语句动态生成建表SQL执行,修正后的代码如下:
DELIMITER // CREATE PROCEDURE example() BEGIN DECLARE _counter INT DEFAULT 0; DECLARE _orig_table VARCHAR(50); DECLARE _new_table VARCHAR(50); SET @origTables = '["tutorials_tb2","tutorials_tbl"]'; SET @newTables = '["tutorials_tb2_new","tutorials_tbl_new"]'; WHILE _counter < JSON_LENGTH(@origTables) DO -- 取出当前循环对应的原表名和新表名 SET _orig_table = JSON_VALUE(@origTables, CONCAT('$[',_counter,']')); SET _new_table = JSON_VALUE(@newTables, CONCAT('$[',_counter,']')); -- 拼接动态建表语句 SET @sql = CONCAT('CREATE TABLE ', _new_table, ' LIKE ', _orig_table); -- 预处理并执行SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 计数器自增 SET _counter = _counter + 1; END WHILE; END // DELIMITER ; -- 调用存储过程执行批量建表 CALL example();
内容的提问来源于stack exchange,提问作者Raja G
相关产品推荐
相关产品推荐

