MySQL'de döngü örneği için


106

MySQL'de, içinde bir For döngüsü olan bu saklı yordam var:

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 $$

Her zaman yazdırır 1. MySQL for döngüsü için doğru sözdizimi nedir?


Bu, ABC mağaza yordamı adlarını oluşturur. Veri formatınız nedir (yüklemek istediğiniz)?
Zimbabao

herhangi bir veri formatı istemiyorum, sadece 1'den 5'e kadar bir değer yazdırmak istiyorum
Chitresh

Bu kodu yeni denedim ve benim için çalıştı. CALL ABC () eklemek zorunda kaldım; ama işe yaradı. Sonuna DROP PROCEDURE ABC () 'yi de ekledim çünkü onu sadece bir test olarak çalıştırıyordum.
Alan Stewart

Yanıtlar:


144
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;

Cevabınız için teşekkür ederim, bana yardımcı oldu. Ayrıca benim sorum görmek çok nazik olabilir stackoverflow.com/questions/12259675/... . Asıl sorum, BEGIN...ENDsadece kullanmak istiyorsam bir prosedür kullanmak ve oluşturmak gerekli LOOPmidir?
Green

1
Sınırlayıcılarla ilgili sorun yaşıyorsanız, stackoverflow.com/a/10259528/632951
Pacerier

61

MySQL'de döngü sözdizimi örneği:

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//

Hangi baskılar:

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

MySQL'de REPEAT döngüsü sözdizimi örneği:

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//

Hangi baskılar:

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

MySQL'de FOR döngüsü sözdizimi örneği:

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//

Hangi baskılar:

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

Eğiticiyi yapın: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Sizi bu tür MySQL for-loop yapılarını üretime sokarken yakalarsam, sizi köpük füze fırlatıcısı ile vuracağım. Bir çiviyi çakmak için boru anahtarı kullanabilirsin, ama böyle yapmak seni aptal gösterir.


2
Verdiğiniz kodun ardından declare str VARCHAR(255) default '';MySQL (5.6) konsoluna yazmak bana hata mesajı veriyor ki bu Error 1064 (42000): ... for the right syntax to use near '' at line 3çamur kadar nettir (VARSAYILAN yan tümcesini sevmediğini varsayıyorum).
Agi Hammerthief

Önceki versiyonlarda çalışıyordu. Sanırım değiştirilecek satır sonu sınırlayıcı: delimiter //bunu çalıştırmadan önce komutu kullanın .
Eric Leschinski

Yinele ve Bırak'ı while içinde de kullanabilir miyiz? Bunlar devam etme ve kırılma gibi davranıyor. Yineleme çalışmaları java'da devam etmeye benzer mi?
Deepak

13

'Table1' adında bir tablonuz olduğunu varsayın. Varchar türünde bir sütun 'col1' içerir. Sandık için sorgu tablosu aşağıda verilmiştir

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

Şimdi, bu tabloya 1'den 50'ye kadar sayı eklemek istiyorsanız, aşağıdaki saklı yordamı kullanın.

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 $$

Bu saklı yordamı aramak için şunu kullanın:

CALL `ABC`()

1

Bu yerel değişkeni bir global ile değiştirebilirsiniz, daha kolay olacaktır.

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 $$
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.