본문 바로가기
SQL

oracle] PL/SQL - 제어문

by dreamer_dev 2024. 6. 3.

 

1. PL/SQL - 제어문

 

1) IF문

:조건이  TRUE이면 해당 조건 처리 문장이 실행된다. 

--조건이 1개일 경우
IF 조건 THEN
	조건처리
END IF;

--조건이 2개일 경우
IF 조건 THEN
	조건 처리 1;
ELSE
	조건 처리 2;
END IF;

--조건이 n개일 경우
IF 조건1 THEN
	조건 처리1;
ELSIF 조건2 THEN
	조건 처리 2;
    ...
ELSE
	조건 처리 n;
END IF;

 

2) CASE 문 

--유형 1 
CASE 표현식 
	WHEN 결과1 THEN
    	처리문1 ;
    WHEN 결과2 THEN
		처리문 2;
    ...   
   	ELSE
    	기타 처리문;
END CASE ; 

--유형 2
CASE WHEN 표현식 1 THEN
    	처리문1 ;
    WHEN 표현식 2 THEN
		처리문 2;
    ...   
   	ELSE
    	기타 처리문;
END CASE ;

 

예시]

DECLARE
	vn_salary NUMBER := 0;
    vn_department_id NUMBER :=0;

BEGIN
	vn_department_id := ROUND(DBMS_RANDOM.VALUE (10,120), -1);
    
    SELECT SALARY
    	INTO vn_salary
        FROM EMPLOYEE
    WHERE DEPARTMENT_ID = vn_department_id
    	AND ROWNUM = 1;
    
    DBMS_OUTPUT.PUT_LIN(vn_salary);
    
    CASE WHENE vn_salary BETWEEN 1 AND 3000 THEN
    	DBMS_OUTPUT.PUT_LIN('낮음');
    CASE WHENE vn_salary BETWEEN 3001 AND 6000 THEN
    	DBMS_OUTPUT.PUT_LIN('중간');
    CASE WHENE vn_salary BETWEEN 6001 AND 10000 THEN
    	DBMS_OUTPUT.PUT_LIN('높음');
   	ELSE
		DBMS_OUTPUT.PUT_LIN('최상위');
    END CASE;
    
END;

---------결과---------
12008
최상위

 


3) LOOP 문 

: 반복해서 로직을 처리하는 반복문 

-LOOP문은 특정 조건이란 것이 없음. EXIT를 통해서 루프를 종료한다. (EXIT를 누락하면 무한루프 )

LOOP
	처리문 ;
    EXIT [WHEN 조건];
END LOOP; 

---------예시-------- 
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; --루프를 돌면서 vn_cnt 1증가
        EXIT WHEN vn_cnt > 9 ; -- vn_cnt가 9보다 크면 루프 종료하기 
	END LOOP;
END;

=> 구구단 3단이 출력됨

      3*1 =3 ... 

 

4) WHILE 문 

WHILE 조건
LOOP
	처리문;
END LOOP;
---------예시-------- 
DECLARE
	vn_base_num NUMBER := 3;
    vn_cnt      NUMBER := 1;
BEGIN 
	WHILE  vn_cnt >= 9 ; --vn_cnt가 9보다 작거나 같을 때만 반복 처리 
    LOOP
    	DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
        vn_cnt := vn_cnt + 1 ; --루프를 돌면서 vn_cnt 1증가 
	END LOOP;
END;

 

5) FOR문

FOR 인덱스 IN [REVERSE]초깃값..최종값
LOOP 
	처리문;
END LOOP;
---------구구단 3단 예시-------- 
DECLARE
	vn_base_num NUMBER := 3;
BEGIN 
	FOR i IN 1..9
    LOOP
    	DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
	END LOOP;
END;
-----------------------------
---------REVERSE 예시-------- 
DECLARE
	vn_base_num NUMBER := 3;
BEGIN 
	FOR i IN REVERSE 1..9
    LOOP
    	DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
	END LOOP;
END;
--------------------------
3*9=27
3*8=24
...

 

6) CONTINUE문 

-반복문 내에서 특정 조건에 부합할 때 처리 로직을 건너뛰고 상단의 루프 조건으로 건너가 루프를 계속 수행할 때 사용함. 

-EXIT는 루프를 완전히 빠져나오지만, CONTINUE는 제어 범위가 조건절로 넘어간다. 

-오라클 11g 부터 지원함. 

----------구구단 3단에서 5를 제외하고 처리하는 SQL-------------
DECLARE
	vn_base_num NUMBER := 3;
BEGIN 
	FOR i IN 1..9
    LOOP
    	CONTINUE WHEN i = 5;
    	DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
	END LOOP;
END;

 

 

7)GOTO문 

-PL/SQL 코드 상에서 GOTO문을 만나면 GOTO문이 지정하는 라벨로 제어가 넘어감.

DECLARE
	vn_base_num NUMBER := 3;
BEGIN 
	<<third>>
	FOR i IN 1..9
    LOOP
    	DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
        IF i = 3 THEN -- i가 3이면 fourth로 넘어가기 
        	GOTO fourth;
        END IF;
	END LOOP;
    
    <<fourth>>
    vn_base_num := 4;
    FOR i IN 1..9
    LOOP
    	DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
	END LOOP;
END;

-- 일반적으로 특정 로직에 맞게 PL / SQL 코드를 순착적으로 작성하는데 GOTO문을 사용하면 로직의 일관성을 훼손함. 가독성이 나빠져 개발 현장에서는 GOTO문을 잘 사용하지 않는다. 

 

8) NULL문 

-NULL문은 아무것도 처리하지 않는 문장. 

-IF문이나 CASE문을 작설항 때 주로 사용.

-조건에 따라 처리 로직을 작성하고 앞에서 작성한 모든 조건에 부합되지 않을 때 (ELSE절을 아무것도 처리하지 않고 싶은 경우 ) NULL문 을 사용

IF vn_variable = 'A' THEN 
	처리로직 1 ;
ELSIF vn_variable ='B' THEN
	처리로직 2;
    ...
ELSE NULL;
END IF;

---------------------
CASE WHEN vn_variable ='A' THEN 
	처리로직 1; 
    WHEN vn_variable ='B' THEN
    처리로직 2;
    ....
    ELSE NULL;
END CASE;

 

'SQL' 카테고리의 다른 글

oracle] 프로시저 (PROCEDURE) 1  (0) 2024.06.10
oracle] PL/SQL의 사용자 정의 함수  (1) 2024.06.06
oracle] PL/SQL - 구성요소  (0) 2024.05.26
oracle] PL/SQL - 기본구조  (1) 2024.05.26
[MYSQL] MYSQL에서 NVL을 대체하는 함수 IFNULL  (3) 2024.04.05