【问题标题】:How to drop all procedures and functions in MySQL如何删除 MySQL 中的所有过程和函数
【发布时间】:2021-12-27 16:15:31
【问题描述】:

我想删除 MySQL 特定数据库中的所有过程和函数。我正在尝试使用这个存储过程来实现这一点。

但我收到一个错误:

错误代码:1295 准备好的语句协议尚不支持此命令。

提前致谢。

delimiter $$
CREATE PROCEDURE sp_drop_all_stored_procedures()
begin
    declare flag boolean default false;
    declare sql_drop_statement varchar(1000);
  
    declare statements cursor for SELECT
    CONCAT('DROP ',ROUTINE_TYPE, ' ', ROUTINE_NAME, ';') as stmt
    FROM information_schema.ROUTINES where ROUTINE_SCHEMA = 'DB_NAME' and 
    ROUTINE_NAME != sp_drop_all_stored_procedures;
    
    declare continue handler for not found set flag := true;

    open statements;
    statements_loop: loop
        fetch statements into sql_drop_statement;
        
        if flag then
            leave statements_loop;
        end if;

        set @drop_statement = sql_drop_statement;
        select @drop_statement;
        PREPARE stmt FROM @drop_statement;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;  
        
    end loop statements_loop;
    close statements;
    
end $$
delimiter ;

【问题讨论】:

  • MySQL 不支持在函数过程或触发器中删除和创建函数和过程或触发器。
  • 感谢您提供的信息。 ??????

标签: mysql mysql-workbench


【解决方案1】:

此处记录了可以作为预准备语句执行的 SQL 语句列表:https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html#prepared-statements-permitted(向下滚动页面大约三分之二)。

DROP PROCEDURE 和 DROP FUNCTION 不在其中。

但即使你避免使用准备好的语句,你也无法做到这一点:

mysql> create procedure d() drop procedure p;
ERROR 1357 (HY000): Can't drop or alter a PROCEDURE from within another stored routine

因此,我认为您不能在存储过程中执行此操作。您必须从客户端执行此操作,您可以在其中格式化每个 SQL 语句并直接执行它,而不是作为准备好的语句。

【讨论】:

  • 谢谢,我用bash脚本通过select语句获取了这个数据库的所有程序,一个接一个地删除。
猜你喜欢
  • 2012-10-13
  • 2011-01-12
  • 2019-04-12
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多