0

現在、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 を変更する必要があります。

4

1 に答える 1

0

通常、prepare ステートメントは、新しいステートメントが準備される前に暗黙的に割り当て解除されます。を削除すると、結果はどうなりますかDEALLOCATE PREPARE stmt1;。各ループで「@droptable」の値を確認しましたか?

于 2012-08-02T10:09:31.050 に答える