Data Base/PL SQL

231025 PL/SQL 조건제어문

잇꼬 2023. 10. 25. 18:21
728x90
반응형
SMALL

■ 조건제어문 
1. PL/SQL 에서 조건에 따라 선별적으로 작업을 수행할 수 있다.
2. TRUE/FALSE 
3. BOOLEAN DATE TYPE ( TRUE, FALSE, NULL )

# 참일 때

DECLARE
    v_flag boolean := true;
BEGIN
    IF v_flag THEN
        dbms_output.put_line('참');
    END IF;
END;
/


# 거짓일 때

DECLARE
    v_flag boolean := false;
BEGIN
    IF v_flag THEN
        dbms_output.put_line('참');
    END IF;
END;
/



# IF문

DECLARE
    v_flag boolean := false;
BEGIN
    IF v_flag THEN
        dbms_output.put_line('참');
    ELSE
        dbms_output.put_line('거짓');
    END IF;
END;
/

BEGIN
    IF true THEN
        dbms_output.put_line('참');
    ELSE
        dbms_output.put_line('거짓');
    END IF;
END;
/


# 형식 IF 문

IF 조건 THEN
TRUE
END IF;
IF 조건 THEN
TRUE
ELSE
FASLE
END IF;
IF 조건 THEN
TRUE
ELSE 조건 THEN 
TRUE
ELSE 조건 THEN 
TRUE
...
ELSE 
기본값
END IF;

 

비교연산자  논리연산자  기타 비교연산자  NULL 연산자 
=, >, >=, <, <=, <>, !=, ^= NOT, AND, OR BETWEEN AND, IN, LIKE IS NULL, IS NOT NULL


# IF문 

DECLARE
    v_a number;
BEGIN
    IF v_a IS NULL THEN
        dbms_output.put_line('변수에 NULL값으로 입력되어 있습니다.');
    ELSE 
        dbms_output.put_line(v_a);
    END IF;
END;
/

# IF-ELSIF문

DECLARE
    v_num1 number(2) := 10;
    v_num2 number(2) := 5;
BEGIN
    IF v_num1 >= v_num2 THEN
        dbms_output.put_line(v_num1 - v_num2);
    ELSIF v_num1 < v_num2 THEN
        dbms_output.put_line(v_num2 - v_num1);
    END IF;
END;
/

[문제] 
v_sal := 10000 
v_comm := null;
((v_sal * 12) + (v_sal * 12 * v_comm)) 

방법1)

DECLARE
    v_sal number(8) := 1000;
    v_comm number(2,1);
    v_annual_salary number(8);
BEGIN
    IF v_comm IS NULL THEN
        v_annual_salary := v_sal *12;
        dbms_output.put_line(v_annual_salary);
    ELSE
        v_annual_salary := (v_sal *12) + (v_sal *12*v_comm);
        dbms_output.put_line(v_annual_salary);
    END IF;
END;
/


 
방법2)

DECLARE
    v_sal number(8) := 1000;
    v_comm number(2,1);
    v_annual_salary number(8);
BEGIN
    v_annual_salary := (v_sal *12) + (v_sal *12*nvl(v_comm,0));
    dbms_output.put_line(v_annual_salary);
END;
/



# CASE 표현식 ⓐ

DECLARE
    v_grade char(1) := upper('a');
    v_appraisal varchar2(30);
BEGIN
    v_appraisal := CASE v_grade 
                        WHEN 'A' THEN '참 잘했어요'
                        WHEN 'B' THEN '잘했어요'
                        WHEN 'C' THEN '다음에 잘해요'
                        ElSE '니가 사람이야!' 
                   END;
    dbms_output.put_line('등급은 '||v_grade||' 평가는 '||v_appraisal);
END;
/



# CASE 표현식 ⓑ

DECLARE
    v_grade char(1) := upper('d');
    v_appraisal varchar2(30);
BEGIN
    v_appraisal := CASE 
                        WHEN v_grade = 'A' THEN '참 잘했어요'
                        WHEN v_grade IN ('B', 'C') THEN '잘했어요'
                        WHEN v_grade = 'D' THEN '다음에 잘해요'
                        ElSE '니가 사람이야!' 
                   END;
    dbms_output.put_line('등급은 '||v_grade||' 평가는 '||v_appraisal);
END;
/


■ 반복문
1. LOOP 문
    - 조건없이 반복적인 작업 수행, 무한반복문
    - exit : 반복문 종료하는 문

# 10까지 출력 ⓐ  IF문 위치에 따라 비교연산자가 달라져야 한다.

DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        dbms_output.put_line(v_cnt);
        v_cnt := v_cnt + 1;
        IF v_cnt = 11 THEN 
            exit;
        END IF;
    END LOOP;
END;
/


