Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[6주차] 33. PL/SQL언어, 반복문의 종류(loop, for ~loop, while, 이중 반복문) 본문

K-DigitalTraining 강의/2. Oracle + PLSQL

[6주차] 33. PL/SQL언어, 반복문의 종류(loop, for ~loop, while, 이중 반복문)

이대곤 2022. 6. 17. 11:08

* 변수를 선언할 때 sum, avg 등의 함수의 이름은 사용할 수 없음에 주의하자.

* 반복횟수가 정해져 있을 때는 for~loop 를 사용하고, 이외의 상황은 loop 혹은 while문을 사용하면된다.

1. loop

-- loop를 이용해 1~10까지 출력하는 코드
declare
	i number := 1;
begin
	loop
    		dbms_output.put_line('i: ' || i);
       	 	exit when i = 10;	-- 조건을 만족하면 루프를 빠져나옴
       	 	i := i + 1;		-- java처럼 i++, ++i은 없음
	end loop;
    
	dbms_output.put_line('loop를 빠져나옴');
end;
/

i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10
loop를 빠져나옴

PL/SQL 처리가 정상적으로 완료되었습니다.
-- loop를 이용해 1~10까지의 합을 구하는 코드
declare
	i number := 1;
	vsum number := 0;
begin
	loop
		vsum := vsum + i;
		exit when i = 10;	-- 조건을 만족하면 루프를 빠져나옴
		i := i + 1;	
	end loop;
    
	dbms_output.put_line('loop를 빠져나옴');
	dbms_output.put_line('vsum: ' || vsum);
end;
/

loop를 빠져나옴
vsum: 55

PL/SQL 처리가 정상적으로 완료되었습니다.

2. for~loop

* 숫자를 반복대상으로 사용하면 무조건 1씩 증가시키거나, 1씩 감소(reverse 이용)시키는 경우에만 사용이 가능하다.

* for문 바로 뒤에 오는 i 변수는 변수 선언을 생략하고도 사용할 수 있다.

* 반복대상으로 쿼리문을 사용할수도 있다.

-- loop를 이용해 1~10까지 출력하는 코드
declare
	i number;		-- 생략가능라인
	vsum number := 0;
begin
	for i in 1..10 loop -- i에 1,2,3,,,9,10 까지 차례로 입력됨
    		dbms_output.put_line('i: ' || i);
    	end loop;
    
	dbms_output.put_line('loop를 빠져나옴');
end;
/
-- loop를 이용해 1~10까지의 합을 구하는 코드, exit도 필요에 따라 사용할 수 있는데 여기선 알아서 10번 다음에 루프를 빠져나가므로 사용할 필요가 없었다.
declare
	vsum number := 0;
begin
	for i in 1..10 loop -- i에 1,2,3,,,9,10 까지 차례로 입력됨
    		vsum := vsum + i;
    	end loop;
    
	dbms_output.put_line('loop를 빠져나옴');
	dbms_output.put_line('vsum: ' || vsum);
end;
/
-- loop를 이용해 10~1까지 역순으로 출력하는 코드
declare
	vsum number := 0;
begin
	for i in reverse 1..10 loop -- i에 10,9,8,,,2,1 역순으로 차례로 입력됨
    		dbms_output.put_line('i: ' || i);
    	end loop;
    
	dbms_output.put_line('loop를 빠져나옴');
end;
/

i: 10
i: 9
i: 8
i: 7
i: 6
i: 5
i: 4
i: 3
i: 2
i: 1
loop를 빠져나옴

PL/SQL 처리가 정상적으로 완료되었습니다.
--반복대상을 쿼리문으로 사용한 경우, 전체 레코드 출력

begin
	for i in (select id, name, salary from members) loop
		dbms_output.put_line(i.id || ', ' || i.name || ', ' || i.salary);
	end loop;
end;
/

1, 제시카, 100
2, 티파니, 700
3, 수영, 300
4, 효연, 800
5, 효연, 200
6, 제시카, 500
9, 써니, 600
7, 유리, 500
8, 윤아, 300
10, 수영, 1000000

PL/SQL 처리가 정상적으로 완료되었습니다.
-- 테이블의 맨 뒤에 insert 3번을 반복하는 반복문
declare
	vno number; 
begin
	for i in 1..3 loop 
		select max(no)
		into vno 
		from customer;
		dbms_output.put_line(vno);

      		insert into customer(no, name, addr) values(vno+1, 'choi', 'aa');
  	end loop;

	
end;
/

3. while

- exit은 무한루프일 때 사용

-- loop를 이용해 1~10까지의 합을 구하는 코드

declare
	i number := 1;
	vsum number := 0;
begin
	while i <= 10 loop
		vsum := vsum + i;
		-- exit when i = 10;
		i := i + 1;	
	end loop;
    
	dbms_output.put_line('loop를 빠져나옴');
	dbms_output.put_line('vsum: ' || vsum);
end;
/
-- loop를 이용해 1~10까지의 합을 구하는 코드, 무한루프 + exit 사용

declare
	i number := 1;
	vsum number := 0;
begin
	while TRUE loop
		vsum := vsum + i;
		exit when i = 10;
		i := i + 1;	
	end loop;
    
	dbms_output.put_line('loop를 빠져나옴');
	dbms_output.put_line('vsum: ' || vsum);
end;
/

이중 반복문 만드는 방법

--이중 loop구조
declare
	i number := 1;
	j number := 5;
begin
	loop
		exit when i = 4;
		loop
			exit when j = 7;
			dbms_output.put_line(i || ',' || j);
			j := j + 1;
		end loop;
		i := i + 1;
		j := 5; 
	end loop;
end;
/

--이중 for구조
begin
	for i in 1..3 loop
		for j in 5..6 loop
			dbms_output.put_line(i || ',' || j);
		end loop;
	end loop;
end;
/


1,5
1,6
2,5
2,6
3,5
3,6

PL/SQL 처리가 정상적으로 완료되었습니다.
Comments