我有以下存储过程。这个想法是获取数据库列表并执行一条sql语句。
DELIMITER $$
CREATE PROCEDURE updateMySQL (
IN theSQL varchar(4000)
)
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE theDatabases varchar(100) DEFAULT "";
-- declare cursor for employee email
DEClARE curDatabase
CURSOR FOR
SELECT schema_name FROM information_schema.schemata where SCHEMA_NAME = 'mydb' order by 1;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
OPEN curDatabase;
getDatabase: LOOP
FETCH curDatabase INTO theDatabases;
IF finished = 1 THEN
LEAVE getDatabase;
END IF;
-- build email list
-- SET emailList = CONCAT(theDatabases,";",emailList);
SET @sql:=CONCAT('USE ',@curDatabase);
PREPARE dynamic_statement FROM @SQL;
EXECUTE dynamic_statement;
PREPARE dynamic_statement FROM @theSQL;
EXECUTE dynamic_statement;
END LOOP getDatabase;
CLOSE curDatabase;
END$$
DELIMITER ;
我正在尝试像这样执行存储过程,
SET @theSQL = 'ALTER VIEW `Reports` AS
SELECT DISTINCT
`tableA`.`Id` AS `Id`,
`tableA`.`letterId` AS `letterId`
FROM
`mytable` `tableA`
ORDER BY 1';
call updateMySQL(@theSQL);
编辑执行过程时出错, 错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行“NULL”附近使用的正确语法
我正在使用mysql 8.0.17
最佳答案
仔细调查MySQL 8.0 Reference Manual / SQL Statements / Prepared Statements ,“准备好的语句中允许的 SQL 语法”部分。
本节声明了准备语句中允许的语句的完整列表。 ALTER VIEW
未列出。所以这是不允许允许的。
改用DROP VIEW
和CREATE VIEW
。
始终接收并调查所有错误消息。
关于mysql - 使用mysql中的存储过程执行sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63262016/