我目前正在循环浏览数据库中的用户名列表。像这样 :
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;
现在对于每个用户名,我正在创建包含数据的表。显然,在上述循环中,我有多个 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 永远不会改变,即使它为每个用户都通过了循环。即使我 DEALLOCATE 它,它仍然保留用于该存储过程。
每次循环重新启动时,我如何重置这个 stmt1、stmt2、stmt3 ...等?
基本上每次循环通过时 l_table_name 都会改变,但 stmt1 不会改变.. 我需要改变 stmt1 以便它每次都使用新的 l_table_name