好吧,它看起來像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>
可以是您有權訪問的任何數據庫)。如果您沒有遇到任何錯誤,那麼您應該爲每個數據庫定義存儲過程。
非常感謝。我在SQLyog中得到了這個工作,它爲我節省了大量的時間。 – 2010-03-05 10:29:58