C#,Delphi,Oracle,MSSQL 개발자블로그
[Oracle/기본]19. 제어 구조 작성 본문
● PL/SQL 실행 흐림 제어
문장의 논리적 흐름을 변경할 수 있다.
PL/SQL 제어 구조의 2가지 유형
- IF 문장
- LOOP 제어 구조
● IF문장
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
condition 부울 변수 또는 표현식이다. 이것은 IF 표현식이 TRUE를 생성할 때만 일련의 문장들을 실행하도록 한다.
THEN 다음에 나오는 문장들과 그것에 선행되는 부울 표현식을 관련시키는 절이다.
statements 하나 이상의 PL/SQL 또는 SQL 문장이 될 수 있다.
그것들은 몇 개의 중첩 IF, ELSE와 ELSIF를 포함하는 IF문장을 포함할 수 있다.
ELSIF 부울식이 다시 나오게 하는 키워드이다. 처음의 조건이 FALSE 또는 NULL을 생성할 때, ELSIF 키워드는 추가적인 조건을
작성하도록 한다.
ELSE 위의 조건들을 다 만족시키지 못하였을 때 다음의 문장들이 수행된다.
Ex. IF v_ename = 'OSBORNE' THEN
v_mgr := 22;
END IF;
● IF-THEN-ELSE 문장
...
IF v_shipdate - v_orderdate < 5 THEN
v_ship_flag := 'Acceptable';
ELSE
v_ship_flag := 'Unacceptable';
END IF;
...
● IF-THEN-ELSIF 문장
...
IF v_start > 100 THEN
v_start := 2 * v_start;
ELSIF v_start >= 50 THEN
v_start := .5 * v_start; --시작값의 50%
ELSE
v_start := .1 * v_start; --시작값의 10%
END IF;
...
● 논리테이블
AND |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
FALSE |
NULL |
FALSE |
FALSE |
FALSE |
FALSE |
NULL |
NULL |
FALSE |
NULL |
true AND null 은 null
false AND null 은 false
null AND null 은 null
OR |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
NULL |
NULL |
TRUE |
NULL |
NULL |
true OR null 은 true
false OR null 은 null
null OR null 은 null
NOT |
|
TRUE |
FALSE |
FALSE |
TRUE |
NULL |
NULL |
null 의 부정은 null
Ex. 각각의 경우에서 V_FLAG의 값은 무엇인가?
v_flag := v_reorder_flag AND v_available_flag;
V_REORDER_FLAG |
V_AVAILABLE_FLAG |
V_FLAG |
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
FALSE |
NULL |
TRUE |
NULL |
NULL |
FALSE |
FALSE |
● 반복제어 LOOP 문
3가지 루프 유형이 있다.
- Basic loop : 조건 없이 반복적인 작업을 제공한다.
- FOR loop : 카운트를 기본으로 작업의 반복 제어를 제공한다.
- WHILE loop : 조건을 기본으로 작업의 반복 제어를 제공한다.
그리고, 루프를 종료하기 위한 EXIT 문장이 있다.
1. 기본 루프(Basic loop)
LOOP
statement;
...
EXIT [WHEN condition];
END LOOP;
2. FOR 루프
반복되는 수를 정하여 사용할 때 FOR루프를 사용한다.
FOR counter IN [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
...
END LOOP;
counter 상단이나 하단 바운드에 도달할 때까지 루프를 계속 반복함으로써 1씩 자동적으로 증가됙나 감소되는
(감소는 REVERSE 키워드가 사용된다면)값을 가진 암시적으로 선언된 정수이다.
REVERSE 상단 바운드에서 하단 바운드까지 반복함으로써 인덱스가 감소되도록 한다. 하위 값(하단 바운드)는 여전히 처음에
참조된다.
lower_bound 인덱스 값의 범위에 대한 하단 바운드를 지정한다.
upper_bound 인덱스 값의 범위에 대한 상단 바운드를 지정한다.
하단 바운드가 상단 바운드보다 더 큰 정수를 평가한다면, 일련의 문장들은 실행되지 않고 한번만 실행된다.
☞ Ex. FOR i IN 3..3 LOOP statement1; END LOOP;
Ex. DECLARE
v_lower NUMBER := 1;
v_upper NUMBER := 100;
BEGIN
FOR i IN v_lower..v_upper LOOP
END LOOP;
END;
Ex. DECLARE
v_ordid item.ordid%TYPE := 101;
BEGIN
FOR i IN 1..10 LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, i);
END LOOP;
END;
3. WHILE 루프
WHILE condition LOOP
statement1;
statement2;
...
END LOOP;
조건(condition)이 NULL을 리턴할 경우 루프는 실행되지 않고 다음 문장으로 제어를 전달한다.
Ex. DECLARE
...
v_qty NUMBER(8) := 1;
v_running_total NUMBER(7,2) := 0;
BEGIN
...
WHILE v_running_total < p_itemtot LOOP
...
v_qty := v_qty + 1;
v_running_total := v_qty * p_price;
END LOOP;
...
● 중첩루프와 레이블
여러단계로 루프를 중첩한다.
WHILE 루프 내에서 FOR 루프를, FOR 루프 내에서 WHILE 루프를 중첩 할 수 있다.
블록과 루프 사이를 구별하기 위해 레이블을 사용한다.
루프가 레이블되면 END LOOP 문장 후에 루프 이름을 선택적으로 쓸 수 있다.
BEGIN
<<Outer_loop>>
LOOP
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
<<Inner_loop>>
LOOP
...
EXIT Outer_loop WHEN total_done = 'YES';
-- Leave both loops
EXIT WHEN inner_done = 'YES';
-- Leave inner loop only
END LOOP Inner_loop;
...
END LOOP Outer_loop;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------
● 반복문 예제
Ex. MESSAGES 테이블을 만들고,
컬럼 RESULTS 1개를 만들고,
그 컬럼에 6과 8을 제외하고 1에서 10까지 입력합니다.
종료 전에 커밋합니다.
SQL> CREATE TABLE messages(results number(2));
SQL>
BEGIN
FOR i IN 1 .. 10
LOOP
IF i = 6 OR i = 8
THEN
NULL;
ELSE
INSERT INTO messages (results)
VALUES (i);
END IF;
COMMIT;
END LOOP;
END;
Ex. v_char 변수의 값의 홀수/짝수 여부에 따라 messages 테이블의 results 컬럼에 다르게 저장하세요.
(시작 전, results 컬럼의 데이터 타입을 바꿔야 합니다.)
DECLARE
v_char VARCHAR2 (20);
v_num NUMBER;
BEGIN
V_char := '16';
v_num := TO_NUMBER (SUBSTR (v_char, 1, 2));
IF MOD (v_num, 2) = 0
THEN
INSERT INTO messages (results)
VALUES ('Number is even');
ELSE
INSERT INTO messages (results)
VALUES ('Number is odd');
END IF;
END;
'Programming > Oracle 공부' 카테고리의 다른 글
[Oracle/기본]21. 명시적 커서 작성 (0) | 2017.05.31 |
---|---|
[Oracle/기본]20. 조합 데이터 형과 작업 (0) | 2017.05.31 |
[Oracle/기본]18. 오라클 서버와 대화 (0) | 2017.05.31 |
[Oracle/기본]17. 실행 문장 작성 (0) | 2017.05.31 |
[Oracle/기본]16. PL-SQL 변수 선언 (0) | 2017.05.31 |