Подтвердить что ты не робот

Создание временных таблиц в хранимой процедуре MySQL

Следующая процедура дает мне ошибку, когда я вызываю ее с помощью инструкции 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

Ошибка говорит "Неизвестная производительность таблицы" .

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

4b9b3361

Ответ 1

Я немного прибрал его для вас и добавил пример кода. Я всегда сохраняю имена параметров такими же, как поля, которые они представляют, но префикс с 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');

Ответ 2

По умолчанию переменная конфигурации 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