레이블이 PLSQL강의인 게시물을 표시합니다. 모든 게시물 표시
레이블이 PLSQL강의인 게시물을 표시합니다. 모든 게시물 표시

2021년 10월 16일 토요일

PL/SQL 반복문 BASIC LOOP, FOR LOOP, WHILE LOOP

 

PL/SQL 반복문 BASIC LOOP, FOR LOOP, WHILE LOOP

15.1.4. PL/SQL 반복문


PL/SQL 프로그래밍을 하다보면 특정 코드블록을 여러번 반복 실행해야 하는 경우가 있을 수 있습니다.  이럴때 PL/SQL반복문을 사용 합니다.


PL/SQL 반복문은 BASIC LOOP ~ END LOOP, WHILE LOOP ~ END LOOP, FOR LOOP ~ END LOOP가 있습니다.


LOOP ~ END LOOP 안에서 루프를 조절하는 몇가지 명령을 사용할 수 있습니다.

EXIT : EXIT를 만나면 제어를 END LOOP 바로 다음으로 이동 시킵니다. 즉 루프를 빠져 나갑니다.

EXIT WHEN condition : 지정한 조건이 되면 루프를 빠져 나갑니다.

CONTINUE : CONTINUE 이후의 문장을 SKIP하고 해당 루프의 다음 반복을 계속할 수 있도록 합니다.

GOTO label : lebel이 지정된 명령문으로 제어를 이동시킵니다. GOTO 사용은 순차적인 프로그래밍 방식에서 제어의 일관성이 상실되어 가독성이 떨어지므로 권장하지 않습니다.


15.1.4.1. BASIC LOOP문


반복실행될 명령은 LOOP ~ END LOOP 사이에 기술하며, 명령문이 실행된 후 제어가 위쪽 LOOP에서 다시 시작됩니다.


<기본형식>

LOOP

    EXIT WHEN condition;

    CONTINUE;

    statements;

END LOOP;


  • condition : 해당 조건이 되면 루프를 빠져 나갑니다.

  • statements : 반복 실행할 명령.


15.1.4.1.1. 구구단 출력하기 : BASIC LOOP


구구단 2단, 3단을 출력하는 PL/SQL 예문을 BASIC LOOP문을 이용하여 작성해 봅시다.


구구단 2단, 3단을 출력하세요.


SET SERVEROUTPUT ON;


DECLARE 

   -- 숫자 2자리를 저장할 수 있는 NUMBER형 변수 I, J를 선언하고 초기치를 할당

   I NUMBER(2) := 1; 

   J NUMBER(2) := 0; 

BEGIN 

   -- 외부 루프

   LOOP 

      -- I를 1증가

      I := I + 1;

      

      -- I값이 3보다 크면 외부루프를 빠져나옴

      EXIT WHEN I > 3;

      

       -- 내부 루프

       LOOP 

            -- J값을 1증가, J는 0부터 시작됨

            J := J + 1;

            

            -- J값이 9보다 크면 외부루프를 빠져나옴

            EXIT WHEN J > 9;

            DBMS_OUTPUT.PUT_LINE( I || ' * ' || J || '=' || I * J); 

       END LOOP;  -- 내부 루프 종료

       

       -- 내부 루프를 빠져 나오면 J를 초기값으로 할당

       J := 0;

       

       DBMS_OUTPUT.PUT_LINE('');

   END LOOP;   -- 외부 루프 종료

END;  


<실행결과>

2 * 1=2

…...

2 * 9=18


3 * 1=3

…...

3 * 9=27



위 예문에서 레이블은 생략 가능 합니다. 실무에서 PL/SQL 작성시 label은 거의 사용하지 않습니다. label을 기술하고 GOTO문 등으로 제어를 이동시킬 수 있지만 권장하지 않습니다.



15.1.4.2. FOR LOOP문


명령을 고정된 횟수 만큼 반복하려면 FOR ~ LOOP를 사용합니다.


루프 카운터 변수는 기본적으로 시작값에서 상한값까지 1씩 증가 하면서 이동하고 REVERSE라고 하면 상한값에서 시작값으로 -1씩 증가 합니다. 또한 초기값과 상한값의 위치가 바뀌어서도 안되고 초기값과 상한값은 점2개(..)로 연결 됩니다.


<기본형식>


FOR index IN [REVERSE] lowest_num..highest_num

LOOP

   statements

END LOOP;


  • index : 루프 카운터 변수. 루프 밖에서는 참조가 불가능 합니다. 루프 안에서는 참조는 가능하지만 값을 변경할 수는 없습니다.

  • [REVERSE] : 루프 카운터는 상한값에서 시작값으로 역으로 변합니다.[생략가능]

  • lowest_num : PLS_INTEGER형식의 루프 카운터 변수의 시작값, 숫자 또는 숫자로 평가되는 표현식.

  • highest_num : PLS_INTEGER형식의 루트 카운터 변수의 상한값, 숫자 또는 숫자로 평가되는 표현식.

  • lowest_num 및 highest_num 값은 FOR LOOP 문이 시작될 때 한 번 평가되므로 값을 수정하더라도 변경사항이 적용되지 않습니다.

  • lowest_num 값이 highest_num 값과 같으면 명령문은 한 번만 실행되고 lowest_num 값이 highest_num 값 보다 크면 명령문이 실행되지 않습니다.

  • statements : 반복 실행할 명령.



