mysql - 使用mysql中的存储过程执行sql

标签 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 ,“准备好的语句中允许的 SQL 语法”部分。

本节声明了准备语句中允许的语句的完整列表。 ALTER VIEW 列出。所以这是不允许允许的。

改用DROP VIEWCREATE VIEW

始终接收并调查所有错误消息。

关于mysql - 使用mysql中的存储过程执行sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63262016/

相关文章:

mysql - MySQL 应用程序中的安全 Multi-Tenancy

sql - 查找当年未续约的成员(member)

mysql - SQL:如果没有结束日期,则按开始日期排序

sql - 如何知道Azure数据库中一条记录的存储地址

mysql - 如何强制mariaDB使用索引?

mysql - 在 Mysql 中为多个根存储分层数据的最佳方法是什么?

mysql - "don' t 的数据库模式再次向我展示了我之前在 mysql 中看到的内容

php - 如何在php中一次上传多张图片?

java - 如何在列表的所有元素中选择位置

java - 为什么在MySQL中使用 "update"语句后hibernate总是调用 "select"语句?