본문 바로가기
DB/SQL(오라클)

오라클(SQL)WHILE문(LOOP,WHILE)

by redbear0077 2021. 3. 17.
반응형

WHILE문(LOOP,WHILE)

.응용프로그램 개발언어의 WHILE과 유사
(사용형식)
WHILE 조건 LOOP
    반복처리문(들);
END LOOP;
    -'조건'의 결곽 FALSE인 경우 반복을 벗어남
사용예) 구구단의 4단을 출력하시오

DECLARE 
    V_CNT NUMBER:=0; 
BEGIN 
    WHILE V_CNT <= 9 LOOP 
        DBMS_OUTPUT.PUT_LINE('4*'||V_CNT||'='||4*V_CNT); 
        V_CNT:=V_CNT+1; 
    END LOOP; 
END; 



사용예)LOOP문으로 구현한 커서문을 WHILE문으로 재구성하시오

DECLARE  
    V_ID PROD.PROD_ID%TYPE; 
    V_NAME PROD.PROD_NAME%TYPE; 
    V_AQTY NUMBER:=0; 
    V_AMON NUMBER:=0; 
    CURSOR CUR_BUYPROD02 
    IS 
    SELECT  BUY_PROD, 
            PROD_NAME, 
            SUM(BUY_QTY), 
            SUM(BUY_QTY*PROD_COST) 
    FROM    BUYPROD, PROD 
    WHERE   PROD_ID=BUY_PROD 
    AND     BUY_DATE BETWEEN '20050301' AND '20050331' 
    GROUP   BY BUY_PROD,PROD_NAME; 
BEGIN 
    OPEN CUR_BUYPROD02; 
    FETCH CUR_BUYPROD02 INTO V_ID, V_NAME, V_AQTY, V_AMON;--SQL은 해당자료가 있는지 확인해야 명령을 수행가능하다 
    WHILE CUR_BUYPROD02%FOUND LOOP 
        DBMS_OUTPUT.PUT_LINE('순 번: '||CUR_BUYPROD02%ROWCOUNT); 
        DBMS_OUTPUT.PUT_LINE('제품명:'||V_NAME); 
        DBMS_OUTPUT.PUT_LINE('매입수량:'||V_AQTY); 
        DBMS_OUTPUT.PUT_LINE('매입금액:'||V_AMON); 
        DBMS_OUTPUT.PUT_LINE('----------------'); 
        FETCH CUR_BUYPROD02 INTO V_ID, V_NAME, V_AQTY, V_AMON; 
    END LOOP; 
    CLOSE CUR_BUYPROD02; 
END; 



해보기] 첫날에 100원, 두번째날부터는 전날의 2배씩 저축을하려한다
    최초로 100만원을 넘는 날은 몇칠째이고 그날까지 저축한 액수를 구하시오
    LOOP와 WHILE문으로 구성할것)

(결과의 2배 합)
(LOOP 연산)

DECLARE 
    V_CNT NUMBER:=100; 
    V_RES NUMBER:=1; 
BEGIN 
    LOOP 
        DBMS_OUTPUT.PUT_LINE(V_RES||'일'||V_CNT||'원');--프린트부분 
        V_RES:=V_RES+1; 
        V_CNT:=V_CNT+(V_CNT*2); 
        EXIT WHEN V_CNT >= 1000000; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('최초로 100만원을 넘는 날은 '||V_RES||'일째이고 그날까지 저축한 액수는 '||V_CNT||'원 이다.');--프린트부분 
END; 



(LOOP,WHILE 형식)

DECLARE 
    V_CNT NUMBER:=100; 
    V_RES NUMBER:=1; 
BEGIN 
    WHILE V_CNT <= 1000000 LOOP 
        DBMS_OUTPUT.PUT_LINE(V_RES||'일'||V_CNT||'원');--프린트부분 
        V_RES:=V_RES+1; 
        V_CNT:=V_CNT+(V_CNT*2); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('최초로 100만원을 넘는 날은 '||V_RES||'일째이고 그날까지 저축한 액수는 '||V_CNT||'원 이다.');--프린트부분 
END; 





(가진돈의 2배 합)
(LOOP 연산)

DECLARE 
    V_CNT NUMBER:=100; 
    V_RES NUMBER:=1; 
    V_HAM NUMBER:=100; 
BEGIN 
    LOOP 
        EXIT WHEN V_HAM >= 1000000; 
        DBMS_OUTPUT.PUT_LINE(V_RES||'일'||v_HAM||'원');--프린트부분 
        V_CNT := (V_CNT*2); 
        V_HAM := V_HAM + V_CNT; 
        V_RES:=V_RES+1; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('최초로 100만원을 넘는 날은 '||V_RES||'일째이고 그날까지 저축한 액수는 '||v_HAM||'원 이다.');--프린트부분 
END; 



(LOOP,WHILE 형식)

DECLARE 
    V_CNT NUMBER:=100; 
    V_RES NUMBER:=1; 
    V_HAM NUMBER:=100; 
BEGIN 
    WHILE V_HAM <= 1000000 LOOP 
          DBMS_OUTPUT.PUT_LINE(V_RES||'일'||v_HAM||'원');--프린트부분 
        V_CNT := (V_CNT*2); 
        V_HAM := V_HAM + V_CNT; 
        V_RES:=V_RES+1; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('최초로 100만원을 넘는 날은 '||V_RES||'일째이고 그날까지 저축한 액수는 '||v_HAM||'원 이다.');--프린트부분 
END; 
반응형

'DB > SQL(오라클)' 카테고리의 다른 글

오라클(SQL)테이블 수정  (0) 2021.03.19
오라클(SQL)PL/SQL 펑션  (0) 2021.03.18
오라클(SQL)반복문과 커서  (0) 2021.03.17
오라클(SQL)CASE문  (0) 2021.03.17
오라클(SQL)PL/SQL(PROCEDUAL LANGUAGE SQL)  (0) 2021.03.17