Programming/SQL 기초

[ SQL ] Oracle PL/SQL #2 _ 제어문 & 반복문

yul_S2 2022. 12. 11. 13:27
반응형

PL/SQL 제어문 

 1.  선택문 

  • if 문은 조건을 제시해서 만족하느냐 하지 않느냐에 따라 문을 선택적으로 수행하기 때문에 선택문이라고 한다.
  • 단일 if…then 문은 조건에 따라 어떤 명령을 선택적으로 처리하기 위해 사용하는 가장 대표적인 문이다.
  • if…then 문의 조건이 true 이면 then 문 이하의 문을 실행하고 조건이 false 이거나 null 이면 end if 문으로 수행을 종료한다

 

(1) 단일 if … then 문

if 조건문 then
조건에 만족할 경우 실행되는 문;
end if;

 

ex 1 )  emp 테이블에서 직원의 커미션을 구한다.

#1 화면 출력기능 활성화

SET SERVEROUTPUT ON;

#2 레퍼런스 변수 선언 & 실행문

-- 레퍼런스 변수 선언
DECLARE

    SONEMP EMP%ROWTYPE;
    SONSAL NUMBER(7,2);
BEGIN
    SELECT * INTO SONEMP
    FROM EMP
    WHERE ENAME = 'SMITH';
    -- 커미션이 NULL일 경우를 조건에 지정하고 수행

    IF(SONEMP.COMM IS NULL) THEN
    SONSAL := SONEMP.SAL*12;
    -- 조건이 FALSE이거나 NULL 일 경우를 수행종료

    END IF;
    DBMS_OUTPUT.PUT_LINE('사번 이름 커미션');
    DBMS_OUTPUT.PUT_LINE('----------------');
    DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||' '||SONEMP.ENAME||' '||SONSAL);
END;

 

사번 이름 커미션
----------------
7369 SMITH 9600


PL/SQL 프로시저가 성공적으로 완료되었습니다.

 

 

ex 2 )  emp 테이블에서 부서번호로 부서명을 확인한다.

#1 화면 출력기능 활성화

SET SERVEROUTPUT ON;

#2 레퍼런스 변수와 스칼라 변수 선언 & 실행문

-- 레퍼런스 변수와 스칼라 변수 선언
DECLARE
    SONNO EMP.EMPNO % TYPE;
    SONNAME EMP.ENAME % TYPE;
    SONDEPTNO EMP.DEPTNO % TYPE;
    -- sondname 변수를 null 로 초기화한다
    SONDNAME VARCHAR2(20) := NULL;

BEGIN
    SELECT EMPNO, ENAME, DEPTNO
    INTO SONNO, SONNAME, SONDEPTNO
    FROM EMP
    WHERE EMPNO = 7369;
    -- SONDEPTNO 변수가 10 일 경우를 조건에 지정하고 수행한다.
    IF(SONDEPTNO = 10) THEN
        SONDNAME := 'ACCOUNTING';
    END IF;
   -- SONDEPTNO 변수가 20 일 경우를 조건에 지정하고 수행한다.
    IF(SONDEPTNO = 20) THEN
        SONDNAME := 'CLERK';
    END IF;
    -- SONDEPTNO 변수가 30 일 경우를 조건에 지정하고 수행한다.
    IF(SONDEPTNO = 30) THEN
        sondname := 'sales';
    end if;
    -- SONDEPTNO 변수가 40 일 경우를 조건에 지정하고 수행한다.
    if(sondeptno = 40) then
        sondname := 'operations';
    -- 조건이 false 이거나 null 이면 수행을 종료한다.
    end if;
    dbms_output.put_line(' 사번 이름 부서명');
    dbms_output.put_line('--------------------------');
    dbms_output.put_line(''||SONNO||' '||SONNAME||' '||SONDNAME);
END;
사번 이름 부서명
--------------------------
7369 SMITH CLERK


PL/SQL 프로시저가 성공적으로 완료되었습니다.

 

 

 

 

(2) 이중 if…then…else 문

  • if…then 문 중에 가장 일반적으로 많이 사용되는 형식이 이중 if…then…else 문이다.
  • 이중 if…then…else 문은 참일 때와 거짓일 때 각각 다른 문을 수행하도록 지정할 수 있다.
  • 이중 if…then…else 문은 조건을 검사하고 그 결과가 참이면 조건에 만족하는 문을 수행하고 거짓이면 조건에 만족하지 않는 문을 수행한다.

if 조건문 then
조건에 만족할 경우 실행되는 문;
else
조건에 만족하지 않을 때 실행되는 문;
end if

 

ex )  emp 테이블에서 사원명으로 연봉을 조회한다.

