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
'차근차근 > 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 |