Untuk contoh loop di MySQL

104

Di MySQL, saya memiliki prosedur tersimpan ini dengan loop For di dalamnya:

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

Itu selalu dicetak 1. Apa sintaks yang benar untuk MySQL for loop?

Chitresh
sumber
Ini membuat nama prosedur penyimpanan ABC. Apa format data Anda (yang ingin Anda muat) ?.
Zimbabao
saya tidak ingin format data apa pun, saya hanya ingin mencetak nilai dari 1 hingga 5
Chitresh
Saya baru saja mencoba kode ini dan berhasil untuk saya. Saya harus menambahkan CALL ABC (); tapi berhasil. Saya juga menambahkan PROSEDUR DROP ABC () di akhir karena saya hanya menjalankannya sebagai pengujian.
Alan Stewart

Jawaban:

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;
Jon Black
sumber
Terima kasih atas jawaban Anda, itu membantu saya. Bisakah Anda berbaik hati juga melihat pertanyaan saya stackoverflow.com/questions/12259675/… . Pertanyaan utama saya adalah, apakah perlu menggunakan BEGIN...ENDdan membuat prosedur jika saya hanya ingin menggunakan LOOP?
Hijau
1
Jika Anda mengalami masalah dengan pembatas, baca stackoverflow.com/a/10259528/632951
Pacerier
61

Sedangkan contoh sintaks loop di MySQL:

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

Yang mencetak:

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

Contoh sintaks loop REPEAT di MySQL:

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

Yang mencetak:

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

UNTUK contoh sintaks loop di MySQL:

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

Yang mencetak:

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

Lakukan tutorial: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Jika saya mengetahui Anda mendorong konstruksi for-loop MySQL semacam ini ke dalam produksi, saya akan menembak Anda dengan peluncur rudal busa. Anda dapat menggunakan kunci pipa untuk memasang paku, tetapi hal itu akan membuat Anda terlihat konyol.

Eric Leschinski
sumber
2
Mengikuti kode yang Anda berikan, mengetik declare str VARCHAR(255) default '';di konsol MySQL (5.6) memberi saya pesan kesalahan Error 1064 (42000): ... for the right syntax to use near '' at line 3, yang sejelas mud (meskipun saya berasumsi itu tidak menyukai klausa DEFAULT).
Agi Hammerthief
Ini digunakan untuk bekerja di versi sebelumnya. Saya pikir itu akhir dari pembatas baris untuk diubah: gunakan perintah delimiter //sebelum menjalankan ini.
Eric Leschinski
Bisakah kita menggunakan Iterasi dan Tinggalkan dalam While juga? Ini bertindak sebagai lanjutan dan istirahat. Apakah karya Iterate serupa dengan melanjutkan di java?
Deepak
13

Asumsikan Anda memiliki satu tabel dengan nama 'table1'. Ini berisi satu kolom 'col1' dengan tipe varchar. Query to crate table diberikan di bawah ini

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

Sekarang jika Anda ingin memasukkan angka dari 1 hingga 50 dalam tabel itu, gunakan prosedur tersimpan berikut

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

Untuk memanggil penggunaan prosedur tersimpan itu

CALL `ABC`()
Fathah Rehman P.
sumber
1

Anda bisa menukar variabel lokal ini dengan global, itu akan lebih mudah.

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 $$
Bruno Henrique
sumber