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

big*_*7bb 5 mysql database loops

我对 MySQL 很陌生,我有一个存储过程,我想将其添加到几个旧数据库中。我正在使用 SQLyog,我想循环访问连接上的每个数据库,如果它匹配“application_%”(称为数据库application_clientName,有几十个)来运行存储过程。

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

我希望循环显示数据库中的所有数据库,并运行一条语句(如果它们的名称类似于“application_%”)。该语句将在该数据库中创建一个通用存储过程。

cmp*_*ken 8

好的,看起来数据库中的SCHEMATAinformation_scheme表包含所有数据库的列表。因此,为了获取要运行该过程的所有数据库的列表,您可以执行以下操作:

SELECT schema_name FROM information_schema.schemata
WHERE schema_name LIKE 'application_%';
Run Code Online (Sandbox Code Playgroud)

下一步是将其纳入某种程序。不幸的是,如果涉及创建过程,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 ;
Run Code Online (Sandbox Code Playgroud)

该过程生成后,调用该过程:

CALL create_procedures();
Run Code Online (Sandbox Code Playgroud)

这将输出一个列,其中包含为所有表创建过程所需的 SQL application_%。选择整个列(它会相当长),并将其作为新的 SQL 查询执行。

我从未使用过 SQLyog,但如果它不能正常工作,那么您可能需要使用 MySQL 的命令行界面。首先,生成一个文件input.sql,其中包含:

CALL create_procedures();
Run Code Online (Sandbox Code Playgroud)

然后执行以下命令:

mysql -u <username> -p --database=<dbname> -N -r -B < input.sql > proc.sql
mysql -u <username> -p --database=<dbname> < proc.sql
Run Code Online (Sandbox Code Playgroud)

更改<username><dbname>为适当的值(<dbname>可以是您有权访问的任何数据库)。如果没有遇到任何错误,那么您应该为每个数据库定义存储过程。