251105 TIL

2025. 11. 5. 18:46Courses/아이티윌 오라클 DBA 과정

문제

-- [문제1] 숫자값을 입력받고 입력값이 양수인지, 음수인지, 0인지를 출력하는 프로그램을 작성하세요
DECLARE
    num number := :b_num;        
BEGIN
    IF num > 0 THEN
        dbms_output.put_line('양수');
    ELSIF num < 0 THEN
        dbms_output.put_line('음수');
    ELSE
        dbms_output.put_line('0');
    END IF;
END;
/

-- 중첩 IF문
DECLARE
    num number := :b_num;        
BEGIN
    IF num > 0 THEN
        dbms_output.put_line('양수');
    ELSE
        IF num < 0 THEN
            dbms_output.put_line('음수');
        ELSE
            dbms_output.put_line('0');
        END IF;
    END IF;
END;
/

-- CASE 표현식
DECLARE
    num number := :b_num;        
    result varchar2(10);
BEGIN
    result := CASE 
                    WHEN num > 0 THEN '양수'
                    WHEN num < 0 THEN '음수'
                    ELSE '0'
                END;
    dbms_output.put_line(result);                
END;
/

조건 제어문(Cont.)

CASE 문

  • 조건을 평가하여 명령문 수행
DECLARE
    num number := :b_num;        

BEGIN
    CASE 
        WHEN num > 0 THEN
            dbms_output.put_line('양수');
        WHEN num < 0 THEN
            dbms_output.put_line('음수');
        ELSE
            dbms_output.put_line('0');
    END CASE;
END;
/

반복문

  • 명령문을 여러 번 반복하는 루프 구조 제공

LOOP 문(기본 루프)

  • 조건이 없이 반복적인 작업을 수행
  • 무한 반복
  • EXIT문 : 반복문을 종료하는 문
LOOP
    반복 수행할 로직
END LOOP;
  • 무한 루프 발생 시 오류 발생
DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        dbms_output.put_line(v_cnt);
        v_cnt := v_cnt + 1;
    END LOOP;
END;
/

-- ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes
  • 1 ~ 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;
    dbms_output.put_line('종료');
END;
/
-- [문제2] 1~10까지 출력하는 프로그램을 작성해주세요. 단 4, 8번은 출력하지 마세요.
DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        IF v_cnt = 10 THEN
            EXIT;
        END IF;

        IF v_cnt != 4 AND v_cnt != 8 THEN
            dbms_output.put_line(v_cnt);    
        END IF;

        v_cnt := v_cnt + 1;
    END LOOP;
END;
/

EXIT WHEN

  • 조건절이 TRUE이면 반복문 종료
DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        IF v_cnt = 4 OR v_cnt = 8 THEN
            NULL;
        ELSE
            dbms_output.put_line(v_cnt);    
        END IF;

        v_cnt := v_cnt + 1;

        EXIT WHEN v_cnt > 10;
    END LOOP;
END;

CONTINUE

  • 루프의 현재 반복을 종료하고 다음 루프(반복)로 이동
DECLARE
    v_cnt number := 1;
BEGIN
    LOOP
        IF v_cnt = 4 OR v_cnt = 8 THEN
            v_cnt := v_cnt + 1;
            CONTINUE;
        ELSE
            dbms_output.put_line(v_cnt);    
        END IF;

        v_cnt := v_cnt + 1;

        EXIT WHEN v_cnt > 10;
    END LOOP;
END;
/

CONTINUE WHEN

  • 조건절이 TRUE이면 반복을 종료하고 다음 루프(반복)로 이동
DECLARE
    v_cnt number := 0;
BEGIN
    LOOP
        v_cnt := v_cnt + 1;
        CONTINUE WHEN v_cnt = 4 OR v_cnt = 8;
        dbms_output.put_line(v_cnt);
        EXIT WHEN v_cnt = 10;
    END LOOP;
END;
/

문제

-- [문제3] 1~10까지 홀수만 출력하는 프로그램이 작성해주세요.
DECLARE
    v_num number := 1;
BEGIN
    LOOP
        EXIT WHEN v_num = 10;

        IF mod(v_num, 2) = 1 THEN
            dbms_output.put_line(v_num);
        END IF;

        v_num := v_num + 1;
    END LOOP;
END;
/

DECLARE
    v_num number := 0;
BEGIN
    LOOP
        EXIT WHEN v_num = 10;
        v_num := v_num + 1;
        CONTINUE WHEN mod(v_num, 2) = 0;
        dbms_output.put_line(v_num);
    END LOOP;
END;
/
-- [문제4] 2단을 출력해주세요.
DECLARE
    v_dan number := 2;
    v_num number := 1;
BEGIN
    LOOP
        dbms_output.put_line(v_dan || ' * ' || v_num || ' = ' || v_dan * v_num);
        v_num := v_num + 1;
        EXIT WHEN v_num = 10;
    END LOOP;
END;
/
-- [문제5] 구구단을 출력해주세요.(2단 ~ 9단)
DECLARE
    v_dan number := 2;
    v_num number;
