공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

예제는 Oracle Database에서 기본으로 제공되는 SCOTT계정 데이터로 진행됩니다.

 

 

 

 

 SQLDeveloper에서 PL/SQL 실행하기 

보기  DBMS 출력  DBMS 출력 창의  +  버튼 누르기 → 접속할 DB 선택 후 확인

 

 

 

조건 제어문(조건문) - IF, CASE

1. IF 조건문

  • IF-THEN : 특정 조건을 만족하는 경우 작업 수행
  • IF-THEN-ELSE : 특정 조건을 만족하는 경우와 그렇지 않은 경우의 작업 수행
  • IF-THEN-ELSIF : 위의 두 가지 이외의 여러 조건에 따라 각각 지정한 작업 수행

 

  ■ IF-THEN

IF [조건식] THEN 	-- true나 false판별이 가능한 조건식을 지정. 여러 연산자 및 함수 사용 가능
   [조건식이 true일 때 수행할 명령어];
END IF; 	-- IF-THEN 종료

 IF-THEN 은 주어진 조건식의 결과가  true 일 경우에는 작업을 수행하지만 조건식이  false 또는  NULL 일 경우에는  IF 문을 수행하지 않고 넘어간다.

 

 

  ■ IF-THEN-ELSE

IF [조건식] THEN 	-- true나 false판별이 가능한 조건식을 지정. 여러 연산자 및 함수 사용 가능
   [조건식이 true일 때 수행할 명령어];
ELSE
   [조건식이 false일 때 수행할 명령어];
END IF; 	-- IF-THEN-ELSE문 종료

조건식이  true 일 때의 작업만 지정할 수 있는  IF-THEN 과 달리

 IF-THEN-ELSE 는 조건식이  true 인 경우와  false 인 경우 두 가지에 대한 작업을 지정할 수 있다.

 

 

  ■ IF-THEN-ELSIF

IF [조건식] THEN 	-- true나 false판별이 가능한 조건식을 지정. 여러 연산자 및 함수 사용 가능
   [IF의 조건식이 true일 때 수행할 명령어];
ELSIF [조건식]
   [IF의 조건식 false / ELSIF의 조건식이 true일 때 수행할 명령어];
ELSEIF [조건식]
   [IF의 조건식 false/ 첫 번째 ELSIF의 조건식도 false / 두 번째 ELSEIF의 조건식이 true일 때 수행할 명령어];
...
ELSE
   [위에 나온 조건식이 모두 false일 때 수행할 명령어];
END IF; 	-- IF-THEN-ELSIF문 종료

 IF-THEN-ELSIF 문은 여러 종류의 조건식을 지정하여 각 조건을 만족하는 경우마다 다른 작업을 지정할 수 있다.

 

 

DECLARE
    V_SCORE NUMBER := 87;
BEGIN
    IF V_SCORE >= 90 THEN
        DBMS_OUTPUT.PUT_LINE('A 학점');
    ELSIF V_SCORE >= 80 THEN
        DBMS_OUTPUT.PUT_LINE('B 학점');
    ELSIF V_SCORE >= 70 THEN
        DBMS_OUTPUT.PUT_LINE('C 학점');
    ELSIF V_SCORE >= 60 THEN
        DBMS_OUTPUT.PUT_LINE('D 학점');
    ELSE
        DBMS_OUTPUT.PUT_LINE('F 학점');
    END IF;
END;
/

 IF 문을 이용한 학점 출력 예시이다. 차례대로 조건식을 비교하여  true 가 되는 부분의 명령어를 실행하고  IF 문을 빠져나간다. 

 

실행 결과



 

