2011-03-15 94 views
20

下面的過程給了我,當我調用它使用CALL語句錯誤:創建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 

錯誤說「未知表‘性能’」

這是我第一次使用存儲過程,我從Google獲得了我的源代碼。我只是無法弄清楚我做錯了什麼。

回答

18

我已經爲你整理了一些並添加了示例代碼。我始終保持我的參數名稱與它們所代表的字段相同,但以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'); 
+0

看起來我的權利! – RolandoMySQLDBA 2011-03-15 08:20:55

+0

我創建臨時表的目的是查詢它之後。我剛剛嘗試了您的代碼,並且您創建的tmp表不能用於查詢。相反,它給了我一個結果集。因此,該流程只准備員工考勤 – burntblark 2011-03-15 08:33:43

+0

您可以按照您的建議進行操作,但該表只能用於創建或稱爲sproc的連接。我不會推薦這種方法,但如果你可以詳細說明你想要做什麼,我可能會有其他一些想法。您可能還想查看http://pastie.org/1673574 – 2011-03-15 08:47:55

5

通過MySQL默認配置變量sql_notes設置爲1

這意味着, DROP TEMPORARY TABLE IF EXISTS performance; 增量warning_count一個並在存儲過程完成時收到警告。

您可以在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