建立在fancyPants的答案上,您可以在另一個查詢information_schema.tables的循環中調用該過程,以識別包含MyTable的數據庫,然後使用db名稱作爲參數調用fancyPants的過程。如果數據庫具有一致的命名方案或包含名稱相同的對象,則此方法非常簡單,這聽起來就像這裏的情況。結構會是這樣的:
DELIMITER //
DROP PROCEDURE IF EXISTS mydriver //
CREATE PROCEDURE mydriver()
BEGIN
DECLARE varSchemaName VARCHAR(64);
DECLARE done BOOLEAN;
DECLARE cur CURSOR FOR
SELECT table_schema
FROM information_schema.tables
WHERE table_name = 'MyTable';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO varSchemaName;
IF done THEN
LEAVE read_loop;
CLOSE cur;
END IF;
CALL fancypants_proc(varSchemaName);
END LOOP;
END //
DROP PROCEDURE IF EXISTS fancypants_proc //
CREATE PROCEDURE fancypants_proc(IN varSchemaName VARCHAR(64))
BEGIN
SET @sql = CONCAT('SELECT * FROM ', varSchemaName, '.MyTable');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
CALL mydriver();
謝謝,我只是試驗了這個自己,它似乎工作。如果我的查詢冗長而複雜,是否有更好的方法來聲明'@ sql'變量而不是將SQL代碼粘貼到字符串中呢? – Gruber
我害怕,不,沒有更好的辦法。 – fancyPants
我發現使用這種方法,您可以查詢單租戶數據庫設置,就像它是多租戶一樣。這非常強大,並將爲我解決很多麻煩。不幸的是,它不能用來發出'CREATE'語句。 – Gruber