PL/SQL 반복문 BASIC LOOP, FOR LOOP, WHILE LOOP
15.1.4. PL/SQL 반복문
PL/SQL 프로그래밍을 하다보면 특정 코드블록을 여러번 반복 실행해야 하는 경우가 있을 수 있습니다. 이럴때 PL/SQL반복문을 사용 합니다.
PL/SQL 반복문은 BASIC LOOP ~ END LOOP, WHILE LOOP ~ END LOOP, FOR LOOP ~ END LOOP가 있습니다.
LOOP ~ END LOOP 안에서 루프를 조절하는 몇가지 명령을 사용할 수 있습니다.
EXIT : EXIT를 만나면 제어를 END LOOP 바로 다음으로 이동 시킵니다. 즉 루프를 빠져 나갑니다. EXIT WHEN condition : 지정한 조건이 되면 루프를 빠져 나갑니다. CONTINUE : CONTINUE 이후의 문장을 SKIP하고 해당 루프의 다음 반복을 계속할 수 있도록 합니다. GOTO label : lebel이 지정된 명령문으로 제어를 이동시킵니다. GOTO 사용은 순차적인 프로그래밍 방식에서 제어의 일관성이 상실되어 가독성이 떨어지므로 권장하지 않습니다. |
15.1.4.1. BASIC LOOP문
반복실행될 명령은 LOOP ~ END LOOP 사이에 기술하며, 명령문이 실행된 후 제어가 위쪽 LOOP에서 다시 시작됩니다.
<기본형식>
LOOP EXIT WHEN condition; CONTINUE; statements; END LOOP;
|
15.1.4.1.1. 구구단 출력하기 : BASIC LOOP
구구단 2단, 3단을 출력하는 PL/SQL 예문을 BASIC LOOP문을 이용하여 작성해 봅시다.
SET SERVEROUTPUT ON;
DECLARE -- 숫자 2자리를 저장할 수 있는 NUMBER형 변수 I, J를 선언하고 초기치를 할당 I NUMBER(2) := 1; J NUMBER(2) := 0; BEGIN -- 외부 루프 LOOP -- I를 1증가 I := I + 1; -- I값이 3보다 크면 외부루프를 빠져나옴 EXIT WHEN I > 3; -- 내부 루프 LOOP -- J값을 1증가, J는 0부터 시작됨 J := J + 1; -- J값이 9보다 크면 외부루프를 빠져나옴 EXIT WHEN J > 9; DBMS_OUTPUT.PUT_LINE( I || ' * ' || J || '=' || I * J); END LOOP; -- 내부 루프 종료 -- 내부 루프를 빠져 나오면 J를 초기값으로 할당 J := 0; DBMS_OUTPUT.PUT_LINE(''); END LOOP; -- 외부 루프 종료 END; |
<실행결과>
2 * 1=2
…...
2 * 9=18
3 * 1=3
…...
3 * 9=27
위 예문에서 레이블은 생략 가능 합니다. 실무에서 PL/SQL 작성시 label은 거의 사용하지 않습니다. label을 기술하고 GOTO문 등으로 제어를 이동시킬 수 있지만 권장하지 않습니다.
15.1.4.2. FOR LOOP문
명령을 고정된 횟수 만큼 반복하려면 FOR ~ LOOP를 사용합니다.
루프 카운터 변수는 기본적으로 시작값에서 상한값까지 1씩 증가 하면서 이동하고 REVERSE라고 하면 상한값에서 시작값으로 -1씩 증가 합니다. 또한 초기값과 상한값의 위치가 바뀌어서도 안되고 초기값과 상한값은 점2개(..)로 연결 됩니다.
<기본형식>
FOR index IN [REVERSE] lowest_num..highest_num LOOP statements END LOOP;
index : 루프 카운터 변수. 루프 밖에서는 참조가 불가능 합니다. 루프 안에서는 참조는 가능하지만 값을 변경할 수는 없습니다. [REVERSE] : 루프 카운터는 상한값에서 시작값으로 역으로 변합니다.[생략가능] lowest_num : PLS_INTEGER형식의 루프 카운터 변수의 시작값, 숫자 또는 숫자로 평가되는 표현식. highest_num : PLS_INTEGER형식의 루트 카운터 변수의 상한값, 숫자 또는 숫자로 평가되는 표현식. lowest_num 및 highest_num 값은 FOR LOOP 문이 시작될 때 한 번 평가되므로 값을 수정하더라도 변경사항이 적용되지 않습니다. lowest_num 값이 highest_num 값과 같으면 명령문은 한 번만 실행되고 lowest_num 값이 highest_num 값 보다 크면 명령문이 실행되지 않습니다. statements : 반복 실행할 명령.
|
15.1.4.1.1. 숫자 출력하기 : FOR LOOP
10부터 2까지 내림 차순으로 짝수를 출력하는 PL/SQL 예문을 FOR LOOP문을 이용하여 작성해 봅시다.
10부터 2까지 내림차순으로 짝수를 출력하세요. |
SET SERVEROUTPUT ON;
DECLARE -- 초기값 2를 가지는 변수 v_step을 선언 v_step PLS_INTEGER := 2; BEGIN -- FOR LOOP 5부터 1까지 -1씩 증가하면서 5번 반복 FOR I IN REVERSE 1..5 LOOP -- 10부터 2까지 5번 반복하면서 값을 출력 DBMS_OUTPUT.PUT_LINE(I * v_step); END LOOP; -- FOR LOOP 종료 END;
|
<실행결과>
10
8
6
4
2
15.1.4.1.2. 구구단 출력하기 : FOR LOOP
구구단 2단, 3단을 출력하는 PL/SQL 예문을 FOR LOOP문을 이용하여 작성해 봅시다.
SET SERVEROUTPUT ON;
DECLARE -- 숫자 1자리를 저장할 수 있는 NUMBER형 변수 I, J를 선언 I NUMBER(1); J NUMBER(1); BEGIN -- 외부 루프 FOR I IN 2..3 LOOP -- 내부 루프 FOR J IN 1..9 LOOP DBMS_OUTPUT.PUT_LINE( I || ' * ' || J || '=' || I * J); END LOOP; -- 내부 루프 종료 DBMS_OUTPUT.PUT_LINE(''); END LOOP; -- 외부 루프 종료 END; |
<실행결과>
2 * 1=2
…...
2 * 9=18
3 * 1=3
…...
3 * 9=27
15.1.4.3. WHILE LOOP문
지정한 조건이 참(TRUE)인 동안 LOOP 안쪽 명령을 실행합니다. 조건이 거짓이라면 LOOP 안쪽 명령은 한번도 실행되지 않습니다.
<기본형식>
WHILE condition LOOP statements END LOOP;
condition : 루프가 반복될 때마다 먼저 평가되며 TRUE 경우만 LOOP ~ END LOOP 사이의 명령문을 실행 합니다. FALSE, NULL이 되면 루프는 종료 됩니다. LOOP에 들어가기 전에 condition이 FALSE이면 WHILE 루프는 전혀 실행되지 않습니다. 이 동작은 루프 본문이 항상 한 번 실행되는 BASIC LOOP 문과 다릅니다. statements : 반복 실행할 명령. LOOP를 조기에 종료하려면 EXIT, EXIT WHEN절을 사용합니다.
|
15.1.4.3.1. 구구단 출력하기 : WHILE LOOP
구구단 2단, 3단을 출력하는 PL/SQL 예문을 WHILE LOOP문을 이용하여 작성해 봅시다.
SET SERVEROUTPUT ON;
DECLARE -- NUMBER형 변수 I, J를 선언하고 초기치 할당 -- 구구단에서 I는 2부터 시작하고 J는 1부터 시작한다. I NUMBER(1) := 1; J NUMBER(2) := 0; BEGIN -- 외부 루프(2단부터 3단까지 출력) WHILE I < 3 LOOP I := I + 1; -- 내부 루프(1~9까지 반복) WHILE J < 9 LOOP J := J + 1; DBMS_OUTPUT.PUT_LINE( I || ' * ' || J || '=' || I * J); END LOOP; -- 내부 루프 종료 DBMS_OUTPUT.PUT_LINE(''); J := 0; END LOOP; -- 외부 루프 종료 END; |
<실행결과>
2 * 1=2
…...
2 * 9=18
3 * 1=3
…...
3 * 9=27