好的,看起来在information_scheme
数据库中的SCHEMATA表包含了所有数据库的列表。因此,为了获取您想要运行该过程的所有数据库的列表,您可以执行以下操作:
SELECT schema_name FROM information_schema.schemata
WHERE schema_name LIKE 'application_%';
下一步是将其转化为某种过程。不幸的是,如果涉及创建过程,MySQL 在执行动态生成的 SQL 方面表现不佳。因此,我想出的纯 SQL 版本有点混乱。它归结为首先创建“生成器”过程,然后调用它,最后执行生成器的结果:
delimiter //
DROP PROCEDURE IF EXISTS create_procedures//
CREATE PROCEDURE create_procedures()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE db VARCHAR(255);
DECLARE appDBs CURSOR FOR SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'application_%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SET @procName = "simpleproc";
SET @output = "delimiter //";
OPEN appDBs;
REPEAT
FETCH appDBs INTO db;
IF NOT done THEN
SET @output = CONCAT(@output,'
DROP PROCEDURE IF EXISTS ',db,'.',@procName,'//
CREATE PROCEDURE ',db,'.',@procName,'()
BEGIN
SELECT 1;
END//');
END IF;
UNTIL done END REPEAT;
CLOSE appDBs;
SET @output = CONCAT(@output,'\ndelimiter ;');
SELECT @output AS procs;
END//
delimiter ;
生成此过程后,调用该过程:
CALL create_procedures();
这将输出一个包含创建所有application_%
表存储过程所需SQL的单个列。选择整个列(它可能很长),并将其作为新的SQL查询执行。
我从未使用过SQLyog,但如果它无法正常工作,则可能需要使用MySQL的命令行界面。首先,生成一个名为input.sql
的文件,其中包含:
CALL create_procedures();
然后执行以下命令:
mysql -u <username> -p --database=<dbname> -N -r -B < input.sql > proc.sql
mysql -u <username> -p --database=<dbname> < proc.sql
将<username>
和<dbname>
更改为适当的值(<dbname>
可以是您有权限访问的任何数据库)。如果没有遇到任何错误,则应为每个数据库定义了存储过程。