現在、DB からの userNames のリストをループしています。そのような :
DECLARE
cur1 CURSOR FOR
select user_name
from users
where user_type = 'SP'
and active = 'Y';
OPEN cur1;
read_loop : LOOP
FETCH cur1 INTO userName;
各userNameに対して、データを含むテーブルを作成しています。明らかに、上記のループ内には、次のような複数の PREPARE ステートメントがあります。
set l_table_name = concat("tmp_rec_",userName);
set l_select_cnt = concat("SELECT count(1) into @l_cnt
from information_schema.tables
where table_schema = 'greptlat_db'
and table_name = '", l_table_name, "'");
PREPARE stmt2 FROM @l_select_cnt;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
if l_cnt > 0 then
set droptable = concat("drop table ", l_table_name);
PREPARE stmt1 FROM @droptable;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
必要なデータを構築し、ユーザーごとに作成したテーブルに挿入する PREPARE ステートメントがさらにあります。
これはループ内にあるため、ユーザーごとに、PREPARE ステートメントがグローバルであることを読みました。つまり、上記のコード "PREPARE stmt1 FROM @droptable", stmt1 は、ユーザーごとに LOOP を通過しても変更されません。DEALLOCATEしても、そのストアドプロシージャには残ります。
LOOPが再び開始されるたびに、このstmt1、stmt2、stmt3 ...などをリセットするにはどうすればよいですか?
基本的に、l_table_name は LOOP が通過するたびに変更されますが、stmt1 は変更されません。毎回新しい l_table_name を使用するように stmt1 を変更する必要があります。