在MySQL存储过程中创建临时表

bur*_*ark 26 mysql sql stored-procedures

当我使用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
Run Code Online (Sandbox Code Playgroud)

错误显示"未知表'性能'".

这是我第一次真正使用存储过程,我从谷歌获取了我的资源.我只是想弄清楚我做错了什么.

Jon*_*ack 23

我已经为你整理了一些,并添加了示例代码.我始终保持我的参数名称与它们所代表的字段相同,但前缀为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');
Run Code Online (Sandbox Code Playgroud)


bro*_*oNo 6

默认情况下,MySQL配置变量sql_notes设置为1.

这意味着将warning_count DROP TEMPORARY TABLE IF EXISTS performance; 递增1,并在存储过程完成时收到警告.

您可以在my.cnf 中将sql_notes变量设置为0或重写存储过程,如下所示:

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
Run Code Online (Sandbox Code Playgroud)