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

时间:2011-03-15 08:07:33

标签: 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

错误显示“未知表格'效果'”

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

2 个答案:

答案 0 :(得分:20)

我已经为你整理了一些并添加了示例代码。我始终保持我的参数名称与它们所代表的字段相同,但前缀为p_,这可以防止出现问题。我对在sproc体中声明的变量执行相同的操作,但前缀为v _。

你可以在这里找到我的另一个例子:

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

答案 1 :(得分:6)

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

这意味着 DROP TEMPORARY TABLE IF EXISTS performance;warning_count递增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