2017-08-01 46 views
0

我想循環遍歷一個包含另一個數據庫的數據庫名稱的表中的所有行。這是我編寫的內容,但不起作用,因爲MySQL將'數據庫'位作爲實際數據庫名稱而不是內容。在SELECT語句中使用變量引用另一個數據庫

我該如何更改以下內容才能獲取變量的內容?

DROP PROCEDURE IF EXISTS CYCLE; 
DELIMITER ;; 
CREATE PROCEDURE CYCLE() 
BEGIN 
    DECLARE data_name CHAR(255); 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE cursor_i CURSOR FOR SELECT database FROM company; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN cursor_i; 
    read_loop: LOOP 
    FETCH cursor_i INTO database; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    SELECT * FROM database.table LIMIT 1; 
    END LOOP; 
    CLOSE cursor_i; 
END; 
;; 
DELIMITER ; 

更新:要清楚我知道'數據庫'是一個保留字。我用這裏代替了我用過的實際變量名稱。

+0

請參見[9.2.1標識符限定符](https://dev.mysql.com/doc/refman/5.7/en/identifier-qualifiers.html),[9.3關鍵字和保留字](https:/ /dev.mysql.com/doc/refman/5.7/en/keywords.html)和[13.5 Prepared SQL Statement Syntax](https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-製備-statements.html)。 – wchiquito

+0

不知道這有幫助嗎?標識符限定符沒有提及使用變量。關於準備好的陳述同上。我知道'數據庫'是一個保留字,但是這只是一個例子。在發佈之前,我已經完成了文檔。 – williamsdb

回答

0

無法評估對錶的SELECT語句的變量的內容,在這種情況下,你必須在一個字符串構建查詢的執行:

DROP PROCEDURE IF EXISTS CYCLE; 
DELIMITER ;; 
CREATE PROCEDURE CYCLE() 
BEGIN 
    DECLARE data_name CHAR(255); -- unused? 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE cursor_i CURSOR FOR SELECT database_name FROM company; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN cursor_i; 
    read_loop: LOOP 
    FETCH cursor_i INTO data_name; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    -- now build the query before execute: 
    set @sql = concat('SELECT * FROM `',data_name,'`.`your_table` LIMIT 1'); 

    -- and execute 
    prepare stmt from @sql; 
    execute stmt; 
    deallocate prepare stmt ; 

    END LOOP; 
    CLOSE cursor_i; 
END; 
;; 
DELIMITER ; 

*能更好地不混淆我們使用的變量名這會導致更多的問題。 #JustSaying

+0

感謝Ivan,我得出了關於不得不執行的結論,但也決定在PHP中做同樣的事情;-) – williamsdb

相關問題