DB/Oracle

Oracle DB10_ PL/SQL 조건문,반복문,데이터타입

Codezoy 2019. 9. 30. 09:00

Goals
  • PL/SQL의 데이터 타입
  • 행/열 참조 변수 타입 선언
  • 조건문 : IF, CASE ~ WHEN 구문
  • 반복문 : LOOP, FOR, WHILE, EXIT, CONTINUE
  • PL/SQL 시작시, dbms_random.value()


Notes

  • PL/SQL의 데이터 타입
1) Scalar(스칼라)      타입 : number, varchar2, date ...    하나의 데이터 타입만 저장함
2) Reference(참조)   타입 : 특정 테이블의 행(Row)이나 열(Column)을 참조하는 타입
3) Compound(복합) 타입 : collection(Column 데이터의 모음), record(Row 데이터의 모음)         여러 종류의 데이터 타입을 저장함


컬럼 참조 타입 변수 선언 : 변수이름 테이블이름 컬럼이름 %type := 값.
행 참조 타입 변수 선언     : 변수이름 테이블이름'%rowtype" = 값

EX) 
declare
    -- dept 테이블의 각 칼럼의 값들을 저장할 수 있는 변수 선언.
    v_deptno     dept.deptno%type := 10;
    v_dname      dept.dname%type;
    v_loc        dept.loc%type;
    
begin
    select dname, loc   into v_dname, v_loc
    from dept           where deptno=v_deptno;
    
    dbms_output.put_line(v_deptno || ' : ' || v_dname || ' : ' || v_loc);
end;

                                                                                                                                           
declare
    -- emp 테이블의 행row 의 모든 정보를 저장할 수 있는 변수를 선언
    v_emp7788    emp%rowtype;
       
begin
    select *        into v_emp7788
    from emp        where empno = 7788;
    dbms_output.put_line(v_emp7788.ename);
    dbms_output.put_line(v_emp7788.sal);
    end;
/



  • IF 조건문(Conditional Statement)
(I)조건식이 1개일 경우

IF 조건식 THEN 
     조건식이 참일 때 실행할 문장;

END IF;

(II) 조건식이 2개일 경우
IF 조건식 THEN
조건식이 참일 때 실행할 문장;
ELSE
조건식이 거짓일 때 실행할 문장;
END IF;
(III) 조건이 n개일 경우
IF 조건식1 THEN
조건식1이 참일 때 실행할 문장;
ELSIF 조건식2 THEN
조건식2가 참일 때 실행할 문장;
...
ELSE
조건식이 모두 거짓일 때 실행할 문장;
END IF;


EX)
accept p_num prompt '숫자 입력 : ';
declare
    v_num number := &p_num ;
begin
    if      mod(v_num, 3) = 0    then
            dbms_output.put_line('나머지 0');
    elsif   mod(v_num, 3) = 1    then
            dbms_output.put_line('나머지 1');
            
    else    dbms_output.put_line('나머지 2');
            
    end if;
    
    dbms_output.put_line('End PL/SQL');
end;






  • CASE ~ WHEN 구문 - 2가지 방법이 있음. 
(1)(=)같다 만 조건문으로 활용할 수 있다.
CASE  비교대상
WHEN 값1 THEN
비교대상 = 값 1을 만족할 때 실행할 문장;
WHEN 값2 THEN
비교대상 = 값 1을 만족할 때 실행할 문장;
....
ELSE 비교대상이 위의 모든 값과 일치하지 않을 때 실행할 문장

END CASE;


(2)
CASE
WHEN 조건식1 THEN
조건식1이 참일 때 실행할 문장;
WHEN 조건식2 THEN
조건식2가 참일 때 실행할 문장;
...
ELSE 위의 모든 조건이 거짓일 때 실행할 문장;

END CASE;






(1) LOOP
LOOP

반복할 문장;
EXIT WHEN 조건식;
END LOOP

EX)
DECLARE
    v_num  number:= 1;
BEGIN
    loop
        dbms_output.put_line('v_num='||v_num);
        v_num   :=  v_num+1;
        exit when (v_num=10);    
    end loop;
END;



(2) WHILE LOOP
WHILE 조건식 LOOP

조건이 참일 때 반복할 문장;
END LOOP;                                                                           FALSE가 되면 종료한다

EX)
DECLARE
    v_num number    := 1;
    
BEGIN
    while v_num<6 loop  
        dbms_output.put_line('v_num = '||v_num);
        v_num   :=  v_num+1;
    end loop;

END;





(3) FOR LOOP
FOR 변수 IN REVERSE 시작값 .. 마지막값 LOOP
반복할 문장;
END LOOP;
-- FOR-LOOP에서 사용하는 변수는 DECLARE 구분에서 선언하지 않음!
-- FOR-LOOP에서 사용하는 변수는 LOOP가 반복할 때마다 자동으로 1씩 증가한다.

EX)
begin
    for i in 1..9 loop
        DBMS_OUTPUT.PUT_LINE ('3 x '|| i || ' = ' || 3*i);
    end loop;
end;

FOR LOOP 변수를 감소시키면서 반복하기 - REVERSE

FOR 변수 IN REVERSE 시작값 .. 마지막값 LOOP
반복할 문장;
END LOOP;





(4) LOOP, WHILE, FOR 안에서
EXIT WHEN 조건식 : 조건식을 맍고하는 경우에 반복문을 종료.


EX)                                      -- 4에서 끝남
declare
    v_num number := 1;

begin
    while v_num <10 loop
        dbms_output.put_line('v_num = '|| v_num);
        v_num := v_num +1;
        exit when v_num = 5;
    end loop;
end;

(5) FOR에서 EXIT 사용하기
EX)                                              --5에서 끝남
BEGIN
    FOR i in 1..10 loop
        dbms_output.put_line('i = '|| i);
        exit when i = 5;
    end loop;
end;




  • CONTINUE WHEN : 조건식을 만족하는 경우 반복문의 시작부분으로 돌아감.
--> 조건을 만족하면 반복문의 다음번을 시작하라.
EX)
BEGIN
    FOR I IN 1..10 LOOP
        continue when mod(i,2)=0;
        dbms_output.put_line(i);
    end loop;
end;

결과 : 1, 3, 5, 7, 9


BEGIN
    for i in 0..4 loop
        dbms_output.put_line(2*i+1);
    end loop;
END;                                                              -- 이렇게 하면 코드 이해가 더 쉽다.