PL/SQL에서의 반복문은 크게 LOOP, FOR로 볼 수 있다.

 

FOR LOOP

  • 문법
FOR index in [REVERSE] 시작값 .. END값 LOOP
        STATEMENT 1
        STATEMENT 2
        ...
    END LOOP;
    
  • index는 자동 선언되는 binary_integer형 변수이고, 1씩 증가
  • REVERSE 옵션이 사용될 경우 index는 upper_bound에서 lower_bound로 1씩 감소
  • IN 다음에는 cursor나 SELECT 문이 올 수 있다.

 

  • EX 1)
SET serveroutput ON;
	BEGIN
		FOR i in 1..4 LOOP
	  		if mod(i, 2) = 0 then 
				dbms_output.put_line( i || '는 짝수!!');
			else
				dbms_output.put_line( i || '는 홀수!!');
			end if;
		END LOOP;
	END;

 

  • EX 2) 간단한 FOR문 안에 SELECT문이 오는 예제
SET serveroutput ON;
	BEGIN
		FOR NUM_LIST IN 
	    (
	        SELECT 1 AS NUM FROM DUAL
	        UNION ALL
	        SELECT 2 AS NUM FROM DUAL
	        UNION ALL
	        SELECT 3 AS NUM FROM DUAL
	        UNION ALL
	        SELECT 4 AS NUM FROM DUAL
	    )
	    LOOP
		  	if mod(NUM_LIST.NUM, 2) = 0 then 
				dbms_output.put_line( NUM_LIST.NUM || '는 짝수!!');
			else
				dbms_output.put_line( NUM_LIST.NUM || '는 홀수!!');
			end if;
		END LOOP;
	END;

 

LOOP

  • 문법
    LOOP 
        PL/SQL STATEMENT 1
           다른 LOOP를 포함하여 중첩으로 사용 가능
        EXIT [WHEN CONDITION]
    END LOOP;
  • EXIT 문이 사용되었을 경우, 무조건 LOOP문을 빠져나간다.
  • EXIT WHEN 조건이 사용될 경우, WHEN절에서 LOOP를 빠져나가는 조건을 제어할 수 있다.

 

  • EX 1) 기본 LOOP문 예제
	SET serveroutput ON;
	DECLARE
	    v_num NUMBER := 6; -- 시작숫자
	    v_tot_num NUMBER := 0; -- 총 loop수 반환 변수
	BEGIN
	    LOOP
	        DBMS_OUTPUT.PUT_LINE('현재 숫자 : ' || v_num);
	        v_num := v_num + 1;
	        v_tot_num := v_tot_num + 1;
	        EXIT WHEN v_num > 10;
	    END LOOP;
	    
	    DBMS_OUTPUT.PUT_LINE(v_tot_num || '번의 LOOP');
	END;

 

  • EX 2) WHILE LOOP문 예제
	SET serveroutput ON;
	DECLARE
	    v_num NUMBER := 6; -- 시작숫자
	    v_tot_num NUMBER := 0; -- 총 loop수 반환 변수
	BEGIN
	    WHILE v_num < 11 LOOP
	        DBMS_OUTPUT.PUT_LINE('현재 숫자 : ' || v_num);
	        v_num := v_num + 1;
	        v_tot_num := v_tot_num + 1;
	        -- EXIT WHEN v_num > 10;
	    END LOOP;
	    DBMS_OUTPUT.PUT_LINE(v_tot_num || '번의 LOOP');
	END;

 

 

제어문

IF문, CASE문 등의 제어문을 PL/SQL에서도 사용할 수 있다.

 

IF

  • 문법
    IF 조건1 THEN
        처리문1
    ELSE IF 조건2 THEN
        처리문2
        ...
    ELSE
        처리문
    END IF;
  • IF문은 조건값이 참이면 해당 조건의 처리 문장이 실행
  • 다른 프로그래밍 IF문과 다른 점
    • 조건 다음에 THEN을 붙인다.
    • 보통 ELSE IF를 쓰지만, PL/SQL에서는 ELSIF 명령어를 사용한다.
    • 마지막에는 IF를 끝낸다는 END IF를 붙인다.
  • EX 1) 기본 IF문 예제
	DECLARE
	    v_score NUMBER := 79;
	BEGIN
	  IF v_score >= 90 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : A');
	  ELSIF v_score >= 80 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : B');
	  ELSIF v_score >= 70 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : C');
	  ELSIF v_score >= 60 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : D');
	  ELSE
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : F');
	  END IF;
	END;

 

  • EX 2) IF문 예제 2 - 조건이 NULL인 경우
    • NULL의 비교는 항상 NULL이기 때문에, ELSE 이하 문만 수행
	DECLARE
	    v_score NUMBER;
	BEGIN
	  IF v_score >= 90 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : A');
	  ELSIF v_score >= 80 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : B');
	  ELSIF v_score >= 70 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : C');
	  ELSIF v_score >= 60 THEN
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : D');
	  ELSE
	    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : F');
	  END IF;
	END;

 

CASE문

  • 문법
    • 오라클 CASE문과 유사
	CASE WHEN 조건1 THEN
	    처리문1
	WHEN 조건2 THEN
	    처리문2
	    ...
	ELSE
	    처리문
	END CASE;

 

  • EX 1) CASE 표현식 예제
    • 단순하게 조건문에 따른 값을 대입할 때 사용
	DECLARE
	    v_grade     CHAR(1) := 'C';
	    v_appraisal VARCHAR2(20) ;
	BEGIN
	  v_appraisal := CASE v_grade
	  				WHEN 'A' THEN 'Excellent'
	  				WHEN 'B' THEN 'Very Good'
					WHEN 'C' THEN 'Good'
					ELSE 'No such grade'
	  			END;
	  DBMS_OUTPUT.PUT_LINE ('Grade : '|| v_grade) ;
	  DBMS_OUTPUT.PUT_LINE ('Appraisal: '|| v_appraisal);
	END;

 

  • EX 2) CASE 조건문 예제
    • 단순한 값이 아닌 PL/SQL문(명령문)을 실행하고자 하는 경우에 CASE 조건문 사용
    • CASE 조건문은 끝이 END CASE로 끝남
	DECLARE
	    v_grade     CHAR(1) := 'C';
	    v_appraisal VARCHAR2(20) ;
	BEGIN
	  CASE v_grade
	  WHEN 'A' THEN
	  	v_appraisal := 'Excellent';
	  WHEN 'B' THEN
	    v_appraisal := 'Very Good';
	  WHEN 'C' THEN
	    v_appraisal := 'Good';
	  ELSE
	    v_appraisal := 'No such grade';
	  END CASE;
	  DBMS_OUTPUT.PUT_LINE ('Grade : '|| v_grade) ;
	  DBMS_OUTPUT.PUT_LINE ('Appraisal: '|| v_appraisal);
	END;

'Study > Oracle' 카테고리의 다른 글

PL/SQL_6 - 테이블 함수  (0) 2021.05.18
PL/SQL 기본_5 - 함수  (0) 2021.05.17
PL/SQL 기본_4 - 프로시저  (0) 2021.05.10
PL/SQL 기본_3 - 커서  (0) 2021.05.10
PL/SQL 기본_1  (0) 2021.05.10

+ Recent posts