#1 화면 출력기능 활성화

SET SERVEROUTPUT ON;

#2 레퍼런스 변수와 스칼라 변수 선언 & 실행문

-- 레퍼런스 변수와 스칼라 변수 선언
BEGIN

    SELECT * INTO SONEMP
    FROM EMP
    WHERE ENAME = 'SMITH';
    -- 커미션이 NULL일 경우를 조건에 지정하고 수행한다.
    IF(SONEMP.COMM IS NULL) THEN
        SONSAL := SONEMP.SAL*12;
    -- 커미션이 NULL이 아닐 때 수행
    ELSE
        SONSAL := SONEMP.SAL*12 + SONEMP.COMM;
    -- 조건이 FALSE 이거나 NULL이면 수행을 종료
    END IF;
    DBMS_OUTPUT.PUT_LINE('사번 이름 연봉');
    DBMS_OUTPUT.PUT_LINE('-----------------');
    DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||' '||SONEMP.ENAME||' '||SONSAL);
END;
사번 이름 연봉
-----------------
7369 SMITH 9600


PL/SQL 프로시저가 성공적으로 완료되었습니다.

 

 

 

 

 

(3) 다중 if…then…elsif…else 문

  • 다중 if…then…elsif…else 문은 경우의 수가 둘이 아닌 셋 이상에서 하나를 선택해야 할 때 사용한다.

if 조건문 then
조건에 만족할 경우 실행되는 문 1;
elsif 조건문 then
조건에 만족할 경우 실행되는 문 2;

elsif 조건문 then
조건에 만족할 경우 실행되는 문 N;
else
조건에 만족하지 않을 때 실행되는 문;
end if;

 

 

ex ) emp 테이블에서 부서번호로 부서명을 확인한다.

#1 화면 출력기능 활성화

SET SERVEROUTPUT ON;

#2 레퍼런스 변수와 스칼라 변수 선언 & 실행문

-- 레퍼런스 변수와 스칼라 변수를 선언한다.
DECLARE

    SONEMP EMP%ROWTYPE;
    SONDNAME VARCHAR2(14);
BEGIN
    SELECT * INTO SONEMP
    FROM EMP
    WHERE ENAME = 'SMITH';
    -- sondeptno 변수가 10 일 경우를 조건에 지정하고 수행한다.
    IF(SONEMP.DEPTNO = 10)THEN
        SONDNAME := 'ACCOURNTING';
    -- sondeptno 변수가 20 일 경우를 조건에 지정하고 수행한다.
    ELSIF(SONEMP.DEPTNO = 20)THEN
        SONDNAME := 'CLERK';
    -- sondeptno 변수가 30 일 경우를 조건에 지정하고 수행한다.
    ELSIF(SONEMP.DEPTNO = 30)THEN
        SONDNAME := 'SALES'; 
    -- sondeptno 변수가 40 일 경우를 조건에 지정하고 수행한다.
    ELSIF(SONEMP.DEPTNO = 40)THEN
        SONDNAME := 'OPERATIONS';  
    -- 조건이 false 이거나 null 이면 수행을 종료한다.
    END IF;
    DBMS_OUTPUT.PUT_LINE('사번 이름 부서명');
    DBMS_OUTPUT.PUT_LINE('-----------------');
    DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||' '||SONEMP.ENAME||' '||SONDNAME);
END;
사번 이름 부서명
-----------------
7369 SMITH CLERK


PL/SQL 프로시저가 성공적으로 완료되었습니다.

 

 

 

 

 2.  반복문 

  • 반복문은 특정 조건에 따라서 특정 실행문을 반복적으로 수행한다.
  • 반복문은 반복 횟수를 지정하는 것도 가능하고 무한정 반복 처리하는 무한 루프도 가능하다.
  • 선택문이 결과에 중점을 둔다면 반복문은 목적에 중점을 둔다.

 

(1) loop…end loop 문

  • loop…end loop 문은 조건없이 반복 작업을 제공한다.
  • loop…end loop 문은 실행의 흐름이 end loop 문에 도달할 때마다 loop 문으로 제어권을 전달하는 이러한 루프를 무한 루프라 하고 여기서 빠져나가려면 exit 문을 사용한다.
  • loop 문은 루프에 들어갈 때 조건이 이미 일치했다 할지라도 적어도 한 번은 문이 실행된다.
  • exit 문을 이용하여 end loop 문 다음으로 제어권을 전달하기 때문에 루프를 종료할 수 있다.
  • 조건에 따라 루프를 종료할 수 있도록 when 문을 덧붙일 수 있으며 when 문 다음의 조건식이 참이면 루프를 끝내고 루프 후의 다음 문으로 제어권을 전달한다

