2011-03-15 20 views
20

El siguiente procedimiento me da un error cuando invoco que mediante la sentencia CALL:La creación de tablas temporales en procedimiento almacenado de MySQL


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 

El error dice " 'rendimiento' Desconocido mesa".

Esta es la primera vez que uso procedimientos almacenados y obtuve mis fuentes de Google. Simplemente no puedo entender lo que estoy haciendo mal.

Respuesta

18

Lo he arreglado un poco para usted y he agregado un código de ejemplo. Siempre mantengo mis nombres de parámetros iguales a los campos que representan, pero el prefijo p_ evita problemas. Hago lo mismo con las variables declaradas en el cuerpo de sproc pero prefijo con v_.

puede encontrar otro de mis ejemplos aquí:

Generating Depth based tree from Hierarchical Data in MySQL (no CTEs)

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'); 
+0

Se ve bien para mí !!! – RolandoMySQLDBA

+0

Mi propósito de crear la tabla temporal es consultarla posteriormente. Acabo de probar tu código y la tabla tmp que creaste no estaba disponible para consulta. En cambio, me da un conjunto de resultados. Entonces el procedimiento solo prepara la asistencia de los empleados – burntblark

+0

puede hacer lo que sugirió pero la tabla solo estará disponible para la conexión que lo creó o lo llamó el sproc. No recomendaría este enfoque, pero si pudiera elaborar un poco más sobre lo que está tratando de hacer, podría tener algunas otras ideas. También puede consultar este http://pastie.org/1673574 –

5

Por defecto MySQL variable de configuración sql_notes toma el valor 1

Eso significa que DROP TEMPORARY TABLE IF EXISTS performance; incrementos warning_count por uno y recibe una advertencia cuando termina un procedimiento almacenado.

Puede establecer sql_notes variables a 0 en my.cnf o reescribir procedimiento almacenado así:

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 
Cuestiones relacionadas