1. PL/SQL - 제어문
1) IF문
:조건이 TRUE이면 해당 조건 처리 문장이 실행된다.
--조건이 1개일 경우
IF 조건 THEN
조건처리
END IF;
--조건이 2개일 경우
IF 조건 THEN
조건 처리 1;
ELSE
조건 처리 2;
END IF;
--조건이 n개일 경우
IF 조건1 THEN
조건 처리1;
ELSIF 조건2 THEN
조건 처리 2;
...
ELSE
조건 처리 n;
END IF;
2) CASE 문
--유형 1
CASE 표현식
WHEN 결과1 THEN
처리문1 ;
WHEN 결과2 THEN
처리문 2;
...
ELSE
기타 처리문;
END CASE ;
--유형 2
CASE WHEN 표현식 1 THEN
처리문1 ;
WHEN 표현식 2 THEN
처리문 2;
...
ELSE
기타 처리문;
END CASE ;
예시]
DECLARE
vn_salary NUMBER := 0;
vn_department_id NUMBER :=0;
BEGIN
vn_department_id := ROUND(DBMS_RANDOM.VALUE (10,120), -1);
SELECT SALARY
INTO vn_salary
FROM EMPLOYEE
WHERE DEPARTMENT_ID = vn_department_id
AND ROWNUM = 1;
DBMS_OUTPUT.PUT_LIN(vn_salary);
CASE WHENE vn_salary BETWEEN 1 AND 3000 THEN
DBMS_OUTPUT.PUT_LIN('낮음');
CASE WHENE vn_salary BETWEEN 3001 AND 6000 THEN
DBMS_OUTPUT.PUT_LIN('중간');
CASE WHENE vn_salary BETWEEN 6001 AND 10000 THEN
DBMS_OUTPUT.PUT_LIN('높음');
ELSE
DBMS_OUTPUT.PUT_LIN('최상위');
END CASE;
END;
---------결과---------
12008
최상위
3) LOOP 문
: 반복해서 로직을 처리하는 반복문
-LOOP문은 특정 조건이란 것이 없음. EXIT를 통해서 루프를 종료한다. (EXIT를 누락하면 무한루프 )
LOOP
처리문 ;
EXIT [WHEN 조건];
END LOOP;
---------예시--------
DECLARE
vn_base_num NUMBER := 3;
vn_cnt NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
vn_cnt := vn_cnt+1; --루프를 돌면서 vn_cnt 1증가
EXIT WHEN vn_cnt > 9 ; -- vn_cnt가 9보다 크면 루프 종료하기
END LOOP;
END;
=> 구구단 3단이 출력됨
3*1 =3 ...
4) WHILE 문
WHILE 조건
LOOP
처리문;
END LOOP;
---------예시--------
DECLARE
vn_base_num NUMBER := 3;
vn_cnt NUMBER := 1;
BEGIN
WHILE vn_cnt >= 9 ; --vn_cnt가 9보다 작거나 같을 때만 반복 처리
LOOP
DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
vn_cnt := vn_cnt + 1 ; --루프를 돌면서 vn_cnt 1증가
END LOOP;
END;
5) FOR문
FOR 인덱스 IN [REVERSE]초깃값..최종값
LOOP
처리문;
END LOOP;
---------구구단 3단 예시--------
DECLARE
vn_base_num NUMBER := 3;
BEGIN
FOR i IN 1..9
LOOP
DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
END LOOP;
END;
-----------------------------
---------REVERSE 예시--------
DECLARE
vn_base_num NUMBER := 3;
BEGIN
FOR i IN REVERSE 1..9
LOOP
DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
END LOOP;
END;
--------------------------
3*9=27
3*8=24
...
6) CONTINUE문
-반복문 내에서 특정 조건에 부합할 때 처리 로직을 건너뛰고 상단의 루프 조건으로 건너가 루프를 계속 수행할 때 사용함.
-EXIT는 루프를 완전히 빠져나오지만, CONTINUE는 제어 범위가 조건절로 넘어간다.
-오라클 11g 부터 지원함.
----------구구단 3단에서 5를 제외하고 처리하는 SQL-------------
DECLARE
vn_base_num NUMBER := 3;
BEGIN
FOR i IN 1..9
LOOP
CONTINUE WHEN i = 5;
DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
END LOOP;
END;
7)GOTO문
-PL/SQL 코드 상에서 GOTO문을 만나면 GOTO문이 지정하는 라벨로 제어가 넘어감.
DECLARE
vn_base_num NUMBER := 3;
BEGIN
<<third>>
FOR i IN 1..9
LOOP
DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
IF i = 3 THEN -- i가 3이면 fourth로 넘어가기
GOTO fourth;
END IF;
END LOOP;
<<fourth>>
vn_base_num := 4;
FOR i IN 1..9
LOOP
DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt ||'= ' ||vn_base_num *vn_cnt);
END LOOP;
END;
-- 일반적으로 특정 로직에 맞게 PL / SQL 코드를 순착적으로 작성하는데 GOTO문을 사용하면 로직의 일관성을 훼손함. 가독성이 나빠져 개발 현장에서는 GOTO문을 잘 사용하지 않는다.
8) NULL문
-NULL문은 아무것도 처리하지 않는 문장.
-IF문이나 CASE문을 작설항 때 주로 사용.
-조건에 따라 처리 로직을 작성하고 앞에서 작성한 모든 조건에 부합되지 않을 때 (ELSE절을 아무것도 처리하지 않고 싶은 경우 ) NULL문 을 사용
IF vn_variable = 'A' THEN
처리로직 1 ;
ELSIF vn_variable ='B' THEN
처리로직 2;
...
ELSE NULL;
END IF;
---------------------
CASE WHEN vn_variable ='A' THEN
처리로직 1;
WHEN vn_variable ='B' THEN
처리로직 2;
....
ELSE NULL;
END CASE;
'SQL' 카테고리의 다른 글
oracle] 프로시저 (PROCEDURE) 1 (0) | 2024.06.10 |
---|---|
oracle] PL/SQL의 사용자 정의 함수 (1) | 2024.06.06 |
oracle] PL/SQL - 구성요소 (0) | 2024.05.26 |
oracle] PL/SQL - 기본구조 (1) | 2024.05.26 |
[MYSQL] MYSQL에서 NVL을 대체하는 함수 IFNULL (3) | 2024.04.05 |