BEGIN
    LOOP
        v_num := 1;
        LOOP
            dbms_output.put_line(v_dan || ' * ' || v_num || ' = ' || v_dan * v_num);
            v_num := v_num + 1;
            EXIT WHEN v_num = 10;
        END LOOP;
        dbms_output.put_line('');
        v_dan := v_dan + 1;
        EXIT WHEN v_dan = 10;
    END LOOP;
END;
-- [문제6] 1 ~ 5를 가로 방향으로 출력하세요.
DECLARE
    v_num number := 1;
    v_result varchar2(10);
BEGIN
    LOOP
        v_result := v_result || ' ' || v_num;
        EXIT WHEN v_num = 5;
        v_num := v_num + 1;
    END LOOP;
    dbms_output.put_line(v_result);
END;
/

-- dbms_output.put() + dbms_output.new_line()
DECLARE
    v_num number := 1;
BEGIN
    LOOP
        dbms_output.put(v_num);
        EXIT WHEN v_num = 5;
        v_num := v_num + 1;
    END LOOP;
    dbms_output.new_line();
END;
/
-- [문제7] 구구단을 아래 화면과 같이 출력해주세요.
DECLARE
    v_dan number;
    v_num number := 1;
BEGIN
    LOOP
        v_dan := 2;
        LOOP
            dbms_output.put(v_dan || ' * ' || v_num || ' = ' || rpad(v_dan * v_num, 5));
            EXIT WHEN v_dan = 9;
            v_dan := v_dan + 1;
        END LOOP;
        dbms_output.new_line();
        EXIT WHEN v_num = 9;
        v_num := v_num + 1;
    END LOOP;
END;
/

WHILE LOOP 문

  • 조건이 TRUE인 동안 반복 작업을 수행하는 반복문
WHILE 조건식 LOOP
    반복 수행할 로직
END LOOP;
  • 1 ~ 10 출력
DECLARE
    i number := 1;
BEGIN
    WHILE i <= 10 LOOP
        dbms_output.put_line(i);
        i := i + 1;
    END LOOP;
END;
/

-- 거꾸로
DECLARE
    i number := 10;
BEGIN
    WHILE i > 0 LOOP
        dbms_output.put_line(i);
        i := i - 1;
    END LOOP;
END;
/

문제

-- [문제8] WHILE LOOP 문을 이용해서 구구단을 출력해주세요.(2~9단)
DECLARE
    v_dan number := 2;
    v_num number;
BEGIN
    WHILE v_dan < 10 LOOP
        v_num := 1;

        WHILE v_num < 10 LOOP
            dbms_output.put_line(v_dan || ' * ' || v_num || ' = ' || v_dan * v_num);
            v_num := v_num + 1;
        END LOOP;

        v_dan := v_dan + 1;
    END LOOP;
END;
/

-- 가로로 출력
DECLARE
    v_dan number;
    v_num number := 1;
BEGIN
    WHILE v_num < 10 LOOP
        v_dan := 2;

        WHILE v_dan < 10 LOOP
            dbms_output.put(v_dan || ' * ' || v_num || ' = ' || rpad(v_dan * v_num, 5));
            v_dan := v_dan + 1;
        END LOOP;

        dbms_output.new_line();
        v_num := v_num + 1;
    END LOOP;
END;
/

FOR LOOP 문

  • 반복 횟수를 알고 있을 때 사용하는 루프문
  • 카운터 변수는 암시적으로 선언되므로 선언하지 않음
  • 카운터 변수는 FOR LOOP문 안에서만 사용 가능
  • FOR LOOP 에서 시작값, 끝값은 NULL 사용 불가
  • 카운터 변수를 다른 값으로 할당 불가
FOR 카운터변수 IN 시작값..끝값 LOOP
    반복수행할 로직
END LOOP;
  • 1 ~ 10 출력
BEGIN
    FOR i IN 1..10 LOOP
        dbms_output.put_line(i);
    END LOOP;
END;
/

-- 거꾸로
BEGIN
    FOR i IN REVERSE 1..10 LOOP
        dbms_output.put_line(i);
    END LOOP;
END;
/

문제

-- [문제9] FOR LOOP문을 이용해서 구구단을 출력해주세요.(2~9단)
BEGIN
    FOR dan IN 2..9 LOOP
        FOR i IN 1..9 LOOP
            dbms_output.put_line(dan || ' * ' || i || ' = ' || dan * i);
        END LOOP;
    END LOOP;
END;
/

-- 가로로 출력
BEGIN
    FOR i IN 1..9 LOOP
        FOR dan IN 2..9 LOOP
            dbms_output.put(dan || ' * ' || i || ' = ' || rpad(dan * i, 5));
        END LOOP;
        dbms_output.new_line();
    END LOOP;
END;
/

'Courses > 아이티윌 오라클 DBA 과정' 카테고리의 다른 글

251106 TIL  (0) 2025.11.06
251104 TIL  (0) 2025.11.04
251103 TIL  (0) 2025.11.03
251031 TIL  (1) 2025.10.31
251030 TIL  (0) 2025.10.30