15.1.4.1.1. 숫자 출력하기 : FOR  LOOP

 

10부터 2까지 내림 차순으로 짝수를 출력하는  PL/SQL 예문을 FOR LOOP문을 이용하여 작성해 봅시다.


10부터 2까지 내림차순으로 짝수를 출력하세요.


SET SERVEROUTPUT ON;


DECLARE 

   -- 초기값 2를 가지는 변수 v_step을 선언

   v_step  PLS_INTEGER := 2;

BEGIN 

   -- FOR LOOP 5부터 1까지 -1씩 증가하면서 5번 반복

   FOR I IN REVERSE 1..5  

   LOOP 

       -- 10부터 2까지 5번 반복하면서 값을 출력  

       DBMS_OUTPUT.PUT_LINE(I * v_step);

   END LOOP;   -- FOR LOOP 종료

END; 



<실행결과>

10

8

6

4

2



15.1.4.1.2. 구구단 출력하기 : FOR  LOOP

 

구구단 2단, 3단을 출력하는 PL/SQL 예문을 FOR LOOP문을 이용하여 작성해 봅시다.


구구단 2단, 3단을 출력하세요.


SET SERVEROUTPUT ON;


DECLARE 

   -- 숫자 1자리를 저장할 수 있는 NUMBER형 변수 I, J를 선언

   I NUMBER(1); 

   J NUMBER(1); 

BEGIN 

   -- 외부 루프

   FOR I IN 2..3 LOOP 

        -- 내부 루프

        FOR J IN 1..9 LOOP 

             DBMS_OUTPUT.PUT_LINE( I || ' * ' || J || '=' || I * J); 

        END LOOP;  -- 내부 루프 종료

        DBMS_OUTPUT.PUT_LINE('');

   END LOOP;   -- 외부 루프 종료

END;  


<실행결과>

2 * 1=2

…...

2 * 9=18


3 * 1=3

…...

3 * 9=27




15.1.4.3. WHILE LOOP문


지정한 조건이 참(TRUE)인 동안 LOOP 안쪽 명령을 실행합니다. 조건이 거짓이라면 LOOP 안쪽 명령은 한번도 실행되지 않습니다.


<기본형식>

WHILE condition

LOOP

   statements

END LOOP;


  • condition : 루프가 반복될 때마다 먼저 평가되며 TRUE 경우만 LOOP ~ END LOOP 사이의 명령문을 실행 합니다. FALSE, NULL이 되면 루프는 종료 됩니다. LOOP에 들어가기 전에 condition이 FALSE이면 WHILE 루프는 전혀 실행되지 않습니다. 이 동작은 루프 본문이 항상 한 번 실행되는 BASIC LOOP 문과 다릅니다.

  • statements : 반복 실행할 명령.

  • LOOP를 조기에 종료하려면 EXIT, EXIT WHEN절을 사용합니다.


15.1.4.3.1. 구구단 출력하기 : WHILE  LOOP

 

구구단 2단, 3단을 출력하는 PL/SQL 예문을 WHILE LOOP문을 이용하여 작성해 봅시다.


구구단 2단, 3단을 출력하세요.


SET SERVEROUTPUT ON;


DECLARE 

   -- NUMBER형 변수 I, J를 선언하고 초기치 할당

   -- 구구단에서 I는 2부터 시작하고 J는 1부터 시작한다.

   I NUMBER(1) := 1; 

   J NUMBER(2) := 0; 

BEGIN 

   -- 외부 루프(2단부터 3단까지 출력)

   WHILE I < 3 

   LOOP 

        I := I + 1;

        -- 내부 루프(1~9까지 반복)

        WHILE J < 9 

        LOOP 

             J := J + 1;

             

             DBMS_OUTPUT.PUT_LINE( I || ' * ' || J || '=' || I * J); 

        END LOOP;  -- 내부 루프 종료

        DBMS_OUTPUT.PUT_LINE('');

        J := 0;

   END LOOP;   -- 외부 루프 종료

END;


<실행결과>

2 * 1=2

…...

2 * 9=18


3 * 1=3

…...

3 * 9=27

PLSQL 제어문_CASE문

 

PLSQL 제어문_CASE문


오라클 9i 이후 CASE문을 사용할 수 있는데 IF-THEN-ELSE 가능과 유사 합니다.

SIMPLE CASE문과 Searched CASE문으로 구별할 수 있는데 SIMPLE CASE문은 단일 표현식을 평가하고 그 결과를 일부 값과 비교합니다. SEARCHED CASE문은 여러 부울 식을 평가하고 TRUE로 평가되는 첫 번째 WHEN절의 THEN 이하를 실행합니다.


