2012-03-31 9 views
4

results_ %라는 테이블 집합이 있는데 모두 같은 구조입니다.쿼리 결과 문을 실행하십시오.

이 테이블에 색인을 추가하고 싶습니다.

는 내가 선택 쿼리 결과의 행으로 각 테이블에 대한 ALTER 문을 얻을 수 있지만이 문을 실행하는 방법을 모른다 :

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_%'; 

나는 무엇을 놓치고?

(난 그냥 나에게 표시가 대신 실행하려는)을 OUPUT : 아무 여전히

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(); 

그러나 :

+---------------------------------------------------------+ 
| 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) 

[편집]

내가 시도

luck : 마지막으로 일치하는 테이블 (results_gk_eng) 만 변경합니다.

+0

당신은 준비/실행을 시도 할 수는 : http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html – zerkms

+0

나는 또한 그 거라 생각 생각이지만 문서를 읽은 후에도 나는 이것을 사용하는 방법을 알 수 없다. – NotGaeL

+0

무엇이 문제입니까? 결과 집합을 반복 실행하고 줄 단위로 실행하는 프로 시저 작성 – zerkms

답변

3
당신은 기본적으로 DB에서 문자열의 라인을 인쇄

, 그것은 자동으로이 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 // 
+0

알다시피,이 출력을 실행하기 위해 mysql에 알리는 방법이 있는지 알고 싶습니다. mysql 프로 시저, 외부 스크립트를 반복하지 않고. – NotGaeL

+1

또 다른 대답이 전혀 없습니다 : -S – zerkms

+0

@zerkms 저는 이것이 여러분이 "무엇이 문제입니까? 결과 집합을 반복하고 줄 단위로 실행하는 프로 시저를 작성하십시오."그리고 실제로 읽으면 이 코드는 정확하게 변경 문이 아니라는 점을 제외하고는 정확하게 수행합니다. 그러나 나는 그의 작업을하기 위해 여기에 온 것이 아니라 올바른 방향으로 그를 가리키고 있습니다. – Churk

3
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(); 
+0

OP 질문에 대한 답변이므로 정답 여야합니다. – Novastorm