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

la procédure suivante me donne une erreur quand je l'invoque en utilisant L'énoncé D'appel:


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

Le message d'erreur indique Inconnu "de la table "performance "" .

c'est la première fois que J'utilise des procédures stockées et J'ai obtenu mes sources de Google. Je juste ne peux pas comprendre ce que je fais de mal.

22
demandé sur burntblark 2011-03-15 11:07:32

2 réponses

j'ai fait un peu de rangement pour vous et j'ai ajouté du code d'exemple. Je garde toujours les noms de mes paramètres identiques à ceux des champs qu'ils représentent, mais le préfixe avec p_ évite les problèmes. Je fais la même chose avec les variables déclarées dans le corps sproc mais préfixe avec v_.

vous pouvez trouver un autre de mes exemples ici:

Génération de la Profondeur de l'arbre Hiérarchique des Données dans MySQL (pas d'expressions de table communes)

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');
19
répondu Jon Black 2017-05-23 12:34:31

par défaut la variable de configuration MySQL sql_notes est définie à 1.

cela signifie que DROP TEMPORARY TABLE IF EXISTS performance; incréments warning_count par un et vous obtenez un avertissement quand une procédure stockée se termine.

vous pouvez définir sql_notes variable à 0 dans my.cnf ou de réécriture de la procédure stockée comme ça:

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
répondu brooNo 2013-06-03 07:47:16