공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
예제는 Oracle Database에서 기본으로 제공되는 SCOTT계정 데이터로 진행됩니다.
SQLDeveloper에서 PL/SQL 실행하기 보기 → DBMS 출력 → DBMS 출력 창의 + 버튼 누르기 → 접속할 DB 선택 후 확인
|
조건 제어문(조건문) - IF, CASE
1. IF 조건문
- IF-THEN : 특정 조건을 만족하는 경우 작업 수행
- IF-THEN-ELSE : 특정 조건을 만족하는 경우와 그렇지 않은 경우의 작업 수행
- IF-THEN-ELSIF : 위의 두 가지 이외의 여러 조건에 따라 각각 지정한 작업 수행
■ IF-THEN
IF [조건식] THEN -- true나 false판별이 가능한 조건식을 지정. 여러 연산자 및 함수 사용 가능
[조건식이 true일 때 수행할 명령어];
END IF; -- IF-THEN 종료
IF-THEN 은 주어진 조건식의 결과가 true 일 경우에는 작업을 수행하지만 조건식이 false 또는 NULL 일 경우에는 IF 문을 수행하지 않고 넘어간다.
■ IF-THEN-ELSE
IF [조건식] THEN -- true나 false판별이 가능한 조건식을 지정. 여러 연산자 및 함수 사용 가능
[조건식이 true일 때 수행할 명령어];
ELSE
[조건식이 false일 때 수행할 명령어];
END IF; -- IF-THEN-ELSE문 종료
조건식이 true 일 때의 작업만 지정할 수 있는 IF-THEN 과 달리
IF-THEN-ELSE 는 조건식이 true 인 경우와 false 인 경우 두 가지에 대한 작업을 지정할 수 있다.
■ IF-THEN-ELSIF
IF [조건식] THEN -- true나 false판별이 가능한 조건식을 지정. 여러 연산자 및 함수 사용 가능
[IF의 조건식이 true일 때 수행할 명령어];
ELSIF [조건식]
[IF의 조건식 false / ELSIF의 조건식이 true일 때 수행할 명령어];
ELSEIF [조건식]
[IF의 조건식 false/ 첫 번째 ELSIF의 조건식도 false / 두 번째 ELSEIF의 조건식이 true일 때 수행할 명령어];
...
ELSE
[위에 나온 조건식이 모두 false일 때 수행할 명령어];
END IF; -- IF-THEN-ELSIF문 종료
IF-THEN-ELSIF 문은 여러 종류의 조건식을 지정하여 각 조건을 만족하는 경우마다 다른 작업을 지정할 수 있다.
DECLARE
V_SCORE NUMBER := 87;
BEGIN
IF V_SCORE >= 90 THEN
DBMS_OUTPUT.PUT_LINE('A 학점');
ELSIF V_SCORE >= 80 THEN
DBMS_OUTPUT.PUT_LINE('B 학점');
ELSIF V_SCORE >= 70 THEN
DBMS_OUTPUT.PUT_LINE('C 학점');
ELSIF V_SCORE >= 60 THEN
DBMS_OUTPUT.PUT_LINE('D 학점');
ELSE
DBMS_OUTPUT.PUT_LINE('F 학점');
END IF;
END;
/
IF 문을 이용한 학점 출력 예시이다. 차례대로 조건식을 비교하여 true 가 되는 부분의 명령어를 실행하고 IF 문을 빠져나간다.
2. CASE 조건문
SQL문에 사용하는 CASE 문이 조건에 따라 특정 결과 값을 반환하는 것에 그치는데 반해 PL/SQL문의 CASE 문은 조건에 따라 수행할 작업을 지정할 수 있다는 차이가 있다. 또한 SQL문의 CASE 는 END 로 종료되며 PL/SQL문의 CASE 문은 END CASE 로 종료된다.
- 단순 CASE문 : 비교 기준이 되는 조건의 값이 여러 가지일 때 해당 값만 명시하여 작업 수행
- 검색 CASE문 : 특정한 비교 기준 없이 여러 조건식을 나열하여 조건식에 맞는 작업 수행
■ 단순 CASE문
CASE [비교 기준] -- 여러 가지 결과 값이 나올 수 있는 변수나 식을 명시
WHEN [값1] THEN
[비교기준이 값1일 때 수행할 명령어];
WHEN [값2] THEN
[비교기준이 값2 일 때 수행할 명령어];
...
ELSE
[비교기준이 모두 해당하지 않을 때 수행할 명령어];
END CASE; -- CASE문 종료
CASE 문도 IF 문과 마찬가지로 조건식의 결과 값에 따라 여러 가지 작업을 지정할 수 있다. 그중에서도 단순 CASE 문은 비교 기준(결과 값이 여러 가지로 나오는)이 되는 변수 또는 식을 명시하고 각 결과에 따라 수행할 작업을 지정할 수 있다. 조건식의 결과 값이 여러 가지 일 때 IF 문에 비해 간결하게 표현할 수 있다는 장점이 있다. (한번 조건식이 true 가 되어 해당 부분의 명령어가 실행되면 그 후에 true 가 되는 조건식이 있어도 CASE 문을 빠져나간다. 또한 C나 Java같은 언어와 다르게 break 문이 없어도 해당하는 부분만 실행하고 CASE 문을 빠져나간다.)
DECLARE
V_SCORE NUMBER := 87;
BEGIN
CASE TRUNC(V_SCORE/10)
WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('A 학점');
WHEN 9 THEN DBMS_OUTPUT.PUT_LINE('A 학점');
WHEN 8 THEN DBMS_OUTPUT.PUT_LINE('B 학점');
WHEN 7 THEN DBMS_OUTPUT.PUT_LINE('C 학점');
WHEN 6 THEN DBMS_OUTPUT.PUT_LINE('D 학점');
ELSE DBMS_OUTPUT.PUT_LINE('F 학점');
END CASE;
END;
/
IF 문에서 나왔던 학점 출력 예시를 단순 CASE 문으로 바꾸면 위와 같이 된다. (실행 결과는 같다)
■ 검색 CASE문
CASE
WHEN [조건식 1] THEN
[조건식 1이 true일 때 수행할 명령어];
WHEN [조건식 2] THEN
[조건식 2가 true일 때 수행할 명령어];
...
ELSE
[조건문이 모두 false일 때 수행할 명령어];
END CASE; -- CASE문 종료
검색 CASE 문은 단순 CASE 문과 달리 비교 기준이 없고 WHEN 옆에 조건식이 들어가는 것이 다르다. 조건 식이 true 가 되는 경우가 있으면 해당 영역의 명령어를 수행하고 CASE 문을 빠져나온다. (단순 CASE 문과 마찬가지로 한번 조건식이 true 가 되어 해당 부분의 명령어가 실행되면 그 후에 true 가 되는 조건식이 있어도 CASE 문을 빠져나간다. 또한 C나 Java같은 언어와 다르게 break 문이 없어도 해당하는 부분만 실행하고 CASE문을 빠져나간다.)
DECLARE
V_SCORE NUMBER := 87;
BEGIN
CASE
WHEN V_SCORE >= 90 THEN DBMS_OUTPUT.PUT_LINE('A 학점');
WHEN V_SCORE >= 80 THEN DBMS_OUTPUT.PUT_LINE('B 학점');
WHEN V_SCORE >= 70 THEN DBMS_OUTPUT.PUT_LINE('C 학점');
WHEN V_SCORE >= 60 THEN DBMS_OUTPUT.PUT_LINE('D 학점');
ELSE DBMS_OUTPUT.PUT_LINE('F 학점');
END CASE;
END;
/
단순 CASE 문에 나왔던 학점 출력 예시를 검색 CASE 문으로 바꾸면 위와 같다. (실행 결과는 같다.)
반복 제어문(반복문) - LOOP, WHILE, FOR
- 기본 LOOP : 기본 반복문
- WHILE LOOP : 특정 조건식의 결과를 통해 반복 수행
- FOR LOOP : 반복 횟수를 정하여 반복 수행
- Cusor FOR LOOP : 커서를 활용한 반복 수행
반복문과 관련된 명령어
- EXIT : 수행 중인 반복 종료
- EXIT-WHEN : 조건식을 만족하면 반복 종료
- CONTINUE : 수행 중인 반복의 현재 주기를 건너뜀
- CONTINUE-WHEN : 조건식을 만족하면 수행 중인 반복의 현재 주기를 건너뜀
■ 기본 LOOP
LOOP
[반복 수행 작업];
END LOOP;
기본 LOOP 문은 반복을 위한 별다른 조건 없이 반복할 작업 내용을 지정해 준다. 반복의 종료 시점이나 조건식을 따로 명시하지 않으므로 지정한 작업을 무한히 반복 수행하게 되며, 이러한 현상을 무한 루프(Infinite Loop)라고 한다. 그러나 무한하게 반복 작업을 해야 하는 경우는 많지 않으므로 대부분의 기본 LOOP 문은 반복을 종료하기 위해 EXIT 명령어를 같이 사용한다.
DECLARE
V_NUM NUMBER := 0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('현재 V_NUM : ' || V_NUM);
V_NUM := V_NUM + 1; -- V_NUM을 1씩 증가시킴
EXIT WHEN V_NUM > 4; -- V_NUM이 4보다 클 경우 LOOP문 종료
/* IF문과 EXIT을 사용해도 된다.
IF V_NUM > 4 THEN
EXIT;
END IF;
*/
END LOOP;
END;
/
기본 LOOP 문에 EXIT-WHEN 을 써서 조건식을 만족하면 LOOP 문을 빠져나오게 한 예시이다.
출력은 되지 않지만 V_NUM 이 5 가 되었을 때 EXIT-WHEN 의 조건식을 만족해서 LOOP 문이 종료된다.
■ WHILE LOOP
WHILE [조건식] LOOP
[반복 수행 작업];
END LOOP;
WHILE LOOP 문은 반복 수행 여부를 결정하는 조건식을 먼저 지정한다. 조건식의 결과 값이 true 일 동안 반복하다가 조건식의 결과 값이 false 가 되면 반복을 끝낸다. WHILE LOOP 문은 반복 수행이 시작되기 전에 조건식을 검사하므로 조건식의 결과 값에 따라 단 한 번도 반복되지 않을 수도 있다.
DECLARE
V_NUM NUMBER := 0;
BEGIN
WHILE V_NUM < 4 LOOP
DBMS_OUTPUT.PUT_LINE('현재 V_NUM : ' || V_NUM);
V_NUM := V_NUM + 1;
END LOOP;
END;
/
조건인 V_NUM 이 4 보다 작을 동안( 0 ~ 3 ) 반복문이 실행되는 것을 확인할 수 있다.
■ FOR LOOP
FOR i IN [시작 값]..[종료 값] LOOP -- 카운터인 i가 시작값부터 종료 값이 될 때까지 반복
[반복 수행 작업];
END LOOP;
반복 횟수가 정해져 있을 때 FOR LOOP 문을 사용한다. 지정한 시작 값부터 1 씩 증가하여 종료 값이 될 때까지 작업을 반복한다. i 는 반복문 안에서 현재 숫자(시작 값과 종료 값 사이)가 저장되는 특수한 변수로 카운터(counter)라고 한다. 카운터는 선언부에 정의하지 않고 FOR LOOP 문에서 바로 정의하여 사용하고, FOR LOOP 문 안에서만 사용 가능하다. 또한 값을 임의로 할당할 수 없고 현재 저장되어 있는 값을 참조만 할 수 있다.
BEGIN
FOR i IN 0..4 LOOP
DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
END LOOP;
END;
/
시작 값인 0 부터 4 까지 5 번 반복하고, 반복이 진행됨에 따라 카운터인 i 값이 증가하는 것을 확인할 수 있다.
+ 역순 반복
FOR i IN REVERSE [시작 값]..[종료 값] LOOP
[반복 수행 작업];
END LOOP;
FOR LOOP 문에 REVERSE 키워드를 사용하면 값을 역순으로 반복할 수 있다.
시작 값과 종료 값의 위치는 변하지 않으므로 주의한다.
■ Cursor FOR LOOP (IN 연산자)
BEGIN
FOR i IN (SELECT * FROM DEPT) LOOP
DBMS_OUTPUT.PUT_LINE(i.deptno || ' : ' || i.dname);
END LOOP;
END;
/
FOR 문에 IN연산자를 사용하고 뒤에 테이블이 오면 그 테이블의 행 수만큼 반복문이 실행된다. (커서를 활용한 것인데 i 는 루프 인덱스(loop index)로 커서에 저장된 각 행이 저장되는 변수를 뜻한다 위의 i.deptno 처럼 . 을 통해 행의 각 필드에 접근할 수 있다. 커서와 FOR LOOP 문을 사용하면 OPEN , FETCH , CLOSE 문을 작성하지 않아도 되고 루프 인덱스에 커서 각 행을 저장하므로 결과 행을 저장하는 변수 선언도 필요하지 않다.(자세한 내용은 커서와 예외처리 게시글 참조))
CONTINUE문, CONTINUE-WHEN문
CONTINUE 문과 CONTINUE-WHEN 문은 오라클 11g 버전부터 사용할 수 있다. 반복 수행 중 CONTINUE 가 실행되면 현재 반복 주기에 수행해야 할 남은 작업을 건너뛰고 다음 반복 주기로 바로 넘어가는 효과가 있다. CONTINUE-WHEN 문도 CONTINUE 문과 같은 기능이지만 특정 조건식을 만족할 때 다음 반복 주기로 넘어간다.
BEGIN
FOR i IN 0..4 LOOP
CONTINUE WHEN MOD(i, 2) = 1; -- i를 2로 나눈 값이 1(홀수)이면 반복문의 현재 주기를 건너 뜀
DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
END LOOP;
END;
/
CONTINUE-WHEN 문을 사용해서 짝수만 출력하는 예시이다.
i 가 홀수( 2 로 나눈 나머지가 1 )인 경우 반복문의 현재 주기를 건너뛰기 때문에 PUT_LINE 이 실행되지 않는다.
순차 제어문(sequential control)
- GOTO문 : 지정한 라벨로 넘어감 (잘 사용하지 않음)
- NULL문 : 아무것도 실행하지 않음
보통 IF 문이나 CASE 문에서 사용하며 ELSE 절을 아무것도 실행되지 않도록 처리할 때 많이 사용한다.
'Back end > Database' 카테고리의 다른 글
[Oracle] PL/SQL - 커서(cursor)와 예외 처리 (0) | 2019.10.21 |
---|---|
[Oracle] 복합 자료형 (레코드, 컬렉션) (0) | 2019.10.19 |
[Oracle] PL/SQL (0) | 2019.10.16 |
[Oracle] 사용자, 권한, 롤 관리 (0) | 2019.10.12 |
[Oracle] 제약조건(constraint) (0) | 2019.10.08 |