0

以下のクエリは、複数のテーブル名を返します。

SET @var2 = 'col1';

SELECT table_name
FROM information_schema.columns
WHERE table_schema = 'db1'
and column_name like @var2

table_name の値を配列に格納し、UPDATE ステートメントでループする必要があります。だから私はこのようにしてみました。【上記クエリの書き換え】

SELECT table_name into @var3
FROM information_schema.columns
WHERE table_schema = 'db1'
and column_name like @var2


UPDATE @var3 SET @var2='Test' WHERE 1=1

実際には、UPDATE ステートメントはテーブルの数だけ実行する必要があります。

var3 は多くの値を保持できないため、エラーが発生します。だから私はそれを配列にしたいので、UPDATEステートメントでループします。続行するアイデアはありますか?

4

1 に答える 1

1

ストアド プロシージャ内でカーソルをループする必要があると思います。このようなもの、

DECLARE t_name VARCHAR(100);
DECLARE not_found_t_names INT DEFAULT 0;

DECLARE cur_table_names CURSOR FOR 
SELECT table_name
FROM information_schema.columns
WHERE table_schema = 'db1'
and column_name like @var2

DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found_t_names = 1;

OPEN cur_table_names;
  SET not_found_t_names = 0;
  t_name_loop : LOOP 
  FETCH cur_table_names INTO t_name;
  IF not_found_t_names THEN
      CLOSE cur_table_names;
      LEAVE t_name_loop;
  END IF;

  SET @update_stmt = CONCAT('UPDATE ',t_name,' SET ',@var2,'=Test WHERE 1=1');

  PREPARE stmt FROM @update_stmt;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

 END LOOP;

concat変数内の構造要素を操作しているため、少しトリッキーなので、正しく行う必要があります。私はこれをテストする環境を持っていないので、修正が必要な場合は自分で構文修正を行ってください。しかし、これは私が推測する方法です。うまくいくはずです、頑張ってください!

于 2013-06-14T05:53:51.277 に答える