MySQL में लूप उदाहरण के लिए


104

MySQL में, मेरे पास इसमें एक लूप के साथ संग्रहीत प्रक्रिया है:

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 के लिए सही सिंटैक्स क्या है?


यह स्टोर प्रक्रिया नाम एबीसी बनाता है। आपका डेटा प्रारूप क्या है (जिसे आप लोड करना चाहते हैं) ?.
जिंबाओ

मुझे कोई डेटा फॉर्मेट नहीं चाहिए, मैं सिर्फ 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
15

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 में 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 में लूप सिंटैक्स उदाहरण के लिए:

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 के लिए लूप निर्माण में धकेलता हूं, तो मैं आपको फोम मिसाइल लांचर के साथ शूट करने जा रहा हूं। आप एक कील में धमाके के लिए एक पाइप रिंच का उपयोग कर सकते हैं, लेकिन ऐसा करने से आप मूर्ख दिखते हैं।


2
आपके द्वारा दिए गए कोड के बाद, declare str VARCHAR(255) default '';MySQL (5.6) कंसोल में टाइप करने से मुझे त्रुटि संदेश मिलता है Error 1064 (42000): ... for the right syntax to use near '' at line 3, जो कीचड़ के रूप में स्पष्ट है (हालांकि मुझे लगता है कि यह DEFAULT क्लॉज पसंद नहीं है)।
एजी हैमरथिफ़

यह पूर्व संस्करणों में काम करता था। मुझे लगता है कि इसे बदलने के लिए लाइन सीमांकक का अंत है: delimiter //इसे चलाने से पहले कमांड का उपयोग करें।
एरिक लेसचिंस्की 14

क्या हम Iterate का उपयोग कर सकते हैं और जबकि भीतर भी छोड़ सकते हैं? ये जारी और विराम के रूप में काम कर रहे हैं। क्या Iterate जावा में जारी रखने के लिए समान काम करता है?
दीपक

13

मान लें कि आपके पास 'table1' नाम की एक तालिका है। इसमें एक कॉलम 'col1' होता है, जिसमें varchar प्रकार होता है। क्वेरी टू टोकरा तालिका नीचे दी गई है

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

अब यदि आप उस तालिका में १ से ५० तक की संख्या सम्मिलित करना चाहते हैं तो निम्न संग्रहीत कार्यविधि का उपयोग करें

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 $$
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.