본문 바로가기
DB/sql

오라클 SQL(PL/SQL 제어문)

by 혀끄니 2023. 10. 23.
728x90

PL/SQL제어문

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;
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 employees
     WHERE department_id = vn_department_id
       AND ROWNUM = 1;
       
    DBMS_OUTPUT.PUT_LINE(vn_salary);
    
    IF vn_salary BETWEEN 1 AND 3000 THEN
       DBMS_OUTPUT.PUT_LINE('낮음');
    ELSIF vn_salary BETWEEN 3001 AND 6000 THEN
       DBMS_OUTPUT.PUT_LINE('중간');
    ELSIF vn_salary BETWEEN 6001 AND 10000 THEN
       DBMS_OUTPUT.PUT_LINE('높음');
    ELSE
       DBMS_OUTPUT.PUT_LINE('최상위');
       
    END IF;
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 employees
   WHERE department_id = vn_department_id
     AND ROWNUM = 1;

  DBMS_OUTPUT.PUT_LINE(vn_salary);
  
  CASE WHEN vn_salary BETWEEN 1 AND 3000 THEN
           DBMS_OUTPUT.PUT_LINE('낮음');
       WHEN vn_salary BETWEEN 3001 AND 6000 THEN
           DBMS_OUTPUT.PUT_LINE('중간');
       WHEN vn_salary BETWEEN 6001 AND 10000 THEN
           DBMS_OUTPUT.PUT_LINE('높음');
       ELSE
           DBMS_OUTPUT.PUT_LINE('최상위');
  END CASE;
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;
   EXIT WHEN vn_cnt > 9;
 END LOOP;
END;

WHILE문

DECLARE
  vn_base_num NUMBER :=3;
  vn_cnt NUMBER :=1;
BEGIN
    WHILE vn_cnt <=9
    LOOP 
      DBMS_OUTPUT.PUT_LINE (vn_base_num || '*'||vn_cnt||'='
                            || vn_base_num*vn_cnt);
      vn_cnt := vn_cnt+1;
    END LOOP;
END;
DECLARE
  vn_base_num NUMBER :=3;
  vn_cnt NUMBER :=1;
BEGIN
    WHILE 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;
    END LOOP;
END;

FOR문

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

FOR문 REVERS

-FOR문을 반대로 실행

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

-CONTINUE문

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

GOTO문

-라벨을 사용해서 원하는 위치로 GOTO함

-잘사용하지 않음

DECLARE
  vn_base_num NUMBER :=3;
BEGIN
  <<third>>
  FOR i IN 1..9
  LOOP
    DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num * i);
    IF i=3 THEN
        GOTO fourth;
    END IF;
  END LOOP;
  
  <<fourth>>
  vn_base_num :=4;
  FOR i IN 1..9
  LOOP
    DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num * i);
  END LOOP;
END;

NULL문

-ELSE절을 수행할때 아무것도 처리하지 않고 싶은 경우 NULL문을 사용한다.

-ELSE NULL;

728x90

'DB > sql' 카테고리의 다른 글

[Oracle] 파티션(Partition)  (0) 2025.12.23
이기적SQLD(데이터 모델링)1-1  (0) 2023.10.24
오라클 SQL(PL/SQL1)  (0) 2023.10.20
오라클 SQL(계층형 쿼리)  (0) 2023.10.19
오라클 SQL(서브쿼리1)  (0) 2023.10.18