gpt4 book ai didi

MySQL:循环遍历数据库并在其上运行存储过程

转载 作者:可可西里 更新时间:2023-11-01 08:08:21 25 4
gpt4 key购买 nike

我是 MySQL 的新手,我有一个存储过程,我想将其添加到多个遗留数据库中。我正在使用 SQLyog,我想遍历连接上的每个数据库,如果它匹配“application_%”(数据库称为 application_clientName,有几十个)以运行存储过程。

我可以保存并通过 SQLyog 运行的脚本是理想的。

我有点想遍历 SHOW DATABASES 中的所有数据库,如果它们的名称是 LIKE 'application_%' 则运行一条语句。该语句将在该数据库中创建一个通用存储过程。

最佳答案

好的,它看起来像 SCHEMATA information_scheme 中的表数据库包含所有数据库的列表。因此,为了获得要在其上运行该过程的所有数据库的列表,您可以执行以下操作:

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"; -- Change this to your proc name

SET @output = "delimiter //";

OPEN appDBs;
REPEAT
FETCH appDBs INTO db;
IF NOT done THEN
-- Replace this procedure declaration with your procedure.
-- Make sure to keep the ',db,' syntax there.
-- You should really only have to change the parameters
-- and the stuff between the BEGIN and END clauses.
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> 可以是您有权访问的任何数据库)。如果您没有遇到任何错误,那么您应该为每个数据库都定义了存储过程。

关于MySQL:循环遍历数据库并在其上运行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2379116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com