[英]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.