MySQL এ লুপ উদাহরণের জন্য For


104

মাইএসকিউএল-তে আমার কাছে এটির জন্য একটি লুপের সাহায্যে এই সঞ্চয় পদ্ধতি রয়েছে:

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। লুপের জন্য মাইএসকিউএলের সঠিক বাক্য গঠন কী?


এটি স্টোর পদ্ধতির নাম এবিসি তৈরি করে। আপনার ডেটা ফর্ম্যাটটি কী (আপনি একটি লোড করতে চান) ?.
জিম্বাবাও

আমি কোনও ডেটা ফর্ম্যাট চাই না, আমি কেবল 1 থেকে 5 পর্যন্ত একটি মান মুদ্রণ করতে চাই
চিত্রশ্রিশ

আমি এই কোডটি চেষ্টা করেছিলাম এবং এটি আমার পক্ষে কাজ করে। আমাকে কল এবিসি () যোগ করতে হয়েছিল; কিন্তু এটি কাজ করে। আমি শেষে ড্রপ প্রসিজার এবিসি () যুক্ত করেছি কারণ আমি কেবল এটি পরীক্ষা হিসাবে চালাচ্ছিলাম।
অ্যালান স্টুয়ার্ট

উত্তর:


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
Pacerier

61

মাইএসকিউএল-এ লুপ সিনট্যাক্সের উদাহরণ থাকাকালীন:

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, |
+------------+

মাইএসকিউএলে পুনরায় লুপ সিনট্যাক্স উদাহরণ:

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, |
+------------+

মাইএসকিউএলে লুপ সিনট্যাক্স উদাহরণের জন্য:

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

যদি আমি আপনাকে এই ধরণের মাইএসকিউএল ফর লুপ কনস্ট্রাকশনসকে উত্পাদনের দিকে ঠেলে দিচ্ছি তবে আমি ফেনা ক্ষেপণাস্ত্র লঞ্চারের সাহায্যে আপনাকে গুলি করব। আপনি পেরেক বেজায় একটি পাইপ রেঞ্চ ব্যবহার করতে পারেন, তবে এটি আপনাকে নির্বোধ দেখায়।


2
আপনি যে কোডটি দিয়েছেন তা অনুসরণ করে declare str VARCHAR(255) default '';মাইএসকিউএল (৫..6) কনসোলে টাইপ করা আমাকে ত্রুটি বার্তা দেয় Error 1064 (42000): ... for the right syntax to use near '' at line 3যা কাদা হিসাবে পরিষ্কার (যদিও আমি ধরে নিই যে এটি ডিফল্ট ধারাটি পছন্দ করে না)।
আগি হ্যামার্থিফ

এটি পূর্ববর্তী সংস্করণগুলিতে কাজ করত। আমি মনে করি এটি পরিবর্তন করার জন্য লাইন ডেলিমিটারের সমাপ্তি: এটি delimiter //চালানোর আগে কমান্ডটি ব্যবহার করুন ।
এরিক লেসচিনস্কি

আমরা কি Iterate ব্যবহার করতে পারি এবং পাশাপাশি থাকি? এগুলি অবিরত এবং বিরতি হিসাবে অভিনয় করছে। জাভাতে চালিয়ে যাওয়ার মতো কাজ কি একইরকম?
দীপক

13

ধরুন আপনার কাছে 'টেবিল 1' নামের একটি টেবিল রয়েছে। এটিতে বর্ণের ধরণের একটি কলাম 'কল 1' রয়েছে। ক্রেট টেবিলের জন্য প্রশ্ন নীচে দেওয়া হল

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.