차근차근/Oracle

오라클 반복문(3) - LOOP , WHILE , FOR,CONTINUE

예쁜꽃이피었으면 2021. 12. 10. 13:37

 

PL/SQL(Oracle's Procedural Language extension to SQL) 반복문(3)

 

1) LOOP문

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

-- -------------------------------------예제
DECLARE
NUM1 NUMBER :=1;

BEGIN
    LOOP
    DBMS_OUTPUT.PUT_LINE(NUM1); --출력
    NUM1 := NUM1+1; --NUM = NUM +1
    EXIT WHEN NUM1 >10; --NUM1이 10보다 크면 LOOP종료
    END LOOP;

END;

반복문은 특정조건까지만 반복하며 로직을 수행하는데 LOOP의 반복문은 EXIT[WHEN 조건];이라는 구절에서 실행됩니다. 따라서 EXIT를 누락하면 해당 LOOP는 무한루프에 빠지게 되니 조심해야 한다.

 

 

 

- EXIT문 이 사용되었을 경우, 무조건 LOOP문을 빠져나간다.

- EXIT WHEN 조건이 사용될 경우 WHEN절에서 LOOP를 빠져나가는 조건을 제어할 수 있다.


2) WHILE문

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

-- -----------------예제
DECLARE
NUM1 NUMBER :=1;

BEGIN
    WHILE(NUM1<10) --NUM이 10보다 작을때까지 LOOP실행
    LOOP
    DBMS_OUTPUT.PUT_LINE(NUM1); --출력
    NUM1 := NUM1+1; --NUM = NUM +1
    END LOOP;

END;

조건문이 WHILE 뒤에 붙는다.WHILE문에서도 LOOP처럼 EXIT를 써서 루프를 빠져나가는 방법도 사용할 수 있다.

 

 

 

 


3) FOR문

-- --------------------------------------사용법
FOR 증감변수 IN 초기값..최종값
LOOP
처리문;
END LOOP;
-- --------------------------------------예제
BEGIN
    FOR I IN 1..9
    LOOP
    DBMS_OUTPUT.PUT_LINE('안녕하세요'); --출력
    END LOOP;

END;

FOR문은 인덱스값을DECLARE에서 선언하지 않아도 되므로 반복문 중에서 가장 간결하게 사용할 수 있다. 인덱스 값은 초기값에서 시작해서 최종값까지 1씩 증가하게 되며 인덱스는 참조는 가능하지만 변경을 할 수는 없다. 

FOR문에 REVERSE를 명시해주면 FOR문이 거꾸로 시작한다.

(예. FOR i IN REVERSE 1..9)

 

- index는 자동 선언되는 binary_integer형 변수이고, 1씩 증가한다.

- REVERSE옵션이 사용될 경우 index는 upper_bound에서 lower_bound로 1씩 감소한다.

- IN다음에는 coursor나 select문이 올 수 있다.

 

내가 궁금했던 것은 프로시져 내에 코드가..
for 변수 in 1,2,3,4
loop
    어쩌고
end loop;
이런 식으로 가능할 것인지가 궁금했다. for문이 시작값 , 종료값이 없이
1,2,3,4, 혹은 가,나,다,라 이게 되는지..
오늘 알게된 건데..
" 명시적 커서 FOR LOOP "로 검색하다 보면 나온다.
https://logical-code.tistory.com/54 

결론은 된다. 

CONTINUE

: Oracle 11g부터 추가된 기능으로 이하 버전에서는 다른 방법을 써야 한다.

 

1) 11g이상 일 때

DECLARE  
   x NUMBER := 0;  
BEGIN  
  
    LOOP -- After CONTINUE statement, control resumes here  
         DBMS_OUTPUT.PUT_LINE ('Inside loop: x = ' || TO_CHAR(x));  
           
         x := x + 1;  
         IF x < 3 THEN  
           CONTINUE;  
         END IF;  
         /*   
         또는  
         CONTINUE WHEN x < 3;  
         */  
           
         DBMS_OUTPUT.PUT_LINE ('Inside loop, after CONTINUE: x = ' || TO_CHAR(x));  
             
         EXIT WHEN x = 5;  
    END LOOP;  
  
    DBMS_OUTPUT.PUT_LINE (' After loop: x = ' || TO_CHAR(x));  
      
END;  
/  


출처: https://rocabilly.tistory.com/260 [프로그램이 좋다]

2) 10g이하 일 때

DECLARE  
   x NUMBER := 0;  
BEGIN  
  
    LOOP -- After CONTINUE statement, control resumes here  
        <<CONTINUE_POS>>  
          
         DBMS_OUTPUT.PUT_LINE ('Inside loop: x = ' || TO_CHAR(x));  
           
         x := x + 1;  
         IF x < 3 THEN  
           GOTO CONTINUE_POS;  
         END IF;  
           
         DBMS_OUTPUT.PUT_LINE ('Inside loop, after CONTINUE: x = ' || TO_CHAR(x));  
             
         EXIT WHEN x = 5;  
    END LOOP;  
  
    DBMS_OUTPUT.PUT_LINE (' After loop: x = ' || TO_CHAR(x));  
      
END;  
/


출처: https://rocabilly.tistory.com/260 [프로그램이 좋다]

 

 


[참조]

https://coding-factory.tistory.com/452

https://goddaehee.tistory.com/102

https://e-una.tistory.com/15

https://rocabilly.tistory.com/260

반응형

'차근차근 > Oracle' 카테고리의 다른 글

DBMS_OUTPUT.PUT_LINE  (0) 2021.12.13
오라클 DUAL테이블 (가상테이블)  (0) 2021.12.10
Oracle procedure  (0) 2021.12.09
ora 12518 tns 리스너는 클라이언트 연결을 처리할 수 없습니다  (0) 2017.04.25
설치  (0) 2015.11.19