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문을 이용하여 작성해 봅시다.
구구단 2단, 3단을 출력하세요. |
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;
|
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문을 이용하여 작성해 봅시다.
구구단 2단, 3단을 출력하세요. |
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;
|
15.1.4.3.1. 구구단 출력하기 : WHILE LOOP
구구단 2단, 3단을 출력하는 PL/SQL 예문을 WHILE LOOP문을 이용하여 작성해 봅시다.
구구단 2단, 3단을 출력하세요. |
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