mysql - 使用mysql中的存储过程执行sql
问题描述
我有以下存储过程。想法是获取数据库列表并执行 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,“Prepared Statements中允许的SQL语法”部分。
本节要求准备好的语句中允许的语句的完整列表。ALTER VIEW
未列出。所以这是不允许的。
使用DROP VIEW
andCREATE VIEW
代替。
始终接收并调查所有错误消息。
推荐阅读
- java - 队列实现不返回第一个元素
- r - 在 ggplot 中有多行(熔融数据)的工作日解决方法吗?
- python - Keras 多层神经网络精度
- css - 选择焦点后保持背景颜色 Microsoft Edge
- java - Android Asset Manager 无法从 assets 目录加载 wav 文件资源
- java - android studio 将来自 firebase 的日期子项与日期设备进行比较
- javascript - 如何创建从excel数据到html显示的成绩表数据?
- mysql - 访问 MySQL 1:1 关系迁移问题
- javascript - 如何减少属性分配(解构,...)的输入?
- c++ - 如何在 C++ 中对向量的第二个元素执行 lower_bound 操作?