-
[PL/SQL] 기초 문법IT, 프로그래밍/Database (Oracle) 2019. 1. 16. 09:18
반복문
LOOP, WHILE, FOR
1. LOOP
LOOP
처리문
EXIT [WHEN 조건];
END LOOP;
12345678910111213141516DECLAREvs_gugu_line number := 1;vs_gugu_col number :=1;BEGINLOOPDBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');vs_gugu_col := 1;LOOPDBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));vs_gugu_col := vs_gugu_col + 1;EXIT WHEN vs_gugu_col > 9;END LOOP;vs_gugu_line := vs_gugu_line +1;EXIT WHEN vs_gugu_line > 9;END LOOP;END;cs 이중 LOOP문을 사용하여 구구단을 출력하는 예제.
2. WHILE
WHILE 조건
LOOP
처리문;
END LOOP;
1234567891011121314151617DECLAREvs_gugu_line number := 1;vs_gugu_col number :=1;BEGINWHILE vs_gugu_line < 10LOOPDBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');vs_gugu_col := 1;WHILE vs_gugu_col < 10LOOPDBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));vs_gugu_col := vs_gugu_col + 1;END LOOP;vs_gugu_line := vs_gugu_line +1;END LOOP;END;cs WHILE문은 LOOP문의 EXIT WHEN 조건을 위로 올린 것과 같다.
단, WHILE문에 적어주는 조건은 반복 조건 ( ~~ 조건을 만족할 시에 반복하라),
LOOP문에 적어주는 조건은 탈출 조건 ( ~~조건을 만족할 시에 탈출하라) 이므로 유의하여야 한다.
3. FOR
FOR 인덱스 IN [REVERSE] 초깃값..최종값
LOOP
처리문;
END LOOP;
12345678910111213DECLAREBEGINFOR vs_gugu_line IN 1..9LOOPDBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');FOR vs_gugu_col IN 1..9LOOPDBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));END LOOP;END LOOP;END;cs 초기값과 최종값을 지정해준다.. LOOP나 WHILE보다 가독성도 좋고 편하게 사용할 수 있다.
PL/SQL 프로시저가 성공적으로 완료되었습니다.
1단 입니다.
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
........
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
REVERSE 옵션을 사용할 수 있는데 이걸 사용하면 최종값부터 초기값까지 하나씩 감소하면서 반복한다.
1234567891011121314DECLAREBEGINFOR vs_gugu_line IN REVERSE 1..9LOOPDBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');FOR vs_gugu_col IN REVERSE 1..9LOOPDBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));END LOOP;END LOOP;END;cs PL/SQL 프로시저가 성공적으로 완료되었습니다.
9단 입니다.
9 * 9 = 81
9 * 8 = 72
9 * 7 = 63
9 * 6 = 54
9 * 5 = 45
...
1 * 6 = 6
1 * 5 = 5
1 * 4 = 4
1 * 3 = 3
1 * 2 = 2
1 * 1 = 1
조건문
IF, CASE
1. IF THEN ~ ELSIF THEN ~ ELSE
12345678910DECLAREvs_a NUMBER := 1;vs_b NUMBER := 2;BEGINIF vs_a = vs_b THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 b와 같습니다');ELSIF vs_a = 3 THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 3입니다');ELSE SYS.DBMS_OUTPUT.PUT_LINE('a는 3이 아닙니다');END IF;END;cs a는 3이 아닙니다
2. CASE
12345678910DECLAREvs_a NUMBER := 1;vs_b NUMBER := 2;BEGINCASEWHEN vs_a = vs_b THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 b와 같습니다');WHEN vs_a = 3 THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 3입니다');ELSE SYS.DBMS_OUTPUT.PUT_LINE('a는 3이 아닙니다');END CASE;END;cs a는 3이 아닙니다
IF와 CASE는 매우 유사한 문법을 가지고 있다.
기타 문법
1. CONTINUE문
반복문 내에서 특정 조건에 걸릴 때 처리 로직을 건너 뛰고 상단의 루프 조건으로 건나가 루프를 계속 수행할 때 사용
(오라클 11g부터 지원)
1234567891011121314DECLAREBEGINFOR vs_gugu_line IN 1..9LOOPDBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');FOR vs_gugu_col IN 1..9LOOPCONTINUE WHEN vs_gugu_col > 3;DBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));END LOOP;END LOOP;END;cs 1단 입니다.
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
2단 입니다.
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
...
8단 입니다.
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
9단 입니다.
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
2. GOTO문
GOTO를 선언하고 라벨을 지정해 주면 그 라벨로 넘어간다 (jump 한다!)
1234567891011121314151617DECLAREvs_gugu_line number := 0;BEGINFOR i IN 1..9LOOPDBMS_OUTPUT.PUT_LINE( i || '단 입니다.');IF i = 2 THEN vs_gugu_line := i; GOTO printing; END IF;FOR j IN 1..9LOOPDBMS_OUTPUT.PUT_LINE(i || ' * ' || j || ' = ' || (i * j));END LOOP;END LOOP;<<printing>>DBMS_OUTPUT.PUT_LINE('GOTO로 이동한 라인은... ' || vs_gugu_line || ' 입니다...');END;cs 1단 입니다.
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9
2단 입니다.
GOTO로 이동한 라인은... 2 입니다...
GOTO문은 프로그램 수행의 일관성을 해칠 수 있어서, 나중에 유지보수가 매우 힘들어 질 수 있다. 그러므로 사용을 지양하자.
3. NULL문
12IF vs_a = vs_b THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 b와 같습니다');ELSE NULL;cs IF문이나 CASE문 작성시 아무것도 지정하지 않으려면 NULL을 선언.
'IT, 프로그래밍 > Database (Oracle)' 카테고리의 다른 글
[PL/SQL] 예외처리 (0) 2019.01.17 [PL/SQL] 함수와 프로시저 (4) 2019.01.16 [PL/SQL] PL/SQL 기초 (0) 2019.01.15 대량의 테스트 데이터를 생성하는 프로시져 (0) 2018.09.06 TNS:no appropriate service handler found 에러(ORA-12519) (0) 2018.09.06