ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PLSQL] if, case, loop
    DataBase/PLSQL 2022. 9. 9. 16:59

    if문

    1. 경우의 수가 둘 중 하나이고 단독 IF로 사용할 때

     if 조건 then
          실행문1
     end if

    2. 경우의 수가 둘 중 하나이고 else와 함께 사용할 때

     if 조건 then
          실행문1
     else
          실행문2
     end if

    3. 경우의 수가 셋 이상일 때

     if 조건 then
          실행문1
     elsif 조건2 then --오타아님주의 elsif
          실행문2
     else
          실행문3
     end if
     
     

    연습하기

    DECLARE
        vn_num1 NUMBER := 1;
        vn_num2 NUMBER := 2;
    BEGIN
        IF vn_num1 >= vn_num2 THEN
            DBMS_OUTPUT.PUT_LINE(vn_num1 || '이(가) 큰 수');
        ELSE 
            DBMS_OUTPUT.PUT_LINE(vn_num2 || '이(가) 큰 수');
        END IF;
    END;
    -- emp 테이블에서 사원 한명을 선별하여, 
    -- 그 월급의 금액에 따라 낮음, 중간, 높음 이라는 단어를 출력하는
    -- 익명 블럭을 제작. (1~1000 낮음 1001~2500 보통 2501~ 높음)
    -- 사원을 선별하는 방법은 RANDOM.VALUE 함수를 이용함
    -- 랜덤한 부서번호로 조회하되 
    -- 그 부서에 사원이 여럿이면 첫번째 사원으로 선택
    
    DECLARE
        v_sal NUMBER := 0; -- 선택된 사원의 급여를 저장할 변수
        v_deptno NUMBER := 0; -- 랜덤하게 발생한 부서번호를 저장할 변수
    BEGIN
        -- 랜덤하게 부서번호를 발생
    -- DBMS_RANDOM.VALUE(시작숫자, 끝숫자): 시작숫자부터 끝숫자 사이의 임의 숫자를 발생함.
    -- ROUND(숫자, 반올림자리수): 숫자를 지정된 반올림자리에서 반올림함.
    -- 반올림자리수 1이면 소수점둘재자리에서 반올림해서 첫째자리까지 남김.
    -- 반올림자리수 -1이면 1의 자리에서 반올림.
        v_deptno := ROUND( DBMS_RANDOM.VALUE(10,40), -1);
        -- DBMS_OUTPUT.PUT_LINE(v_deptno);
        select sal
        into v_sal
        from emp
        where deptno=v_deptno and rownum=1;
        DBMS_OUTPUT.PUT_LINE(v_deptno);
        DBMS_OUTPUT.PUT_LINE(v_sal);
        IF v_sal BETWEEN 1 AND 1000 THEN
            DBMS_OUTPUT.PUT_LINE('낮음');
        ELSIF v_sal >= 1001 AND v_sal <= 2500 THEN
            DBMS_OUTPUT.PUT_LINE('보통');
        ELSIF v_sal > 2500 THEN
            DBMS_OUTPUT.PUT_LINE('높음');
        END IF;
    END;

    case

    DECLARE
        v_sal NUMBER := 0; 
        v_deptno NUMBER := 0;
    BEGIN
        v_deptno := ROUND( DBMS_RANDOM.VALUE(10,40), -1);
        select sal into v_sal from emp where deptno=v_deptno and rownum=1;
        DBMS_OUTPUT.PUT_LINE(v_deptno);
        DBMS_OUTPUT.PUT_LINE(v_sal);
        CASE WHEN v_sal BETWEEN 1 AND 1000 THEN
            DBMS_OUTPUT.PUT_LINE('낮음');
        WHEN v_sal >= 1001 AND v_sal <= 2500 THEN
            DBMS_OUTPUT.PUT_LINE('보통');
        WHEN v_sal > 2500 THEN
            DBMS_OUTPUT.PUT_LINE('높음');
        END CASE;
    END;

    CASE 유형 1.

     CASE WHEN 조건식1 THEN
              실행문1
          WHEN 조건식2 THEN
              실행문2
          ... 
          ELSE
              실행문3
     END CASE;

    CASE 유형 2.

    -표현식의 결과 값 또는 변수의 값들의 경우의 수로 분기함

    CASE 조건식 또는 표현식 또는 변수
     CASE WHEN 값1 THEN
              실행문1
          WHEN 값2 THEN
              실행문2
          ... 
          ELSE
              실행문3
     END CASE;

    loop

    LOOP
          실행문;
          EXIT(WHEN조건);
    END LOOP;

     

    DECLARE
        vn_base_num NUMBER:=7; -- 7단
        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; -- 반복제어 변수 1 증가
            EXIT WHEN vn_cnt>9; -- 반복제어 변수가 9를 초과하면 반복실행 멈춤
        END LOOP;
    END;

     

    1. while

    WHILE 조건
     LOOP
          실행문
    END LOOP;

     

    DECLARE
        vn_base_num NUMBER:=6; 
        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;

    -- WHILE과 EXIT WHEN의 혼합사용
    DECLARE
        vn_base_num NUMBER:=9; 
        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);
            EXIT WHEN vn_cnt=5;
            vn_cnt:=vn_cnt+1; -- vn_cnt 값을 1씩 증가
        END LOOP;
    END;

    2. for

    -시작값부터 끝까지 반복실행함

    FOR 변수명 IN (REVERSE) 시작값...끝값
    LOOP
          실행문
    END LOOP;

     

    DECLARE
        vn_base_num NUMBER:=0; 
    BEGIN
        FOR i IN 1..9
        LOOP
            DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*1);
        END LOOP;
    END;

     

    3. reverse

    -반대방향의 숫자진행으로 반복실행

    -- REVERSE을 사용한 경우
    DECLARE
        vn_base_num NUMBER:=8; 
    BEGIN
        FOR i IN REVERSE 1..9
        LOOP
            DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*1);
        END LOOP;
    END;

     

    4. continue

    -조건이 충족하면 반복실행 영역 중 나머지 명령을 실행하지 않고 다음 반복으로 진행

    DECLARE
        vn_base_num NUMBER:=9; 
    BEGIN
        FOR i IN 1..9
        LOOP
            CONTINUE WHEN i=5;
            DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*1);
        END LOOP;
    END;

     

    5. GOTO문

    DECLARE
        vn_base_num NUMBER:=5; 
    BEGIN
        <<fifth>> -- 라벨이라고 부름. GOTO문의 이동 목적지로 사용되곤 함
        FOR i IN 1..9
        LOOP
            DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*i);
            IF i =3 THEN
                GOTO sixth;
            END IF;
        END LOOP;
        <<sixth>>
        vn_base_num :=6;
        FOR i IN 1..9
        LOOP
            DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*i);
        END LOOP;
    END;

     

    6. null

    -if문 또는 case when 등에서 해당 경우에 실행해야할 명령이 하나도 없을때 쓰는 구문

    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 IF;
    ​
     

     

    'DataBase > PLSQL' 카테고리의 다른 글

    [PLSQL] cursor  (0) 2022.09.09
    [PLSQL] procedure  (1) 2022.09.09
    [PLSQL] function  (0) 2022.09.09
    [PLSQL] block, 출력, 변수, 자료형, SQL  (0) 2022.09.09
    [PLSQL] Procedural Language for SQL 설치  (0) 2022.09.09

    댓글

Designed by Tistory.