카테고리 없음
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