loop
조건에 만족할 경우 실행되는 문 1;
조건에 만족할 경우 실행되는 문 2;

조건에 만족할 경우 실행되는 문 N;
exit [when 조건식];
end loop

 

ex )   loop…end loop 문으로 1 부터 5 까지 출력한다.

#1 화면 출력기능 활성화

SET SERVEROUTPUT ON;

 

#2 

DECLARE
    NUM NUMBER := 1;
BEGIN
    -- END LOOP 문에서 제어권을 전달받고 반복
    LOOP
        DBMS_OUTPUT.PUT_LINE(NUM);
        -- NUM 변수에 1을 더하여 NUM 변수에 할당하여 누적
        NUM := NUM +1 ;
        IF(NUM > 5) THEN
            EXIT;
        END IF;
        -- 제어권을 LOOP문으로 전달
    END LOOP;
END;

 

1
2
3
4
5


PL/SQL 프로시저가 성공적으로 완료되었습니다.

 

 

 

(2) for…in…end loop 문

  • for…in…end loop 문은 카운트를 기본으로 반복 작업을 제공한다.
  • for…in…end loop 문은 실행의 흐름이 end loop 문에 도달할 때마다 for…in 문의 카운트로 제어권을 전달하여 루프 한다.
  • for…in…end loop 문에서 사용되는 카운트는 정수로 자동 선언되므로 따로 선언할 필요가 없다.
  • for…in…end loop 문은 루프를 반복할 때마다 자동으로 1 씩 증가 또는 감소한다.

for counter in [reverse] lower..upper loop
조건에 만족할 경우 실행되는 문 1;
조건에 만족할 경우 실행되는 문 2;

조건에 만족할 경우 실행되는 문 N;
end loop;

① counter

upper 나 lower 에 도달할 때까지 루프를 반복함으로써 1 씩 자동으로 증가하거나 감소하는 값을 가진 암시적으로 선언된 정수이다.

 

② reverse

upper 에서 lower 까지 반복함으로써 인덱스가 1 씩 감소하도록 한다.

 

③ lower..upper
lower..upper 는 lower 와 upper 사이를 ..(더블 도트)로 구분한다.
lower 는 counter 값의 범위에 대한 하단의 한계값을 지정한다.
upper 는 counter 값의 범위에 대한 상단의 한계값을 지정한다

 

 

ex )  for…end loop 문으로 1 부터 5 까지 출력한다

#1 화면 출력기능 활성화

SET SERVEROUTPUT ON;

 

#2 

DECLARE
BEGIN
    -- END LOOP 문에서 제어권을 전달반고 NUM 변수는 1~5까지 반복
    FOR NUM IN 1..5 LOOP
        DBMS_OUTPUT.PUT_LINE(NUM);
    -- 제어권을 for..in문의 NUM 변수로 전달
    END LOOP;
END;

 

1
2
3
4
5


PL/SQL 프로시저가 성공적으로 완료되었습니다.

 

 

 

 

 

(3) while…loop…end loop 문

  • while…loop…end loop 문은 조건을 기본으로 반복 작업을 제공한다.
  • while…loop…end loop 문은 실행의 흐름이 end loop 문에 도달할 때마다 while…loop 문의 조건식으로 제어권을 전달하여 루프 한다.
  • while…loop…end loop 문은 조건식이 참인 동안만 문을 반복한다.
  • while…loop…end loop 문의 조건식은 반복이 시작될 때 확인하므로 조건이 거짓이면 루프를 빠져나가므로 루프 내의 문이 한 번도 수행되지 않을 경우도 있다.

while 조건식 loop
조건에 만족할 경우 실행되는 문 1;
조건에 만족할 경우 실행되는 문 2;

조건에 만족할 경우 실행되는 문 N;
end loop;

 

ex )  while…loop…end loop 문으로 1 부터 5 까지 출력한다.

#1 화면 출력기능 활성화

SET SERVEROUTPUT ON;

#2 

DECLARE
    NUM NUMBER := 1 ;
BEGIN
    -- END LOOP 문에서 제어권을 전달받고 NUM QUSTNSMS 5이하까지 반복
    WHILE( NUM <= 5 )LOOP
        DBMS_OUTPUT.PUT_LINE(NUM);
        -- NUM 변수에 1을 더하여 NUM 변수에 할당하여 누적
        NUM := NUM + 1 ;
    -- 제어권을 while..loop 문의 (NUM <= 5) 조건식에 전달
    END LOOP;
END;
1
2
3
4
5


PL/SQL 프로시저가 성공적으로 완료되었습니다.

 

 

 

 

반응형
댓글수0