выполнить операторы запроса результатов - PullRequest
4 голосов
/ 31 марта 2012

У меня есть набор таблиц с именем results_%, все с одинаковой структурой.

Я хотел бы добавить индекс к этим таблицам.

Я могу получить оператор alter для каждой таблицы в виде строки результата запроса select, но я не знаю, как выполнить эти операторы:

select concat( 'alter table ', test_db.table_name, ' add index `did` (`did`);' ) as statement 
from information_schema.tables test_db 
where test_db.table_name like 'results_%';

Что мне не хватает?

Результат (который я хотел бы выполнить вместо того, чтобы отображать его мне):

+---------------------------------------------------------+
| statement                                               |
+---------------------------------------------------------+
| alter table results_Em7777_spa add index `did` (`did`); |
| alter table results_KaEng_eng add index `did` (`did`);  |
| alter table results_Ka_spa add index `did` (`did`);     |
| alter table results_Mc_spa add index `did` (`did`);     |
| alter table results_Mo_eng add index `did` (`did`);     |
| alter table results_Pe_eng add index `did` (`did`);     |
| alter table results_SU_spa add index `did` (`did`);     |
| alter table results_Ta_spa add index `did` (`did`);     |
| alter table results_ba_eng add index `did` (`did`);     |
| alter table results_br_eng add index `did` (`did`);     |
| alter table results_ca_spa add index `did` (`did`);     |
| alter table results_ch_spa add index `did` (`did`);     |
| alter table results_da_spa add index `did` (`did`);     |
| alter table results_ga_eng add index `did` (`did`);     |
| alter table results_ge_spa add index `did` (`did`);     |
| alter table results_gk_eng add index `did` (`did`);     |
+---------------------------------------------------------+
16 rows in set (0.00 sec)

[EDIT]

Я пытался:

drop procedure if exists altlike; 
delimiter // 
create procedure altlike() 
begin 
   set group_concat_max_len = 65535; 
   select @altrlk:= concat( 'alter table ', test_db.table_name , ' add index `did` (`did`);' )
   from information_schema.tables test_db
   where test_db.table_name like "results_%"; 
   prepare statement from @altrlk; 
   execute statement; 
end // 
delimiter ; 
call altlike();

Но все равно не повезло: он изменяет только последнюю сопоставленную таблицу (results_gk_eng).

Ответы [ 2 ]

4 голосов
/ 31 марта 2012
drop procedure if exists `altlike`; 
DELIMITER // 
CREATE PROCEDURE `altlike` ()  
BEGIN
  DECLARE a,c VARCHAR(256);  
  DECLARE b INT;  
  DECLARE cur1 CURSOR FOR select concat(test_db.table_name)
  from information_schema.tables test_db 
  where test_db.table_name like 'results_%';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
  DECLARE CONTINUE HANDLER FOR 1061 SET b = 0;  
  OPEN cur1;  
  SET b = 0;    
  WHILE b = 0 DO  
    FETCH cur1 INTO a;  
    IF b = 0 THEN
      SET @c = concat ('ALTER IGNORE TABLE `', a, '` ADD INDEX `did` (`did`)');
      PREPARE stmt1 FROM @c;
      EXECUTE stmt1; 
      DEALLOCATE PREPARE stmt1; 
    END IF;  
  END WHILE;  
  CLOSE cur1;       
END //  
call altlike();
3 голосов
/ 31 марта 2012

Вы в основном выводите строки строки из БД, она не будет автоматически выполняться только потому, что она выглядит как оператор sql;

То, что вы можете сделать, это либо использовать язык программирования для выполнения построчно по мере получения результатов.

Или добавьте это в хранимую процедуру, где он передает вторичный блок выполнения.

Пример: ОТ http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ Подробнее об этом.

DELIMITER //  

CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT)  
BEGIN  
    DECLARE a, b, c INT;  
    DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;  
    OPEN cur1;  

    SET b = 0;  
    SET c = 0;  

    WHILE b = 0 DO  
        FETCH cur1 INTO a;  
        IF b = 0 THEN  
            SET c = c + a;  
    END IF;  
    END WHILE;  

    CLOSE cur1;  
    SET param1 = c;  

END //  
...