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.