# 10까지 출력 ⓑ

DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        dbms_output.put_line(v_cnt);
        IF v_cnt = 10 THEN 
            exit;
        END IF;
        v_cnt := v_cnt + 1;
    END LOOP;
END;
/


# 10까지 출력 ⓒ

DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        IF v_cnt = 11 THEN 
            exit;
        END IF;        
        dbms_output.put_line(v_cnt);
        v_cnt := v_cnt + 1;
    END LOOP;
END;
/

[문제] 화면에 1~10까지 출력하는 프로그램을 작성해주세요. 단, 4,8 은 출력하지 마세요. 

DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        IF v_cnt NOT IN (4,8) THEN
            dbms_output.put_line(v_cnt);        
        END IF;
        v_cnt := v_cnt + 1;
        IF v_cnt = 11 THEN
            EXIT;
        END IF;
    END LOOP;
END;
/

내가 작성한 방법은 NOT IN 방법이다. 

 

방법1)  첫 번째 IF문에서 부정비교연산자를 사용해 and 로 연결. 

DECLARE
	i number := 1; 
BEGIN
	LOOP
    	IF i <> 4 and i <> 8 THEN
        	dbms_output.put_line(i);        	
        END IF;
        i := i + 1;
        IF i > 10 THEN
        	EXIT;
        END IF;
    END LOOP; 
END;
/

방법2) = 비교연산자를 사용해서 or 로 연결. 단, 결과값을 null 로 출력.

DECLARE
	i number := 1;
BEGIN
	LOOP
    	IF i = 4 or i = 8 THEN
        	null;
        ELSE
        	dbms_output.put_line(i);
        END IF;
        i := i + 1;
        IF i > 10 THEN
        	EXIT;
        END IF;
    END LOOP;
END;
/

 

방법3) 마지막에 exit 구문을 짧게 하고 싶다 하면 EXIT WHEN 으로 작성. 

DECLARE
	i number := 1;
BEGIN
	LOOP
    	IF i = 4 or i =8 THEN 
        	null;
        ELSE
        	dbms_output.put_line(i);
        END IF;
        i := i + 1;
        EXIT WHEN i > 10;
    END LOOP;
END;
/

 

문제를 보면 작성하는 순서를 생각할 수 있다! 

 ' 화면에 1~10까지 출력하는 프로그램을 작성해주세요. 단, 4,8 은 출력하지 마세요.  '

1. 기본 구문 작성
(기본 중의 기본)
DECLARE  먼저 작성하고 시작하자!
BEGIN
END;
/
2. 변수 선언
(문제에서 숫자를 출력하라는 문제이니,
TYPEnumber 로 지정. ) 
DECLARE
     i number := 1; 화면에 1~10까지 출력하는 프로그램
BEGIN
END;
/
3. 반복문 작성 
(LOOP 문
화면에 1~10까지 출력해야 하는 것은 일일이 작성할 수 없으니 1부터 10까지 반복해야 한다. )
DECLARE
   i number := 1;
BEGIN
   LOOP
   END LOOP;  화면에 1~10까지 출력하는 프로그램
                         LOOP - END LOOP; 짝꿍처럼 쓰자!

END;
/
4. 출력문 
출력되어야 하는 변수를 써줘야 SQL에서 출력해준다.
DECLARE
   i number := 1;
BEGIN
   LOOP
      dbms_output.put_line(i); 내가 출력해야 하는 것을 작성하자!
   END LOOP;  
END;
/
5. 조건문과 증가하는 구문
(1~10까지 출력해야 하니,
IF문과 1씩 증가하는 구문을 작성해줘야 한다!)
DECLARE
   i number := 1;
BEGIN
   LOOP
      dbms_output.put_line(i);
      i : = i + 1; 1씩 증가시켜줘야 한다. 
      IF i > 10 THEN 1부터는 시작했고, 10까지 진행되게 구문을 만들어주자!
      END IF:

   END LOOP;  
END;
/
6. 반복문의 제어
( exit 작성 )
DECLARE
   i number := 1;
BEGIN
   LOOP
      dbms_output.put_line(i);
      i : = i + 1;
      IF i > 10 THEN 
          exit;  11이 되면 출력이 멈추게 해주는 구문이다.
      END IF:
   END LOOP;  
END;
/
7. 문제에 있는 ' 단, 4,8 은 출력하지 마세요. ' 을 만들어보자!  DECLARE
   i number := 1;
BEGIN
   LOOP
      IF i <> 4 and i <> 8 THEN  출력의 제한을 줘야 하니, 부정연산자를 써줘야 한다.
          dbms_output.put_line(i);
       END IF;

      i : = i + 1;
      IF i > 10 THEN 

        exit; 
      END IF:
   END LOOP;  
END;
/
728x90
반응형
LIST