-PL/SQL 언어의 제어문 종류
유형 | 설명 | 종류 |
조건 분기문 | 주어진 조건에 따라 서로 다른 문장을 실행할 수 있도록 하는 제어문 | IF문, CASE문 |
무조건 분기문 | 조건 없이 프로그램의 다음 실행 위치를 변경하는 제어문 | GOTO문 |
순환문 | 주어진 조건을 만족하는 동안 특정 범위의 문장들을 반복적으로 실행할 수 있도록 하는 제어문 | 기본 LOOP문, WHITE LOOP문, FOR LOOP문, EXIT문, CONTINUE문 |
조건 분기문
조건 분기문에는 IF문과 CASE문이 있다.
IF문
IF문은 주어진 조건에 따라 서로 다른 문장을 실행할 수 있도록 하는 제어문.
DECLARE
v_cnt NUMBER;
v_type STRING(10);
BEGIN
-- 테이블 emp가 생성되어 있는지 확인.
-- 딕셔너리 뷰 user_tables에는 계정에 생성된 모든 테이블 목록이 들어 있다.
SELECT COUNT(*)
INTO v_cnt
FROM USER_TABLES
WHERE TABLE_NAME = 'EMP';
IF v_cnt > 0 THEN -- 테이블이 USER_TABLES에 들록되어 있으면 0보다 크다.
DBMS_OUTPUT_PUT_LINE('테이블 EMP이 존재합니다.');
ELSE
DBMS_OUTPUT_PUT_LINE('테이블 EMP이 존재하지 않습니다.');
END IF;
END;
단순 IF문
ELSE가 존재하지 않는 IF문. 가장 단순한 IF문으로 주어진 조건은 하나다.
IF v_cnt > 0 THEN
v_msg := '테이블 emp이 존재합니다.';
DBMS_OUTPUT_PUT_LINE(v_msg);
END IF;
ELSE가 존재하는 IF문
ELSE가 존재하는 IF문에서 주어지는 조건은 하나이다. 이 주어진 조건이 TRUE면 THEN과 ELSE사이의 문장들이 실행되고, TRUE가 아니면 ELSE와 END IF 사이의 문장들이 실행된다.
IF v_cnt > 0 THEN -- 테이블이 USER_TABLES에 들록되어 있으면 0보다 크다.
DBMS_OUTPUT_PUT_LINE('테이블 EMP이 존재합니다.');
ELSE
DBMS_OUTPUT_PUT_LINE('테이블 EMP이 존재하지 않습니다.');
END IF;
ELSIF가 존재하는 IF문
ELSIF가 존재하는 IF문에서는 여러 개의 존건이 순서대로 평가되며, 조건이 참인 경우 뒤따르는 THEN 뒤의 문장들이 실행된다. 제일 마지막에 ELSE이 따라오면, 앞에 오는 IF와 ELSIF의 모든 조건이 TRUE가 아닌 경우에 ELSE와 END IF 사이의 문장들이 실행된다. ELSE가 없는 경우 모든 조건이 TRUE가 아니라면 실행되는 문장이 없다.
IF v_cnt > 0 THEN -- 테이블이 USER_TABLES에 등록되어 있으면 0보다 크다
DBMS_OUTPUT_PUT_LINE('테이블 EMP이 존재합니다.');
ELSIF v_cnt 0 THEN -- COUNT가 0이면 테이블이 존재하지 않는 경우다
DBMS_OUTPUT_PUT_LINE('테이블 EMP가 존재하지 않습니다.');
ELSIF v_cnt < 0 THEN -- COUNT가 음수일 수 없다.
DBMS_OUTPUT_PUT_LINE('COUNT(*)가 음수입니다.');
ELSE
DBMS_OUTPUT_PUT_LINE('COUNT(*)가 NULL입니다.');
END IF;
CASE문
CASE문은 앞에 CASE 표현식에서 다룬 표현식과 유사한 구조를 가진다. 하지만 CASE표현식이 그야말로 표현식이기 때문에 결과적으로 하나의 결과값으로 계산되는 반면, CASE문은 선택자로 주어진 값이나 조건식에 따라서 서로 다른 문장을 수행할 수 있도록 한다.
단순 CASE문
단순 CASE 표현식과 마찬가지로 선택자에 대한 선택값에 따라서 서로 다른 문장을 수행할 수 있도록 한다,
기본구조는 단순 CASE 표현식과 동일하고 두 가지 차이만 있다.
첫째. 결과값 대신에 문장이 사용된다는 것이고, 둘째. CASE문의 끝이 단순 CASE 표현식은 'END'인 반면 단순 CASE문은 'END CASE'라는 것이다.
DECLARE
v_BOOL BOOLEAN := TRUE;
v_STR STRING(100);
BEGIN
-- 단순 CASE문
CASE v_BOOL WHEN TRUE THEN
v_STR := 'v_BOOL is TRUE';
WHEN FALSE THEN
v_STR := 'v_BOOL is FALSE';
ELSE
v_STR := 'v_BOOL is NULL';
END CASE;
DBMS_OUTPUT_PUT_LINE(v_STR);
END;
조사 CASE문
조사 CASE 표현식과 마찬가지로 조건식을 나열하고, 조건식이 TRUE인 경우 지정된 문장을 실행하는 문장.
DECLARE
v_BOOL BOOLEAN := TRUE;
v_STR STRING(100);
BEGIN
-- 조사 CASE문
CASE WHEN v_BOOL = TRUE THEN
v_STR := 'v_BOOL is TRUE';
WHEN v_BOOL = FALSE THEN
v_STR := 'v_BOOL is FALSE';
ELSE
v_STR := 'v_BOOL is NULL';
END CASE;
DBMS_OUTPUT_PUT_LINE(v_STR);
END;
CASE 표현식과 마찬가지로 두 유형 모두에서 여러 개의 WHEN이 연속적으로 사용되는 경우에는 나타나는 순서에 의해 순차적으로 검사된다. 두 개 이상의 선택값이 선택자와 일치하거나 두 개 이상의 조건식이 참인 경우라면 그중에서 순서상 먼저 나타나는 WHEN이 적용된다.
CASE문 사용시 주의 사항
CASE표현식에서는 발생하지 않는 예외인데 이 예외는 WHEN문만을 사용하고 ELSE문을 사용하지 않는 경우, 조건을 만족하는 CASE가 발견되지 않으면 발생하는 예외이다.
무조건 분기문 - GOTO문
GOTO문은 논리적인 판단없이 프로그램의 특정 위치를 다음에 실행할 위치로 변경하는 문장이다.
GOTO문을 사용하려면 레이블을 같이 사용해야 한다.
GOTO문은 IF문이나 순환문을 사용하여 동일하게 동작하도록 재작성할 수 있고, EXIT문을 사용해도 된다.
GOTO는 현재 위치와 동일한 깊이에 선언된 레이블이나 더 바깥에 선언된 레이블을 지정할 수 있다.
그러나 현재 레벨보다 더 깊은 곳에 위치한 레이블을 지정할 수는 없다. 또한 GOTO가 다른 서브프로그램(FUNCTION이나 PROCEDURE) 내부에 선언된 레이블을 지정하는 것 역시 오류다.
'DATABASE > SQL, PL-SQL' 카테고리의 다른 글
컬렉션(Collection) - 1 (0) | 2021.02.03 |
---|---|
제어문 - 2 (0) | 2021.02.02 |
CLOB (0) | 2021.01.27 |
트랜잭션(Transaction) 제어 (0) | 2021.01.27 |
SQL - MERGE, DELETE문의 사용 (0) | 2021.01.25 |
댓글