web-dev-qa-db-ja.com

MySQLストアドプロシージャで一時テーブルを作成する

次の手順では、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からソースを入手しました。私は自分が間違っていることを理解できません。

24
burntblark

私はあなたのためにそれを少し整理し、サンプルコードを追加しました。私は常にパラメータ名をそれらが表すフィールドと同じにしますが、問題を防ぐために接頭辞p_を付けます。 sproc本体で宣言された変数でも同じことを行いますが、v_を前に付けます。

私の例の別の1つをここで見つけることができます:

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');
20
Jon Black

デフォルトでは、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
6
brooNo