2013-04-15 3 views
-1

Я пытаюсь заставить MySql выполнить результат инструкции ниже в качестве последующих операторов sql. Я верю в oracle sqlplus, это достигается с помощью функции spool. Как это достигается в Mysql?Выполнение результата sql select в MySql

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 

EDIT: еще более простой подход заключается в следующем:

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 documentation] (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

Спасибо. Вот как я это сделал. Создание/выполнение отдельного подготовленного оператора в результате выбора исключает использование файлов, но на данный момент временный файл для меня достаточно хорош. –

Смежные вопросы