ตัวอย่างลูปใน MySQL


106

ใน MySQL ฉันมีขั้นตอนการจัดเก็บนี้โดยมี For loop อยู่ในนั้น:

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 loop คืออะไร?


สิ่งนี้จะสร้างชื่อกระบวนงานร้านค้า ABC รูปแบบข้อมูลของคุณคืออะไร (คุณต้องการโหลด)?.
Zimbabao

ฉันไม่ต้องการรูปแบบข้อมูลใด ๆ ฉันแค่ต้องการพิมพ์ค่าจาก 1 ถึง 5
Chitresh

ฉันเพิ่งลองใช้รหัสนี้และได้ผลสำหรับฉัน ฉันต้องเพิ่ม CALL ABC (); แต่มันได้ผล ฉันยังเพิ่ม DROP PROCEDURE ABC () ในตอนท้ายเพราะฉันเรียกใช้เป็นการทดสอบเท่านั้น
Alan Stewart

คำตอบ:


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;

ขอบคุณสำหรับคำตอบมันช่วยฉันได้ คุณกรุณาช่วยดูคำถามของฉันได้ไหมstackoverflow.com/questions/12259675/… . คำถามหลักของฉันคือจำเป็นต้องใช้BEGIN...ENDและสร้างขั้นตอนถ้าฉันต้องการใช้เท่านั้นLOOPหรือไม่?
กรีน

1
หากคุณประสบปัญหากับตัวคั่นโปรดอ่านstackoverflow.com/a/10259528/632951
Pacerier

61

ในขณะที่ตัวอย่างไวยากรณ์ลูปใน 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//

ซึ่งพิมพ์:

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

ตัวอย่างไวยากรณ์แบบวนซ้ำใน 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//

ซึ่งพิมพ์:

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

ตัวอย่างไวยากรณ์ลูปใน 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//

ซึ่งพิมพ์:

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-loop แบบนี้ไปสู่การผลิตฉันจะยิงคุณด้วยเครื่องยิงมิสไซล์โฟม คุณสามารถใช้ประแจขันตะปูตอกได้ แต่การทำเช่นนั้นจะทำให้คุณดูงี่เง่า


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

เคยทำงานในเวอร์ชันก่อนหน้านี้ ฉันคิดว่ามันเป็นจุดสิ้นสุดของตัวคั่นบรรทัดที่จะเปลี่ยน: ใช้คำสั่งdelimiter //ก่อนที่จะเรียกใช้สิ่งนี้
Eric Leschinski

เราสามารถใช้ Iterate และ Leave within ในขณะเดียวกันได้หรือไม่? สิ่งเหล่านี้ทำหน้าที่เป็นต่อและหยุดพัก Iterate ทำงานคล้ายกับการดำเนินการต่อใน java หรือไม่
Deepak

13

สมมติว่าคุณมีตารางหนึ่งชื่อ 'table1' ประกอบด้วยคอลัมน์ 'col1' หนึ่งคอลัมน์ที่มีประเภท varchar สอบถามตารางลังได้ด้านล่าง

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

คุณสามารถแลกเปลี่ยนตัวแปรท้องถิ่นนี้เป็น global ได้มันจะง่ายกว่า

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.