2. CASE 조건문

  SQL문에 사용하는  CASE 문이 조건에 따라 특정 결과 값을 반환하는 것에 그치는데 반해 PL/SQL문의  CASE 문은 조건에 따라 수행할 작업을 지정할 수 있다는 차이가 있다. 또한 SQL문의  CASE  END 로 종료되며 PL/SQL문의  CASE 문은  END CASE 로 종료된다. 

 

  •  단순 CASE문  : 비교 기준이 되는 조건의 값이 여러 가지일 때 해당 값만 명시하여 작업 수행
  •  검색 CASE문  : 특정한 비교 기준 없이 여러 조건식을 나열하여 조건식에 맞는 작업 수행 

 

 

  ■ 단순 CASE문

CASE [비교 기준] 	-- 여러 가지 결과 값이 나올 수 있는 변수나 식을 명시
    WHEN [값1] THEN
       [비교기준이 값1일 때 수행할 명령어];
    WHEN [값2] THEN
       [비교기준이 값2 일 때 수행할 명령어];
    ...
    ELSE
    	[비교기준이 모두 해당하지 않을 때 수행할 명령어];
END CASE;	-- CASE문 종료

   CASE 문도  IF 문과 마찬가지로 조건식의 결과 값에 따라 여러 가지 작업을 지정할 수 있다. 그중에서도 단순  CASE 문은 비교 기준(결과 값이 여러 가지로 나오는)이 되는 변수 또는 식을 명시하고 각 결과에 따라 수행할 작업을 지정할 수 있다. 조건식의 결과 값이 여러 가지 일 때  IF 문에 비해 간결하게 표현할 수 있다는 장점이 있다. (한번 조건식이  true 가 되어 해당 부분의 명령어가 실행되면 그 후에  true 가 되는 조건식이 있어도  CASE 문을 빠져나간다. 또한 C나 Java같은 언어와 다르게  break 문이 없어도 해당하는 부분만 실행하고  CASE 문을 빠져나간다.)

 

 

DECLARE
    V_SCORE NUMBER := 87;
BEGIN
    CASE TRUNC(V_SCORE/10)
        WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('A 학점');
        WHEN 9 THEN DBMS_OUTPUT.PUT_LINE('A 학점');
        WHEN 8 THEN DBMS_OUTPUT.PUT_LINE('B 학점');
        WHEN 7 THEN DBMS_OUTPUT.PUT_LINE('C 학점');
        WHEN 6 THEN DBMS_OUTPUT.PUT_LINE('D 학점');
        ELSE DBMS_OUTPUT.PUT_LINE('F 학점');
    END CASE;
END;
/

 IF 문에서 나왔던 학점 출력 예시를 단순  CASE 문으로 바꾸면 위와 같이 된다. (실행 결과는 같다)

 

 

 

  ■ 검색 CASE문

CASE
    WHEN [조건식 1] THEN
       [조건식 1이 true일 때 수행할 명령어];
    WHEN [조건식 2] THEN
       [조건식 2가 true일 때 수행할 명령어];
    ...
    ELSE
    	[조건문이 모두 false일 때 수행할 명령어];
END CASE;	-- CASE문 종료

  검색  CASE 문은 단순  CASE 문과 달리 비교 기준이 없고  WHEN 옆에 조건식이 들어가는 것이 다르다. 조건 식이  true 가 되는 경우가 있으면 해당 영역의 명령어를 수행하고  CASE 문을 빠져나온다. (단순  CASE 문과 마찬가지로 한번 조건식이  true 가 되어 해당 부분의 명령어가 실행되면 그 후에  true 가 되는 조건식이 있어도  CASE 문을 빠져나간다. 또한 C나 Java같은 언어와 다르게  break 문이 없어도 해당하는 부분만 실행하고 CASE문을 빠져나간다.)

 

 

DECLARE
    V_SCORE NUMBER := 87;
BEGIN
    CASE 
        WHEN V_SCORE >= 90 THEN DBMS_OUTPUT.PUT_LINE('A 학점');
        WHEN V_SCORE >= 80 THEN DBMS_OUTPUT.PUT_LINE('B 학점');
        WHEN V_SCORE >= 70 THEN DBMS_OUTPUT.PUT_LINE('C 학점');
        WHEN V_SCORE >= 60 THEN DBMS_OUTPUT.PUT_LINE('D 학점');
        ELSE DBMS_OUTPUT.PUT_LINE('F 학점');
    END CASE;
