繁体   English   中英

如何创建MYSQL prepare语句并在1个存储过程中将其重置

[英]how to create MYSQL prepare statements and resetting them in 1 stored procedure

我目前正在遍历数据库中的用户名列表。 因此 :

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;

现在,对于每个用户名,我正在使用数据创建表。 显然,在上面的LOOP中,我有多个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。 即使我取消分配它,对于该存储过程也仍然保留。

每次重新启动LOOP时,如何重置此stmt1,stmt2,stmt3 ... etc?

基本上,每次遍历LOOP时,l_table_name都会更改,但是stmt1不会更改。我需要更改stmt1,以便每次使用新的l_table_name

通常,在准备新语句之前,将隐式释放一个prepare语句。 那么,如果删除DEALLOCATE PREPARE stmt1;结果DEALLOCATE PREPARE stmt1; 您是否在每个循环中检查了“ @droptable”值?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM