2010-03-04 27 views
3

我對MySQL很陌生,我有一個存儲過程,我想添加到幾個舊數據庫。我正在使用SQLyog,我想遍歷連接上的每個數據庫,並且如果它匹配'application_%'(數據庫被稱爲application_clientName,有幾十個)來運行存儲過程。MySQL:通過數據庫循環並在其上運行存儲過程

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

我正在尋找循環SHOW DATABASES中的所有數據庫,並運行一個語句,如果他們的名字是LIKE'application_%'。該語句將在該數據庫中創建一個通用存儲過程。

回答

4

好吧,它看起來像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 

改變<username><dbname>爲適當的值(<dbname>可以是您有權訪問的任何數據庫)。如果您沒有遇到任何錯誤,那麼您應該爲每個數據庫定義存儲過程。

+0

非常感謝。我在SQLyog中得到了這個工作,它爲我節省了大量的時間。 – 2010-03-05 10:29:58