首页 > 解决方案 > 使用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

标签: mysqlsql

解决方案


仔细研究MySQL 8.0 Reference Manual / SQL Statements / Prepared Statements,“Prepared Statements中允许的SQL语法”部分。

本节要求准备好的语句中允许的语句的完整列表。ALTER VIEW列出。所以这是不允许的。

使用DROP VIEWandCREATE VIEW代替。

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


推荐阅读