여러 부울 표현식의 결과를 기반으로 일련의 명령문을 실행하려는 경우 SEARCHED CASE 문을 사용하고 하나의  결과를 기반으로 일련의 명령문을 실행하려는 경우 SIMPLE CASE 문을 사용합니다.


 아래 기본형식을 보면서 이해해 봅시다.


<Simple CASE문 기본형식>

CASE selector  

   WHEN condition1 THEN result1

   WHEN condition2 THEN result2

   ...

   WHEN conditionN THEN  resultN

   ELSE result

END CASE;


  • selector : 한번 평가되는 표현식으로 WHEN절에서 condition 값과 비교 됩니다.

  •  WHEN condition THEN result : selector 값이 condition과 같을 때 THEN 이하가 실행 됩니다.

  • ELSE result : selector와 일치하는 WHEN 조건이 없을 때 실행됩니다.

  • END : CASE문의 종료를 표시 합니다.

  • 조건이 만족할 때 아무것도 하지말라는 의미를 부여하려면 result 자리에 NULL 이라고 기술하면 됩니다.


<Searched  CASE문 기본형식>

CASE  

   WHEN condition1 THEN result1

   WHEN condition2 THEN result2

   ...

   WHEN conditionN THEN  resultN

   [ELSE result]

END CASE;


  • WHEN 절의 조건은 위에서 아래로 순서대로 평가됩니다.

  • 조건이 TRUE로 평가되는 WHEN 절과 연관된 일련의 명령문이 실행되고 둘 이상의 조건이 TRUE로 평가되면 첫 번째 조건 만 실행됩니다.

  • TRUE로 평가되는 조건이 없으면 ELSE 절의 [ELSE result]가 실행됩니다. ELSE 절을 생략되고 TRUE식이 없으면 CASE_NOT_FOUND 예외가 발생합니다.

  • 조건이 만족할 때 아무것도 하지말라는 의미를 부여하려면 result 자리에 NULL 이라고 기술하면 됩니다.


15.1.3.2.1 부서코드값을 비교하는 예제 실습 : SIMPLE CASE


익명코드 블록으로 EMP테이블에서 부서코드(deptno) 컬럼 값을 SIMPLE CASE문으로 비교하는 예제 입니다. 


EMP 테이블에서 사번이 7369인 사원의 부서코드(deptno)가 10이면 accounting, 20이면  research, 30이면 sales를 출력하세요.


SET SERVEROUTPUT ON;


DECLARE

   -- EMP 테이블의 DEPTNO 컬럼과 타입이 같은 V_DEPTNO 변수를 선언 합니다.

   V_DEPTNO EMP.DEPTNO%TYPE;

BEGIN

   -- BEGIN내의 SELECT문은 한건만 SELECT되야 하고 INTO절에서 받아줘야 합니다.

   SELECT  DEPTNO INTO V_DEPTNO

   FROM    EMP

   WHERE   EMPNO = 7369;

   

   CASE V_DEPTNO

       WHEN 10 THEN

          DBMS_OUTPUT.PUT_LINE('accounting...' || V_DEPTNO);

       WHEN 20 THEN ❶

          DBMS_OUTPUT.PUT_LINE('research...' || V_DEPTNO);

       WHEN 30 THEN

          DBMS_OUTPUT.PUT_LINE('sales...' || V_DEPTNO);

   END CASE;

END;


<실행결과>

research...20



❶ 7369 SMITH 직원의 부서코드는 20 입니다. 그래서 WHEN 20 THEN이 실행되어 결과가 나왔습니다.


15.1.3.2.2 급여값을 비교하는 예제 실습 : SEARCHED CASE


익명코드 블록으로 EMP테이블에서 급여(sal) 컬럼 값을 SEARCHED CASE문으로 비교하는 예제 입니다. 


EMP 테이블에서 사번이 7369인 사원의 급여(sal)가 3000보다 크면 'high sal'

2000보다 크면 'mid sal' 그 밖에는 'low sal'을 출력하세요.


SET SERVEROUTPUT ON;


DECLARE

   -- EMP 테이블의 SAL 컬럼과 타입이 같은 V_SAL 변수를 선언 합니다.

   V_SAL EMP.SAL%TYPE;

BEGIN

   -- BEGIN내의 SELECT문은 한건만 SELECT되야 하고 INTO절에서 받아줘야 합니다.

   SELECT  SAL INTO V_SAL

   FROM     EMP

   WHERE  EMPNO = 7369;

   

   CASE 

       WHEN V_SAL >= 3000 THEN

          DBMS_OUTPUT.PUT_LINE('high sal...' || V_SAL);

       WHEN V_SAL >= 2000 THEN

          DBMS_OUTPUT.PUT_LINE('mid sal...' || V_SAL);

       ELSE ❶

          DBMS_OUTPUT.PUT_LINE('low sal...' || V_SAL);

   END CASE;

END;


<실행결과>

low sal...800



❶ 7369 SMITH 직원의 급여는 800 입니다. 그래서 ELSE 이하가 실행되어 결과가 나왔습니다.

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...