END;
/

단순  CASE 문에 나왔던 학점 출력 예시를 검색  CASE 문으로 바꾸면 위와 같다. (실행 결과는 같다.)

 

 

 

 

 

반복 제어문(반복문) - LOOP, WHILE, FOR

  • 기본  LOOP  : 기본 반복문
  •  WHILE LOOP  : 특정 조건식의 결과를 통해 반복 수행
  •  FOR LOOP  : 반복 횟수를 정하여 반복 수행
  •  Cusor FOR LOOP  : 커서를 활용한 반복 수행

 

   반복문과 관련된 명령어 

  •  EXIT  : 수행 중인 반복 종료
  •  EXIT-WHEN  : 조건식을 만족하면 반복 종료
  •  CONTINUE  : 수행 중인 반복의 현재 주기를 건너뜀
  •  CONTINUE-WHEN  : 조건식을 만족하면 수행 중인 반복의 현재 주기를 건너뜀

 

  ■ 기본 LOOP

LOOP
   [반복 수행 작업];
END LOOP;

  기본  LOOP 문은 반복을 위한 별다른 조건 없이 반복할 작업 내용을 지정해 준다. 반복의 종료 시점이나 조건식을 따로 명시하지 않으므로 지정한 작업을 무한히 반복 수행하게 되며, 이러한 현상을 무한 루프(Infinite Loop)라고 한다. 그러나 무한하게 반복 작업을 해야 하는 경우는 많지 않으므로 대부분의 기본  LOOP 문은 반복을 종료하기 위해  EXIT 명령어를 같이 사용한다.

 

 

DECLARE
    V_NUM NUMBER := 0;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE('현재 V_NUM : ' || V_NUM);
        V_NUM := V_NUM + 1; 	-- V_NUM을 1씩 증가시킴
        EXIT WHEN V_NUM > 4;	-- V_NUM이 4보다 클 경우 LOOP문 종료

	/* IF문과 EXIT을 사용해도 된다.
        IF V_NUM > 4 THEN
            EXIT;
        END IF;
        */
        
    END LOOP;
END;
/

기본  LOOP 문에  EXIT-WHEN 을 써서 조건식을 만족하면  LOOP 문을 빠져나오게 한 예시이다.

 

실행 결과

출력은 되지 않지만  V_NUM  5 가 되었을 때  EXIT-WHEN 의 조건식을 만족해서  LOOP 문이 종료된다.

 

 

 

  ■ WHILE LOOP

WHILE [조건식] LOOP
    [반복 수행 작업];
END LOOP;

   WHILE LOOP 문은 반복 수행 여부를 결정하는 조건식을 먼저 지정한다. 조건식의 결과 값이  true 일 동안 반복하다가 조건식의 결과 값이  false 가 되면 반복을 끝낸다.  WHILE LOOP 문은 반복 수행이 시작되기 전에 조건식을 검사하므로 조건식의 결과 값에 따라 단 한 번도 반복되지 않을 수도 있다.

 

 

DECLARE
    V_NUM NUMBER := 0;
BEGIN
    WHILE V_NUM < 4 LOOP
        DBMS_OUTPUT.PUT_LINE('현재 V_NUM : ' || V_NUM);
        V_NUM := V_NUM + 1;
    END LOOP;
END;
/

 

실행 결과

조건인  V_NUM  4 보다 작을 동안( 0 ~ 3 ) 반복문이 실행되는 것을 확인할 수 있다.

 

 

 

  ■ FOR LOOP

FOR i IN [시작 값]..[종료 값] LOOP 	-- 카운터인 i가 시작값부터 종료 값이 될 때까지 반복
    [반복 수행 작업];
