카테고리 없음

Oracle(2022.03.04)-반복문2

AIN99 2022. 3. 4. 15:14
728x90

FOR 문
  -반복횟수를 정확하게 알고 있거나, 반복횟수가 중요한 경우 사용
  (일반적  FOR문 사용형식)
   

FOR 인덱스 IN [REVERSE] 초기값..최종값 LOOP
      반복수행할 명령문(들);
           :
    END LOOP;


     .'인덱스' :시스템에서 제공하는 제어변수
     .'REVERSE' : 역순으로 반복할때 사용
     .'초기값..최종값' :'초기값'에서 '최종값'까지 1씩 증가 또는 감소

 

사용예)구구단의 7단을 FOR문으로 구성
 

  DECLARE
    BEGIN
      FOR I IN 1..9 LOOP
        DBMS_OUTPUT.PUT_LINE('7 * '||I||'='||7*I);
      END LOOP;
    END;

 DECLARE
    BEGIN
      FOR I IN REVERSE 1..9 LOOP
        DBMS_OUTPUT.PUT_LINE('7 * '||I||'='||7*I);
      END LOOP;
    END;

(커서문에 사용되는 FOR문 사용형식)

 커서본문: 커서에 사용되어진 SELECT 본문을 말한다. 인라인커서라고함,FETCH문을 사용 못함

 FOR 레코드명 IN 커서명|(커서본문) LOOP
     반복수행할 명령문(들);
           :
   END LOOP;

-커서내의 컬럼명 참조는 '레코드명.컬럼명'으로 참조
-FOR문에서  커서를 사용하는 경우 OPEN, FETCH, CLOSE 문은 사용하지 않음 


사용예)회원테이블에서 충남에 거주하는 회원정보를 커서로 구성하고 
      생성된 커서를 이용하여 2005년 5월 판매현황을 조회하시오.
      Alias는 회원번호, 회원명, 구매금액합계 

(일반적 FOR문) 
   

 DECLARE
        V_RES VARCHAR2(100);
        V_SUM NUMBER :=0;
        CURSOR CUR_MEM01 IS
        SELECT MEM_ID,MEM_NAME  --변수로 설정을 하지않음 WHY? FETCH문 하면 읽어올 컬럼을 보관할 변수가 필요(INTO를 사용해서) 그런데 FOR문을 쓰면 
          FROM MEMBER
          WHERE MEM_ADD1 LIKE '충남%';
      BEGIN
       FOR REC IN CUR_MEM01 LOOP  --REX.MEM_ID이렇게 가져옴
         SELECT SUM(A.CART_QTY*B.PROD_PRICE) INTO V_SUM
           FROM CART A,PROD B
           WHERE A.CART_PROD=B.PROD_ID
             AND A.CART_NO LIKE '200505%'
             AND A.CART_MEMBER=REC.MEM_ID;
          V_RES:=REC.MEM_ID||', '||REC.MEM_NAME
                           ||LPAD(TO_CHAR(V_SUM,'99,999,990'),12,' ');
         DBMS_OUTPUT.PUT_LINE(V_RES);
       END LOOP;
     END;

 (INLINE SUBQUERY 커서 구현된 FOR문)
   

 DECLARE
        V_RES VARCHAR2(100);
        V_SUM NUMBER :=0;
      BEGIN
       FOR REC IN ( SELECT MEM_ID,MEM_NAME
                      FROM MEMBER
                      WHERE MEM_ADD1 LIKE '충남%')
       LOOP
         SELECT SUM(A.CART_QTY*B.PROD_PRICE) INTO V_SUM
           FROM CART A,PROD B
           WHERE A.CART_PROD=B.PROD_ID
             AND A.CART_NO LIKE '200505%'
             AND A.CART_MEMBER=REC.MEM_ID;
         V_RES:=REC.MEM_ID||', '||REC.MEM_NAME
                          ||LPAD(TO_CHAR(V_SUM,'99,999,990'),12,' ');
         DBMS_OUTPUT.PUT_LINE(V_RES);
       END LOOP;
     END;

728x90