mysql - 如何删除 MySQL 中的所有过程和函数
问题描述
我想删除 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 ;
解决方案
可以作为准备好的语句执行的 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 语句并直接执行它,而不是作为准备好的语句。
推荐阅读
- ios - 逐步加速 animateWithDuration 方法
- c# - 如何在 Unity 中将玩家控制器锁定在 y 轴上
- javascript - 当*不*使用 CLI 时,Webpack 会在 Vue 中渲染 CSS
- javascript - 如何使用 ASP.NET MVC 通过 Ajax 将检查的行发送到服务器?
- reactjs - reactjs - axios - 请求如何改进
- python - 用 numpy.einsum 删除循环
- ios - 如何使用 MetalPetal 遮盖图像并以透明度输出
- python - 使用 Pyrebase 创建匿名用户并连接 Firebase 和访问数据库
- amazon-dynamodb - 就批量数据的性能而言,这是正确的方法。扫一扫或查询。获取 DynamoDB 中的所有表数据
- networking - 如何安全地使用 iPad Pro 作为远程开发工具?