END LOOP;

  반복 횟수가 정해져 있을 때  FOR LOOP 문을 사용한다. 지정한 시작 값부터  1 씩 증가하여 종료 값이 될 때까지 작업을 반복한다.  i 는 반복문 안에서 현재 숫자(시작 값과 종료 값 사이)가 저장되는 특수한 변수로 카운터(counter)라고 한다. 카운터는 선언부에 정의하지 않고  FOR LOOP 문에서 바로 정의하여 사용하고,  FOR LOOP 문 안에서만 사용 가능하다. 또한 값을 임의로 할당할 수 없고 현재 저장되어 있는 값을 참조만 할 수 있다.

 

 

BEGIN
    FOR i IN 0..4 LOOP	
        DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
    END LOOP;
END;
/

 

실행 결과

시작 값인  0 부터  4 까지  5 번 반복하고, 반복이 진행됨에 따라 카운터인  i 값이 증가하는 것을 확인할 수 있다.

 

 

 

  + 역순 반복

FOR i IN REVERSE [시작 값]..[종료 값] LOOP
    [반복 수행 작업];
END LOOP;

 FOR LOOP 문에  REVERSE 키워드를 사용하면 값을 역순으로 반복할 수 있다.

시작 값과 종료 값의 위치는 변하지 않으므로 주의한다. 

 

 

 

  ■ Cursor FOR LOOP (IN 연산자)

BEGIN
    FOR i IN (SELECT * FROM DEPT) LOOP
        DBMS_OUTPUT.PUT_LINE(i.deptno || ' : ' || i.dname);
    END LOOP;
END;
/

  FOR 문에 IN연산자를 사용하고 뒤에 테이블이 오면 그 테이블의 행 수만큼 반복문이 실행된다. (커서를 활용한 것인데  i 는 루프 인덱스(loop index)로 커서에 저장된 각 행이 저장되는 변수를 뜻한다 위의  i.deptno 처럼  . 을 통해 행의 각 필드에 접근할 수 있다. 커서와  FOR LOOP 문을 사용하면  OPEN ,  FETCH ,  CLOSE 문을 작성하지 않아도 되고 루프 인덱스에 커서 각 행을 저장하므로 결과 행을 저장하는 변수 선언도 필요하지 않다.(자세한 내용은 커서와 예외처리 게시글 참조))

 

 

실행 결과

 

 

 

   CONTINUE문, CONTINUE-WHEN문 

   CONTINUE 문과  CONTINUE-WHEN 문은 오라클 11g 버전부터 사용할 수 있다. 반복 수행 중  CONTINUE 가 실행되면 현재 반복 주기에 수행해야 할 남은 작업을 건너뛰고 다음 반복 주기로 바로 넘어가는 효과가 있다.  CONTINUE-WHEN 문도  CONTINUE 문과 같은 기능이지만 특정 조건식을 만족할 때 다음 반복 주기로 넘어간다.

 

 

BEGIN
    FOR i IN 0..4 LOOP
        CONTINUE WHEN MOD(i, 2) = 1; 	-- i를 2로 나눈 값이 1(홀수)이면 반복문의 현재 주기를 건너 뜀
        DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
    END LOOP;
END;
/

 CONTINUE-WHEN 문을 사용해서 짝수만 출력하는 예시이다.

 i 가 홀수( 2 로 나눈 나머지가  1 )인 경우 반복문의 현재 주기를 건너뛰기 때문에  PUT_LINE 이 실행되지 않는다.

 

실행 결과

 

 

 

 

 

순차 제어문(sequential control)

  •  GOTO문  : 지정한 라벨로 넘어감 (잘 사용하지 않음)
  •  NULL문  : 아무것도 실행하지 않음
    보통  IF 문이나  CASE 문에서 사용하며  ELSE 절을 아무것도 실행되지 않도록 처리할 때 많이 사용한다.

 

 

 

+ Recent posts