1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[PL/SQL] 반복문
📃 DATABASE/ORACLE

[PL/SQL] 반복문

2018. 1. 21. 15:47

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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
cs


EXIT 구문을 이용해 5 이후로는 반복을 멈추도록했다.



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;
Colored by Color Scripter
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;
Colored by Color Scripter
cs


REVERSE 로 인덱스를 역순으로 반복했다.



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;
Colored by Color Scripter
cs


CONTINUE 조건인 인덱스가 5일때는 명령을 실행하지 않았다.



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;
Colored by Color Scripter
cs


인덱스가 3일때 <<FOURTH>> 라벨로 넘어가 명령을 실행했다.



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
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 프로시저(PROCEDURE)
    • [PL/SQL] 사용자 정의함수
    • [PL/SQL] IF문 / CASE문
    • [PL/SQL] PL/SQL 기초
    1HOON
    1HOON

    티스토리툴바