LOOP문
PL/SQL의 기본적인 반복문. EXIT를 누락시키면 무한루프에 빠지니 주의해야한다.
1 2 3 4 | LOOP 처리문; EXIT [WHEN 조건] END LOOP; | cs |
예제
1 2 3 4 5 6 7 8 9 10 11 12 | DECLARE VN_BASE_NUM NUMBER := 3; VN_CNT NUMBER := 1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || VN_CNT || '=' || VN_BASE_NUM * VN_CNT); VN_CNT := VN_CNT + 1; EXIT WHEN VN_CNT > 9; END LOOP; END; | cs |
WHILE문
LOOP와 비슷하나 WHILE 뒤에 조건을 붙여, 해당 조건을 만족할 때 반복한다.
1 2 3 4 | WHILE 조건 LOOP 처리문; END LOOP; | cs |
예제
1 2 3 4 5 6 7 8 9 10 11 | DECLARE VN_BASE_NUM NUMBER := 3; VN_CNT NUMBER := 1; BEGIN WHILE VN_CNT < 9 LOOP DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || VN_CNT || '=' || VN_BASE_NUM * VN_CNT); VN_CNT := VN_CNT + 1; END LOOP; END; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 | DECLARE VN_BASE_NUM NUMBER := 3; VN_CNT NUMBER := 1; BEGIN WHILE VN_CNT < 9 LOOP DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || VN_CNT || '=' || VN_BASE_NUM * VN_CNT); EXIT WHEN VN_CNT = 5; VN_CNT := VN_CNT + 1; END LOOP; END; | cs |
FOR문
1 2 3 4 | FOR 인덱스 IN [REVERSE] 초기값..최종값 LOOP 처리문; END LOOP; | cs |
인덱스는 루프 안에서 참조할 수 있으나 변경할 수 없다.
예제
1 2 3 4 5 6 7 8 | DECLARE VN_BASE_NUM NUMBER := 3; BEGIN FOR IDX IN 1..9 LOOP DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || IDX || '=' || VN_BASE_NUM * IDX); END LOOP; END; | cs |
1 2 3 4 5 6 7 8 | DECLARE VN_BASE_NUM NUMBER := 3; BEGIN FOR IDX IN REVERSE 1..9 LOOP DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || IDX || '=' || VN_BASE_NUM * IDX); END LOOP; END; | cs |
CONTINUE문
반복문 내에서 특정 조건에 부합할 때 처리 로직을 건너뛰고 상단의 루프 조건으로 건너가 루프를 계속 수행할 때 사용한다.
EXIT는 루프를 완전히 빠져나오지만, CONTINUE는 제어 범위가 조건절로 넘어간다.
예제
1 2 3 4 5 6 7 8 9 | DECLARE VN_BASE_NUM NUMBER := 3; BEGIN FOR IDX IN REVERSE 1..9 LOOP CONTINUE WHEN IDX=5; DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || IDX || '=' || VN_BASE_NUM * IDX); END LOOP; END; | cs |
GOTO문
GOTO문을 만나면 GOTO문이 지정하는 라벨로 제어가 넘어간다.
현장에서는 GOTO문을 잘 사용하지 않는다. 왜냐하면 일반적으로 특정 로직에 맞게 PL/SQL 코드를
순차적으로 작성하는데, 중간중간에 GOTO문을 사용해 제어를 다른 부분으로 넘기면 로직의 일관성을 훼손하기 때문이다.
소스코드가 길어지면 이 문제가 더 심각해져 소스코드의 가독성이 극도로 나빠진다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | DECLARE VN_BASE_NUM NUMBER := 3; BEGIN <<THIRD>> FOR IDX IN 1..9 LOOP DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || IDX || '=' || VN_BASE_NUM * IDX); IF IDX = 3 THEN GOTO FOURTH; END IF; END LOOP; <<FOURTH>> VN_BASE_NUM := 4; FOR IDX IN 1..9 LOOP DBMS_OUTPUT.PUT_LINE(VN_BASE_NUM || '*' || IDX || '=' || VN_BASE_NUM * IDX); END LOOP; END; | cs |
NULL문
NULL문은 아무것도 처리하지 않는 문장이다.
보통 IF문이나 CASE문을 작성할때 주로 사용하며, ELSE절을 수행할 때 아무것도 처리하지 않고 싶을때 사용한다.
구조
1 2 3 4 5 6 7 8 | IF VN_VARIABLE = 'A' THEN 처리로직1; ELSIF VN_VARIABLE = 'B' THEN 처리로직2; ... ELSE NULL; END IF; | cs |
1 2 3 4 5 6 7 | CASE WHEN VN_VARIABLE = 'A' THEN 처리로직1; WHEN VN_VARIABLE = 'B' THEN 처리로직2; ... ELSE NULL; END CASE; | cs |
반응형
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[PL/SQL] 프로시저(PROCEDURE) (0) | 2018.01.23 |
---|---|
[PL/SQL] 사용자 정의함수 (0) | 2018.01.22 |
[PL/SQL] IF문 / CASE문 (0) | 2018.01.21 |
[PL/SQL] PL/SQL 기초 (0) | 2018.01.17 |
[SQL] 다중 테이블 INSERT (1) | 2018.01.16 |