2010-02-17 7 views
1

Я пытался создать хранимую процедуру, которая автоматически устанавливает временные таблицы.Удаление временных таблиц с помощью хранимой процедуры

CREATE PROCEDURE DeleteTemp() 
BEGIN 
DECLARE no_more_rows BOOLEAN; 
DECLARE loop_cntr INT DEFAULT 0; 
DECLARE num_rows INT DEFAULT 0; 


DECLARE tmptablename VARCHAR(100); 
DECLARE tmpTables CURSOR FOR 
    SELECT TABLE_NAME 
    FROM information_schema.TABLES 
    WHERE TABLE_SCHEMA='myDB' AND TABLE_NAME LIKE 'tmp%'; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; 
OPEN tmpTables; 
SELECT FOUND_ROWS() into num_rows; 
the_loop: LOOP 
    FETCH tmpTables INTO tmptablename; 
    DROP TABLE tmptablename; 
    IF no_more_rows THEN 
     CLOSE tmpTables; 
     LEAVE the_loop; 
    END IF; 
END LOOP the_loop; 
END 

Однако, все это я получаю:

Запроса: вызов DeleteTemp Кода Ошибки: 1051 Неизвестного стола 'tmptablename'

Как я могу передать переменную tmptablename должным образом в «DROP TABLE «команда?


Исправлено использование подготовленных отчетов.

CREATE 
    PROCEDURE DeleteTemp() 
    BEGIN 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE loop_cntr INT DEFAULT 0; 
    DECLARE num_rows INT DEFAULT 0; 


    DECLARE tmptablename VARCHAR(100); 
    DECLARE tmpTables CURSOR FOR 
     SELECT TABLE_NAME 
     FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA='MY_SCHEMA' 
      AND TABLE_NAME LIKE 'tmp%'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; 
    OPEN tmpTables; 
    SELECT FOUND_ROWS() INTO num_rows; 

    the_loop: LOOP 
     FETCH tmpTables INTO tmptablename; 
     IF no_more_rows THEN 
      CLOSE tmpTables; 
      LEAVE the_loop; 
     ELSE 
      SET @a:=CONCAT('DROP TABLE ',tmptablename); 
      PREPARE stmt1 FROM @a; 
      EXECUTE stmt1; 
      DEALLOCATE PREPARE stmt1; 
     END IF; 
    END LOOP the_loop; 
    END 

ответ

2

Вы имели взгляд на ГОТОВИШЬ и ВЫПОЛНИТЬ команды. Это как выполнение DYNAMIC SQL

SQL Syntax for Prepared Statements

следующие SQL заявления могут быть использованы в подготовленных инструкций: ALTER TABLE, ВЫЗОВ, COMMIT, CREATE INDEX, CREATE TABLE, DELETE, DO, DROP INDEX , ТАБЛИЦА DROP, INSERT, RENAME TABLE, ЗАМЕНИТЬ, ВЫБРАТЬ, УСТАНОВИТЬ, ОБНОВИТЬ и большинство SHOW statements. ТАБЛИЦА АНАЛИЗА, ТАБЛИЦА ОПТИМИЗАЦИИ, ТАБЛИЦА РЕМОНТА: также поддерживается с MySQL 5.0.23.

0

Возможно, это не так, как вы считаете, но знаете ли вы, что ваши временные таблицы видны только для того соединения, которое их создало, и будут автоматически удалены после закрытия этого соединения?

+0

Да, я. Я искал способ удалить кучу открытых таблиц на основе их имени (например, tmp *). Иногда это помогает при отладке! –

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