2017-08-01 16 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 SQL文の準備](https://dev.mysql.com/doc/refman/5.7/en/sql-syntax- prepared-statements.html)。 – wchiquito

+0

これがどのように役立つか分かりませんか?識別子修飾子は、変数の使用について言及しません。準備された声明のガイドに同意してください。私は「データベース」は予約語ですが、それは一例です。投稿する前に私はすでに文書を読んでいました。 – williamsdb

答えて

0

あなたは、その場合には、文字列でクエリを構築するAN実行する必要があり、テーブルの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

アイバンありがとうございました。私は同じことを実行しなければならないという結論に至りましたが、PHPでも同じことをやっていることを決めました;-) – williamsdb

関連する問題