Создание временных таблиц в хранимой процедуре MySQL - PullRequest
24 голосов
/ 15 марта 2011

Следующая процедура выдает мне ошибку, когда я вызываю ее с помощью оператора CALL:


CREATE DEFINER=`user`@`localhost` PROCEDURE `emp_performance`(id VARCHAR(10))
BEGIN
DROP TEMPORARY TABLE IF EXISTS performance;
CREATE TEMPORARY TABLE performance AS  
    SELECT time_in, time_out, day FROM attendance WHERE employee_id = id;
END

Ошибка говорит "Неизвестная таблица 'performance'" .

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

Ответы [ 2 ]

20 голосов
/ 15 марта 2011

Я немного прибрался для вас и добавил пример кода.Я всегда сохраняю имена своих параметров такими же, как и у полей, которые они представляют, но с префиксом p_, что предотвращает проблемы.Я делаю то же самое с переменными, объявленными в теле sproc, но с префиксом v _.

Другой пример можно найти здесь:

Создание дерева на основе глубины из иерархических данных в MySQL(без CTE)

drop procedure if exists emp_performance;

delimiter #

create procedure emp_performance
(
in p_employee_id varchar(10)
)
begin

declare v_counter int unsigned default 0;

create temporary table tmp engine=memory select time_in, time_out 
 from attendance where employee_id = p_employee_id;

-- do stuff with tmp...

select count(*) into v_counter from tmp;

-- output and cleanup

select * from tmp order by time_in;

drop temporary table if exists tmp;

end#

delimiter ;

call emp_performance('E123456789');
6 голосов
/ 03 июня 2013

По умолчанию переменная конфигурации MySQL sql_notes установлена ​​в 1.

Это означает, что DROP TEMPORARY TABLE IF EXISTS performance; увеличивает warning_count на единицу, и вы получаете предупреждение, когда хранимая процедура завершается.

Вы можете установить переменную sql_notes в 0 в my.cnf или переписать хранимую процедуру следующим образом:

CREATE DEFINER=`user`@`localhost` PROCEDURE `emp_performance`(id VARCHAR(10))
BEGIN
SET @@session.sql_notes = 0;
DROP TEMPORARY TABLE IF EXISTS performance;
CREATE TEMPORARY TABLE performance AS  
    SELECT time_in, time_out, day FROM attendance WHERE employee_id = id;
SET @@session.sql_notes = 1;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...