<학습목표>
1. GOTO : 반복
2. FOR : 반복
3. EXCEPTION
1) 정의된 예외
2) 정의 안된 예외
3) 사용자 정의
4. SURSOR : SELECT 결과를 메모리에 BIND후 한행씩 작업
GOTO
EX)

구구단

FOR
EX)

REVERSE

별찍기

EXCEPTION

EX)자주사용되는 오류
DECLARE
V_NM VARCHAR2(60);
BEGIN
SELECT LPROD_NM INTO V_NM
FROM LPROD
WHERE LPROD_GU = 'P201';
DBMS_OUTPUT.PUT_LINE('V_NM : ' || V_NM);
--정의된 오류 처리
EXCEPTION
WHEN NO_DATA_FOUND THEN --ORA-01403
DBMS_OUTPUT.PUT_LINE('해당 정보가 없습니다.');
END;
/
DECLARE
V_NM VARCHAR2(60);
BEGIN
SELECT LPROD_NM INTO V_NM
FROM LPROD
WHERE LPROD_GU LIKE 'P2%'; --P201, P202..
DBMS_OUTPUT.PUT_LINE('V_NM : ' || V_NM);
--정의된 오류 처리
EXCEPTION
WHEN TOO_MANY_ROWS THEN --ORA-01422
DBMS_OUTPUT.PUT_LINE('한 개 이상의 값이 나왔습니다');
END;
/
DECLARE
V_NM VARCHAR2(60);
BEGIN
SELECT LPROD_NM + 0 INTO V_NM
FROM LPROD
WHERE LPROD_GU LIKE 'P201'; --P201, P202..
DBMS_OUTPUT.PUT_LINE('V_NM : ' || V_NM);
--정의된 오류 처리
EXCEPTION
WHEN OTHERS THEN --ORA-01722(SQLERRM : SQL ERROR MESSAGE)
DBMS_OUTPUT.PUT_LINE('기타오류 : ' || SQLERRM);
END;
/
정의되지 않은 예외인 경우
EX)


CURSOR
2005년도 상품별 매입수량의 합계
DECLARE
V_PROD VARCHAR2(20);
V_QTY NUMBER;
--SURSOR 선언
CURSOR GAEDDONGI IS
SELECT BUY_PROD, SUM(BUY_QTY) FROM BUYPROD
WHERE EXTRACT(YEAR FROM BUY_DATE) = 2005
GROUP BY BUY_PROD ORDER BY BUY_PROD ASC;
BEGIN
--데이터를 메모리로 BIND(올림)
OPEN GAEDDONGI;
--작업 수행
--다음 행을 가리킴, 패출
FETCH GAEDDONGI INTO V_PROD, V_QTY;
DBMS_OUTPUT.PUT_LINE(V_PROD || ',' || V_QTY);
FETCH GAEDDONGI INTO V_PROD, V_QTY;
DBMS_OUTPUT.PUT_LINE(V_PROD || ',' || V_QTY);
FETCH GAEDDONGI INTO V_PROD, V_QTY;
DBMS_OUTPUT.PUT_LINE(V_PROD || ',' || V_QTY);
FETCH GAEDDONGI INTO V_PROD, V_QTY;
DBMS_OUTPUT.PUT_LINE(V_PROD || ',' || V_QTY);
FETCH GAEDDONGI INTO V_PROD, V_QTY;
DBMS_OUTPUT.PUT_LINE(V_PROD || ',' || V_QTY);
--데이터를 메모리에서 삭제
CLOSE GAEDDONGI;
END;
/