본문 바로가기
DataBase/Oracle

PL/SQL) 제어문, case 분기문, 반복문 (난수 생성)

by 박채니 2022. 5. 2.

 안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


제어문

- if문을 통한 분기 처리 가능

 

문법

if 조건식 then
	true 처리구문
else
	false 처리구문
end if;



if 조건식1 then
	처리구문1
elsif 조건식2 then
	처리구문2
elsif 조건식3 then
	처리구문3
[else
	기본처리구문]
end if;

 

응용) 사용자 입력 수에 대한 짝홀 처리

declare
    num number := &정수;
begin
    if mod(num, 2) = 0 then
        dbms_output.put_line(num || '은 짝수입니다.');
    else
        dbms_output.put_line(num || '은 홀수입니다.');
    end if;
end;
/

 

응용) 사용자 입력 정수에 대한 양수/음수/0 판단하기

declare
    num number := &정수;
begin
    if num > 0 then
        dbms_output.put_line(num || '은 양수입니다.');
    elsif num = 0 then
        dbms_output.put_line(num || '입니다.');
    else
        dbms_output.put_line(num || '은 음수입니다.');
    end if;
end;
/

 

응용) 사번을 입력 받고, 해당 사원의 급여와 평균급여 비교결과를 조회

declare
    v_salary employee.salary%type;
    avg_sal employee.salary%type;
begin
    -- 내 급여 조회
    select salary
    into v_salary
    from employee
    where emp_id = '&사번';
    
    -- 평균 급여 계산
    select avg(salary)
    into avg_sal
    from employee;
    
    -- 비교
    if v_salary > avg_sal then
        dbms_output.put_line('평균보다 급여를 많이 받습니다.');
    elsif v_salary = avg_sal then
        dbms_output.put_line('당신은 평균급여를 받고 있습니다.');
    else
        dbms_output.put_line('평군보다 급여를 적게 받습니다.');
    end if;
exception
    when no_data_found then dbms_output.put_line('찾으시는 사원이 존재하지 않습니다.');
end;
/

 


case 분기문

유형 1)
case 표현식
	when 값1 then 처리구문1;
    when 값2 then 처리구문2;
    ...
    [else 기본처리구문]
end case;


유형 2)
case
	when 조건식1 then 처리구문1;
    when 조건식2 then 처리구문2;
    ...
    [else 기본처리구문]
end case;

 

응용) 가위바위보

accept 가위바위보 prompt '가위1 바위2 보3 중에 하나를 입력하세요'
declare
    num number := &가위바위보;
begin
    case num
        when 1 then dbms_output.put_line('가위');
        when 2 then dbms_output.put_line('바위');
        when 3 then dbms_output.put_line('보');
    end case;
end;
/

 

응용) 컴퓨터와 가위바위보

accept 가위바위보 prompt '가위1 바위2 보3 중에 하나를 입력하세요'
declare
    com number := trunc(dbms_random.value(1, 4)); -- 1.0 이상 ~ 4.0 미만의 실수 반환 (랜덤)
    num number := &가위바위보;
begin
    dbms_output.put_line('컴퓨터 : ' || com);
    dbms_output.put_line('나 : ' || num);
    
    case
        when com = num then
            dbms_output.put_line('비겼습니다.');
        when (num = 1 and com = 3) or (num = 2 and com = 1) or (num = 3 and com = 2) then
            dbms_output.put_line('당신이 이겼습니다');
        else
            dbms_output.put_line('당신이 졌습니다.');
    end case;
end;
/

dbms_random.value()를 이용하여 난수 생성 가위바위보 게임을 구현하였습니다.

dbms_random.value()는 실수를 반환하므로 trunc를 이용하여 소수점을 잘라내었습니다.

 


반복문

 

☞ loop 반복문

1 ~ 5 출력

declare
    num number := 1;
begin
    -- 무한반복
    -- ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes 탈출조건 명시!!
    loop
        dbms_output.put_line(num);
        num := num + 1;
    end loop;
end;
/

loop 반복문은 탈출 조건이 없으면 무한 반복 되므로 반드시 탈출조건을 명시 해줘야 합니다.

 

declare
    num number := 1;
begin
    -- 무한반복
    -- ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes 탈출조건 명시!!
    loop
        dbms_output.put_line(num);
        num := num + 1;
        
        exit when num > 5;  -- 탈출 구문 필수!!
    end loop;
end;
/

exit when을 통해 탈출 구문을 필수로 작성해줘야 합니다.

 

☞ while loop 반복문

1 ~ 5 출력

declare
    num number := 1;
begin
    while num <= 5 loop
        dbms_output.put_line(num);
        num := num + 1;
    end loop;
end;
/

while 조건식이 있으므로, 별도의 탈출 구문을 작성해주지 않아도 됩니다.

 

☞ for in loop 반복문

- 증감 변수를 미리 선언할 필요 없음

- 증가값은 1로 고정 (reverse로 -1 처리는 가능)

- 증감변수에 대해 시작값..종료값을 설정해서 반복 후 자동 탈출

 

1 ~ 5 출력

declare
begin
    for num in 1..5 loop
        dbms_output.put_line(num);
    end loop;
end;
/

 

5 ~ 1 출력

declare
begin
--    for num in 1..5 loop
--        dbms_output.put_line(num);
--    end loop;

    for num in reverse 1..5 loop
        dbms_output.put_line(num);
    end loop;
end;
/

 

1 ~ 5 출력

개행 없이 쭉 나열하기

declare
begin
--    for num in 1..5 loop
--        dbms_output.put_line(num);
--    end loop;

--    for num in reverse 1..5 loop
--        dbms_output.put_line(num);
--    end loop;

    for num in 100..105 loop
        dbms_output.put(num || ' ');
    end loop;
    dbms_output.new_line;   -- 개행
end;
/

 

사용자 입력을 받아서 2~9단 하나를 출력

declare
    dan number := &단수;
begin
    -- 유효성 검사
    if dan not between 2 and 9 then
        dbms_output.put_line('잘못 입력하셨습니다. 2~9까지의 숫자를 입력하세요.');
        return;
    end if;
    
    dbms_output.put_line('===== ' || dan || '단 =====');
    for num in 1..9 loop
        dbms_output.put_line(dan || ' X ' || num || ' = ' || dan*num);
    end loop;
end;
/

3 입력

 

모든 구구단 조회

begin
    for dan in 2..9 loop
        dbms_output.put_line('===== ' || dan || '단 =====');
        for num in 1..9 loop
            dbms_output.put_line(dan || ' * ' || num || ' = ' || dan*num);
        end loop;
        dbms_output.new_line;
    end loop;
end;
/

@출력값
===== 2단 =====
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18

...
...

===== 9단 =====
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

 

응용) 사원 조회

반복문을 통해서 1명씩 조회

declare
    erow employee%rowtype;
begin
    for num in 200..223 loop
        select *
        into erow
        from employee
        where emp_id = num;
        
        dbms_output.put_line(erow.emp_id || '   ' || erow.emp_name || '   ' || erow.phone);
    end loop;
end;
/