min's devlog

프로시저(Procedure)와 반복문 본문

til/Oracle

프로시저(Procedure)와 반복문

값진 2022. 5. 19. 09:43

프로시저?(Procedure)

  - 메소드, 함수 등.. 순서가 있는 명령어의 집합

  - PL/SQL 명령어는 반드시 프로시저 내에서만 작성이 가능하고, 동작한다.

 

프로시저의 반복문

PL/SQL 에서도 다른언어와 같이 반복문을 지원한다. 프로시저의 반복문으로는 loop, for loop, while loop를 사용한다.

1. loop
       - 단순 반복
2. for loop
       - 횟수 반복(자바 for)
       - loop 기반     
3. while loop
       - 조건 반복(자바 while)
       - loop 기반

 

 

loop문

-- 사용법
LOOP
처리문;
EXIT[조건];
END LOOP;

-- 데이터 1000건을 추가하는 예제
declare
    vnum number := 1;
begin
    loop
        insert into tblLoop values (seqLoop.nextVal, '데이터' || vnum);
        vnum := vnum + 1;
        exit when vnum > 1000;
    end loop;
end;

반복문은 특정 조건까지만 반복하며 로직을 수행하는데, LOOP의 반복문은 EXIT[WHEN 조건]; 구절에서 실행된다. 따라서 EXIT를 빠트리면 무한루프에 빠지게 된다!

 

 

for loop문

FOR 증감변수 IN 초기값..최종값
LOOP
처리문;
END LOOP;

--예제
begin
    for dan in 2..9 loop
        for num in 1..9 loop
            insert into tblGugudan (dan, num, result)
                            values (dan, num, dan * num);
        end loop;
    end loop; 
end;

 

for loop문은 인덱스 값을 declare에서 선언하지 않아도 되므로 간결한 편이다. 인덱스 값은 초기값부터 최종값까지 1씩 증가하게 되고 인덱스는 참조가 가능하지만 변경을 불가능하다.

 

 

while문

--사용법
WHILE 조건
LOOP
처리문;
END LOOP;

--예제
declare
    vnum number := 1;
begin   
    while vnum <= 10 loop   
        dbms_output.put_line(vnum);
        vnum := vnum + 1;  
    end loop;

while문은 loop문과 비슷하지만 조건이 while 다음 위치한다는 점이 다르다. loop문과 같이 exit로 루프를 빠져나갈 수 있다.

 

 

조인 / 서브쿼리 / 프로시저 비교

-- 1. 조인
select v.name from tblMem m
    inner join tblRent r
        on m.seq = r.member
            inner join tblVideo v
                on v.seq = r.video
                    where m.name = '강아지';

-- 2. 서브쿼리
select name from tblVideo
    where seq = (select video from tblRent
                    where member = (select seq from tblMem where name = '강아지'));                   

-- 3. 프로시저
declare
    mseq tblMember.seq%type;
    vseq tblRent.video%type;
    vname tblVideo.name%type;
begin    
    select seq into mseq from tblMem where name = '강아지';   
    select video into vseq from tblRent where member = mseq;    
    select name into vname from tblVideo where seq = vseq;    
    dbms_output.put_line(vname);    
end;

 

'til > Oracle' 카테고리의 다른 글

ANSI-SQL/프로시저/트리거  (0) 2022.05.23
PL/SQL (2)  (0) 2022.05.20
ANSI SQL  (0) 2022.05.18
[Education center] 데이터 생성  (0) 2022.05.17
인덱스(index)  (0) 2022.05.11
Comments