2016-05-16 3 views
0

Мне нужно создать временную таблицу в одной процедуре.
Теперь мои шаги были:
1. DROP ВРЕМЕННОЕ ТАБЛИЦА если СУЩЕСТВУЕТ
2. CREATE TABLE ВРЕМЕННЫЙ
3. Сделайте что-нибудь с таблицей
4. DROP TABLE ВРЕМЕННЫЙ если СУЩЕСТВУЕТКак легко выбрать временную таблицу в MySQL?

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

Как сделать процедуру удара быстрее?

DROP PROCEDURE IF EXISTS `test`; 
DELIMITER ;; 
CREATE PROCEDURE `test`(IN type INT) 
begin 

DECLARE done INT DEFAULT 0; 
DECLARE total INT DEFAULT 0; 
DECLARE min_1 INT DEFAULT 0; 
DECLARE min_10 INT DEFAULT 0; 
DECLARE min_30 INT DEFAULT 0; 
DECLARE tmp INT DEFAULT 0; 
DECLARE cursor1 CURSOR FOR SELECT TIMESTAMPDIFF(MINUTE,time1,time2) as dif FROM t_test ; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

DROP TEMPORARY TABLE if EXISTS t_test; 
CREATE TEMPORARY TABLE t_test AS (
    SELECT optime as time1,dtime as time2 
    FROM tbmytest 
    WHERE thetpye = type); 

OPEN cursor1; 
REPEAT 
FETCH cursor1 INTO tmp; 
IF done = 1 THEN 
    close cursor1; 
ELSE 
    SET total = total + 1; 
    IF tmp > 30 THEN 
    SET min_30 = min_30 + 1; 
    ELSEIF tmp > 10 THEN 
    SET min_10 = min_10 + 1; 
    ELSEIF tmp > -1 THEN 
    SET min_1 = min_1 + 1; 
    END IF; 
END IF; 
UNTIL done END REPEAT; 

DROP TEMPORARY TABLE if EXISTS t_test; 
SELECT min_1,min_10,min_30,total; 
end;; 
DELIMITER ; 
+0

не уверен MySQL, но обычно временные таблицы самостоятельно уничтожить после окончания сеанса –

+0

Я не уверен, что вы можете ожидать, что столбцы быть одинаковым каждый раз, когда –

+0

это то, что температура таблица используется. – Raptor

ответ

0

Курсоры очень, очень медленные. Временная таблица может быть необязательной.

Вы можете добиться того же, что и процедура в одном запросе. Используйте переменные для этого. Следующий запрос должен выполнить эту работу.

SELECT @min30, @min10, @min1 FROM (
    SELECT @diff := TIMESTAMPDIFF(MINUTE,time1,time2), 
    CASE WHEN @diff > 30 THEN @min30 := @min30 + 1 
     WHEN @diff > 10 THEN @min10 := @min10 + 1 
     WHEN @diff > -1 THEN @min1 := @min1 + 1 
    END 
    FROM t_test 
    CROSS JOIN (SELECT @diff := NULL, @min1 := 0, @min10 := 0, @min30 := 0) var_init_subquery 
) another_subquery_alias 

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

CREATE TABLE my_special_temp_table 
(min30 int, min10 int, min1 int) 
ENGINE=MEMORY; 

UPDATE my_special_temp_table 
JOIN (
    SELECT @min30 AS min30, @min10 AS min10, @min1 AS min1 FROM (
     SELECT @diff := TIMESTAMPDIFF(MINUTE,time1,time2), 
     CASE WHEN @diff > 30 THEN @min30 := @min30 + 1 
      WHEN @diff > 10 THEN @min10 := @min10 + 1 
      WHEN @diff > -1 THEN @min1 := @min1 + 1 
     END 
     FROM t_test 
     CROSS JOIN (SELECT @diff := NULL, @min1 := 0, @min10 := 0, @min30 := 0) var_init_subquery 
    ) another_subquery_alias 
) t 
SET my_special_temp_table.min30 = t.min30, 
my_special_temp_table.min10 = t.min10, 
my_special_temp_table.min1 = t.min1; 
Смежные вопросы