如何创建MYSQL准备语句并在1个存储过程中重置它们

时间:2012-08-02 09:39:02

标签: mysql

我目前正在循环访问数据库中的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,我正在创建包含数据的表。显然,在上面的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语句构建我想要的数据并将其插入到我为每个用户创建的表中。

现在因为这是在LOOP中,对于每个用户,我已经读过PREPARE语句是全局的。这意味着,上面的代码,“PREPARE stmt1 FROM @droptable”,stmt1将永远不会改变,即使它通过每个用户的LOOP。即使我DEALLOCATE它,它仍然是该存储过程。

每次LOOP再次启动时,如何重置此stmt1,stmt2,stmt3等等?

基本上l_table_name会在每次LOOP通过时发生变化,但是stmt1没有变化..我需要更改stmt1以便每次都使用新的l_table_name

1 个答案:

答案 0 :(得分:0)

通常在准备新语句之前隐式释放一个prepare语句。那么如果你删除DEALLOCATE PREPARE stmt1;会得到什么结果。你在每个循环中检查了'@droptable'值吗?