2013-04-15 5 views
-1

다음 SQL 문의 결과를 MySQL에서 실행하려고합니다. 나는 oracle sqlplus를 spool 함수를 사용하여 구현했다고 믿습니다. 이게 어떻게 달성 MySQL?MySQL에서 sql select 결과를 실행하십시오.

select concat('OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.', ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist where table_schema = 'my_schema'; 

답변

3

prepared statements을 사용해야합니다.

SET @s:=''; 
SELECT @s:=concat(@s, 'OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.', ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist where table_schema = 'my_schema';  
PREPARE stmt FROM @s; 
EXECUTE stmt; 

DEALLOCATE PREPARE stmt; 

는하지만 당신은 내가 자체 @s을 연결하고있어 그 이유는, 하나 개의 변수에 모두 최적화 테이블 문을 넣어해야합니다. 그렇지 않으면 불필요한 작업 인 커서로 작업해야합니다. MySQL은 5.0.23의로

는 다음과 같은 추가 문이 지원됩니다

ANALYZE TABLE 
OPTIMIZE TABLE 
REPAIR TABLE 

편집 :

SELECT CONCAT('OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.', ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist WHERE table_schema = 'my_schema' 
INTO OUTFILE '/tmp/my_optimization'; 
SOURCE 'tmp/my_optimization'; 
+0

이 방법을 더 이상 작동하지 않을 수 없습니다 : 더 간단한 방법이있다 MySQL 5.6 이상. [MySQL 5.7 문서]에 따르면 (http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html) 준비된 문에 대한 _SQL 구문은 다중 문 (즉, , 단일. 자열에서 여러.을. 자로 구분) ._ OPTIMIZE TABLE 또는 REPAIR TABLE이있는 다중 명령문 조회가 PREPARE stmt FROM @s;에 전달 될 때; MySQL은 오류를보고합니다. –

+1

@ Mr.Girgitt 제 답변에서 더 좋은 방법을 추가했습니다. – fancyPants

+0

감사합니다. 이것이 결국 내가 그 일을 끝낸 방법입니다. select의 결과마다 별도의 prepared statement를 생성/실행하면 파일 사용을 피할 수 있지만 현재로서는 임시 파일로 충분합니다. –

관련 문제