C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/기본]19. 제어 구조 작성 본문

Programming/Oracle 공부

[Oracle/기본]19. 제어 구조 작성

19760323 2017. 5. 31. 16:13

● 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;

 

Comments