MySQLのループの例


104

MySQLでは、このストアドプロシージャにForループが含まれています。

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 0 ;
      simple_loop: LOOP
         SET a=a+1;
         select a;
         IF a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

常に印刷し1ます。MySQL forループの正しい構文は何ですか?


これにより、ストアプロシージャ名ABCが作成されます。あなたのデータフォーマットは何ですか(あなたがロードしたいもの)?
ジンババオ、2011

データ形式は必要ありません
。1〜5の

私はこのコードを試したところ、うまくいきました。CALL ABC()を追加する必要がありました。しかし、うまくいきました。テストとしてのみ実行していたため、最後にDROP PROCEDURE ABC()も追加しました。
アランスチュワート

回答:


143
drop table if exists foo;
create table foo
(
id int unsigned not null auto_increment primary key,
val smallint unsigned not null default 0
)
engine=innodb;

drop procedure if exists load_foo_test_data;

delimiter #
create procedure load_foo_test_data()
begin

declare v_max int unsigned default 1000;
declare v_counter int unsigned default 0;

  truncate table foo;
  start transaction;
  while v_counter < v_max do
    insert into foo (val) values ( floor(0 + (rand() * 65535)) );
    set v_counter=v_counter+1;
  end while;
  commit;
end #

delimiter ;

call load_foo_test_data();

select * from foo order by id;

あなたの答えをありがとう、それは私を助けました。私の質問stackoverflow.com/questions/12259675/…もご覧いただき、ありがとうございます。私の主な質問は、使用BEGIN...ENDしたいだけの場合、プロシージャを使用して作成する必要があるLOOPかどうかです。
緑の

1
区切り文字に問題がある場合は、stackoverflow.com
a / 10259528/632951

61

MySQLのwhileループ構文の例:

delimiter //

CREATE procedure yourdatabase.while_example()
wholeblock:BEGIN
  declare str VARCHAR(255) default '';
  declare x INT default 0;
  SET x = 1;

  WHILE x <= 5 DO
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
  END WHILE;

  select str;
END//

どのプリント:

mysql> call while_example();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+

MySQLでのREPEATループ構文の例:

delimiter //

CREATE procedure yourdb.repeat_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = 5;
  SET str = '';

  REPEAT
    SET str = CONCAT(str,x,',');
    SET x = x - 1;
    UNTIL x <= 0
  END REPEAT;

  SELECT str;
END//

どのプリント:

mysql> call repeat_loop_example();
+------------+
| str        |
+------------+
| 5,4,3,2,1, |
+------------+

MySQLのFORループ構文の例:

delimiter //

CREATE procedure yourdatabase.for_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = -5;
  SET str = '';

  loop_label: LOOP
    IF x > 0 THEN
      LEAVE loop_label;
    END IF;
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
    ITERATE loop_label;
  END LOOP;

  SELECT str;

END//

どのプリント:

mysql> call for_loop_example();
+-------------------+
| str               |
+-------------------+
| -5,-4,-3,-2,-1,0, |
+-------------------+
1 row in set (0.00 sec)

チュートリアルを実行:http : //www.mysqltutorial.org/stored-procedures-loop.aspx

このようなMySQLのforループ構造を本番環境にプッシュしているのを見つけたら、フォームミサイルランチャーで撃ちます。パイプレンチを使って釘を打つこともできますが、そうするとばかげて見えます。


2
あなたが与えたコードに続いてdeclare str VARCHAR(255) default '';、MySQL(5.6)コンソールに入力すると、Error 1064 (42000): ... for the right syntax to use near '' at line 3泥と同じくらい明確なエラーメッセージが表示されます(ただし、DEFAULT句は好きではないと思います)。
Agi Hammerthief、2015年

以前のバージョンでは機能していました。変更するのは行末の区切り文字だと思いますdelimiter //。これを実行する前にコマンドを使用してください。
Eric Leschinski、2016

While内でIterateおよびLeaveも使用できますか?これらは継続および中断として機能しています。IterateはJavaで続行するのと似ていますか?
ディーパック、

13

'table1'という名前のテーブルが1つあるとします。varcharタイプの1つの列「col1」が含まれています。テーブルを作成するためのクエリを以下に示します

CREATE TABLE `table1` (
    `col1` VARCHAR(50) NULL DEFAULT NULL
)

このテーブルに1から50までの数を挿入する場合は、次のストアドプロシージャを使用します。

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 1 ;
      simple_loop: LOOP         
         insert into table1 values(a);
         SET a=a+1;
         IF a=51 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

そのストアドプロシージャを呼び出すには

CALL `ABC`()

1

このローカル変数をグローバルに交換できるので、簡単です。

DROP PROCEDURE IF EXISTS ABC;
DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      SET @a = 0;
      simple_loop: LOOP
         SET @a=@a+1;
         select @a;
         IF @a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.