2017-05-26 10 views
0

から結果セットを実行するためのMySQLでの方法があります:これは私が実行したいクエリのリストを与えるINFORMATION_SCHEMA

select CONCAT('ALTER TABLE ',table_name,' DROP edit_time;') AS query FROM information_schema.COLUMNS where column_name = 'edit_time' AND table_schema = 'homestead'; 

結果:

|query| 
ALTER TABLE node_fields DROP edit_time; 
ALTER TABLE node_list_role DROP edit_time; 
ALTER TABLE node_list_versions DROP edit_time; 
ALTER TABLE node_lists DROP edit_time; 
.. (etc) .. 

これは、すべての行を返します。そのフィールドをドロップしたいテーブル。しかし、のような何かを行うにはどのような方法があります:

EXECUTE {that query} 

または

FOREACH {results of that query} EXECUTE({that row}) 

私はmysqlの手順や、これは私には新しいものだけでなくので、論理的な文を知りません。

+0

これは基本的に必要なものです:https://stackoverflow.com/questions/999200/is-it-possible-to -execute-a-string-in-mysql – pilsetnieks

答えて

0

すべてのテキストを変数に選択し、それを使用してprepared statementを作成して実行します。準備されたステートメントには許可されていないものがいくつかあることに注意してください。

編集:下記のコメントの@BerndBuffenに記載されているように、準備された文で一度に1つのクエリしか実行できません。あなたは、元のクエリの結果セットをループする必要があるし、それらを一度に実行します - 次のストアドプロシージャをトリック実行する必要があります。

DELIMITER $$ 
CREATE DEFINER=`somebody`@`%` PROCEDURE `test_proc`() 
BEGIN 

DECLARE done INT DEFAULT 0; 
DECLARE tname TEXT DEFAULT ""; 

DECLARE exec_cur CURSOR FOR 
    SELECT table_name 
    FROM information_schema.COLUMNS  
    WHERE column_name = 'edit_time' 
    AND table_schema = 'homestead' 
    ; 

DECLARE CONTINUE HANDLER 
FOR NOT FOUND SET done=1; 

OPEN exec_cur; 

exec_loop: LOOP 
    FETCH exec_cur INTO tname; 
    IF done THEN 
     LEAVE exec_loop; 
    END IF; 

    SET @cmd = CONCAT("ALTER TABLE ", tname, " DROP edit_time;"); 

    PREPARE stmt FROM @cmd; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

END LOOP exec_loop; 

END$$ 
DELIMITER ; 

を...またはちょうどあなたの出力行をコピー元のクエリをクライアントに戻してから実行してください;-)

+0

@AC - プリペアドステートメント –

+0

@BerndBuffenはいとして1つのクエリしか実行できませんが、ストアドプロシージャの結果行をループして、良い点だけど、私はそれを編集するm OPには明らかではない –

関連する問題