web-dev-qa-db-fra.com

Création de tables temporaires dans la procédure stockée MySQL

La procédure suivante me donne une erreur lorsque je l'invoque à l'aide de l'instruction 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

L'erreur indique "Performances de la table inconnue" ".

C'est la première fois que j'utilise des procédures stockées et j'ai obtenu mes sources de Google. Je n'arrive pas à comprendre ce que je fais mal.

24
burntblark

Je l'ai rangé un peu pour vous et j'ai ajouté un exemple de code. Je garde toujours mes noms de paramètres les mêmes que les champs qu'ils représentent mais préfixe avec p_ qui évite les problèmes. Je fais de même avec les variables déclarées dans le corps de sproc mais en préfixe avec v_.

Vous pouvez trouver un autre de mes exemples ici:

Génération d'un arbre basé sur la profondeur à partir de données hiérarchiques dans MySQL (pas de 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');
20
Jon Black

Par défaut, la variable de configuration MySQL sql_notes est définie sur 1.

Cela signifie que DROP TEMPORARY TABLE IF EXISTS performance; incrémente warning_count de un et vous obtenez un avertissement lorsqu'une procédure stockée se termine.

Vous pouvez définir la variable sql_notes sur 0 dans my.cnf ou réécrire une procédure stockée comme celle-ci:

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
6
brooNo