【问题标题】:MySQL: Loop through databases and run a stored procedure on itMySQL:遍历数据库并在其上运行存储过程
【发布时间】:2011-01-23 15:51:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql database loops


    【解决方案1】:

    好的,看起来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"; -- 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
    

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

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 2021-05-24
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多