MySQL의 For 루프 예제


104

MySQL에는 For 루프가있는이 저장 프로 시저가 있습니다.

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 루프의 올바른 구문은 무엇입니까?


이렇게하면 저장 프로 시저 이름 ABC가 만들어집니다. 데이터 형식 (로드하려는 형식)은 무엇입니까?
— Zimbabao

데이터 형식을 원하지 않고 1에서 5까지의 값을 인쇄하고 싶습니다
— Chitresh

이 코드를 시도해 보았고 저에게 효과적이었습니다. CALL ABC ();를 추가해야했습니다. 하지만 효과가있었습니다. 또한 테스트 용으로 만 실행했기 때문에 마지막에 DROP PROCEDURE ABC ()를 추가했습니다.
— Alan Stewart

답변:


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

MySQL의 While 루프 구문 예제 :

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의 FOR 루프 구문 예 :

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를 While 내에 사용할 수 있습니까? 이들은 계속 및 중단 역할을합니다. Iterate는 Java에서 계속 작동하는 것과 비슷합니까?
— Deepak

13

이름이 'table1'인 테이블이 하나 있다고 가정합니다. varchar 유형의 'col1'열이 하나 포함되어 있습니다. 상자 테이블에 대한 쿼리는 아래에 제공됩니다

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.