我一直在尝试动态删除 MySQL 中的表、过程和函数。我这样做是因为我正在为项目动态创建它们,当项目版本发生变化时,我需要清理并重建它。
不过,我可以动态删除表;我不能动态删除过程和函数。
这是我使用的代码示例:
DELIMITER ;;
DROP PROCEDURE IF EXISTS md_remove_project; ;;
CREATE PROCEDURE md_remove_project()
begin
DECLARE TableName text;
DECLARE ProcName text;
DECLARE done int DEFAULT false;
DECLARE statement text;
DECLARE table_cursor CURSOR FOR
SELECT table_name FROM tmp_md_tables;
DECLARE proc_cursor CURSOR FOR
SELECT routine_name FROM tmp_md_procedures;
DECLARE func_cursor CURSOR FOR
SELECT routine_name FROM tmp_md_functions;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
# Drop all the 'md' tables..............................................
# This Works...
DROP TABLE IF EXISTS tmp_md_tables;
CREATE TEMPORARY TABLE tmp_md_tables
SELECT
table_name
FROM
information_schema.tables
WHERE
table_name LIKE 'md_%';
OPEN table_cursor;
table_loop: LOOP
FETCH table_cursor INTO TableName;
IF done THEN
LEAVE table_loop;
END IF;
SET @statement = CONCAT('DROP TABLE IF EXISTS ', TableName, ';');
PREPARE STATEMENT FROM @statement;
EXECUTE STATEMENT;
DEALLOCATE PREPARE STATEMENT;
END LOOP;
CLOSE table_cursor;
DROP TABLE IF EXISTS tmp_md_tables;
#-----------------------------------------------------------------------
# Drop all the 'md' procedures............................................
DROP TABLE IF EXISTS tmp_md_procedures;
CREATE TEMPORARY TABLE tmp_md_procedures
SELECT
routine_name
FROM
information_schema.routines
WHERE
routine_type = 'PROCEDURE'
and
routine_name LIKE 'md_%';
SET done = false;
OPEN proc_cursor;
proc_loop: LOOP
FETCH proc_cursor INTO ProcName;
IF ProcName = 'md_remove_project' THEN
ITERATE proc_loop;
END IF;
IF done THEN
leave proc_loop;
END IF;
SET @statement = CONCAT('DROP PROCEDURE IF EXISTS ', ProcName, ';');
PREPARE STATEMENT FROM @statement;
EXECUTE STATEMENT;
DEALLOCATE PREPARE STATEMENT;
END LOOP;
CLOSE proc_cursor;
DROP TABLE IF EXISTS tmp_md_procedures;
END;
;;
DELIMITER ;
#CALL md_remove_project;
所以我用名为 md_% 的过程创建了一个表,然后我遍历该表。对于每个 routine_name,我准备了一个语句来删除该过程。然后我收到以下消息:
错误代码:1295。预处理语句协议(protocol)尚不支持此命令
是否有任何其他解决方案来删除像“md_%”这样的过程???
谢谢。
最佳答案
使用 mysqli_...
函数时,无需尝试更改分隔符。只有在使用 MySQL(命令行)客户端时才需要更改分隔符命令。该命令实际上是一个 MySQL 客户端命令(客户端从不将其发送到服务器)。
服务器足够智能,可以识别CREATE PROCEDURE
命令并知道它以END;
因此,您可以简单地执行两个查询:首先是 DROP PROCEDURE IF EXISTS ...
,然后是 CREATE PROCEDURE ... END;
查询。
如果您必须在一次调用中完成它们,您可以使用mysqli::multi_query
但我建议不要这样做(因为可能存在严重的安全隐患)。
关于mysql - 如何使用准备好的语句动态删除存储过程和函数 (MySQL) -- DROP PROCEDURE LIKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36069582/