簡體   English   中英

MySQL:循環訪問數據庫並在其上運行存儲過程

[英]MySQL: Loop through databases and run a stored procedure on it

我是MySQL的新手,我有一個存儲過程,我想添加到幾個遺留數據庫。 我正在使用SQLyog,我想遍歷連接上的每個數據庫,如果它匹配'application_%'(數據庫稱為application_clientName ,有幾十個)來運行存儲過程。

我可以保存並運行SQLyog的腳本是理想的。

我有點想要遍歷SHOW DATABASES中的所有數據庫並運行一個語句,如果它們的名字是LIKE'application_%'。 該語句將在該數據庫中創建一個通用存儲過程。

好的,看起來information_scheme數據庫中的SCHEMATA表包含所有數據庫的列表。 因此,為了獲得要運行該過程的所有數據庫的列表,您可以執行以下操作:

SELECT schema_name FROM information_schema.schemata
WHERE schema_name LIKE 'application_%';

下一步是將其用於某種程序。 不幸的是,如果涉及創建過程,MySQL不能很好地執行動態生成的SQL。 因此,我提出的純SQL版本有點亂。 它歸結為首先創建'generator'過程,然后調用它,最后執行生成器的結果:

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>可以是您有權訪問的任何數據庫)。 如果您沒有遇到任何錯誤,那么您應該為每個數據庫定義存儲過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM