반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

Oracle SQL 요약정리 - WHILE LOOP, 예외처리부(EXCEPTION) 본문

Oracle SQL/Oracle SQL 요약정리

Oracle SQL 요약정리 - WHILE LOOP, 예외처리부(EXCEPTION)

yeonee 여니 2023. 6. 14. 20:30
728x90
반응형
SMALL

안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다 :)

 

--3) WHILE LOOP문
/*
    [표현식]
    WHILE 반복문이 수행될 조건 
    LOOP
        반복적으로 실행시킬 구문
    END LOOP;
*/

ex)
DECLARE 
    I NUMBER := 1;
BEGIN 
    WHILE I<6
    LOOP
        DBMS_OUTPUT.PUT_LINE(I);
    I := I +1;
    END LOOP;
END;
/

---- 실습문제 ----
-- LOOP문을 활용하여 구구단 짝수단 출력
-- 2-1) FOR LOOP문 활용
DECLARE 
    RESULT NUMBER;
BEGIN 
    FOR DAN IN 2..9
    LOOP
        IF MOD(DAN,2) = 0 -- 2로 나누었을때 0이라면 == 짝수 DAN%2 == 0
            THEN 
                FOR SU IN 1..9
                LOOP
                    RESULT := DAN * SU;
                    DBMS_OUTPUT.PUT_LINE(DAN || '*' || SU || '=' || RESULT);
                END LOOP;
        END IF;                
    END LOOP;
END;
/

-- 2-2) WHILE LOOP문 활용
DECLARE 
    RESULT NUMBER;
    DAN NUMBER := 2;
    SU NUMBER := 1;
--    I NUMBER := 1;
--    J NUMBER := 0;

BEGIN
    WHILE DAN <= 9
    LOOP
        SU := 1;
        WHILE SU <= 9
        LOOP
            RESULT := SU*DAN;
            DBMS_OUTPUT.PUT_LINE(DAN || '*' || SU || '=' || RESULT);
            SU := SU+1;
        END LOOP;
        DAN := DAN +2;
    END LOOP;
END;
/


-- 4) 예외처리부 
/*
    예외(EXCEPTION) : 실행중 발생하는 오류
    
    [표현식]
    EXCEPTION 
        WHEN 예외명1 THEN 예외처리구문;
        WHEN 예외명2 THEN 예외처리구문;
        ...
        WHEN OTHERS THEN 예외처리구문;
        
        * 시스템예외(오라클에서 미리 정의해둔 예외)
        - NO_DATA_FOUND : SELECT한 결과가 한 행도 없는 경우
        - TOO_MANY_ROWS : SELECT한 결과가 여러 행인 경우
        - ZERO_DIVIDE   : 0으로 나눌 때 발생하는 에러
        - DUP_VAL_ON_INDEX : UNIQUE 제약조건에 위배되었을때
        ...
*/

ex)
-- 사용자가 입력한 수로 나눗셈 연산한 결과 출력
DECLARE 
    RESULT NUMBER;
BEGIN
    RESULT := 10 / &숫자;
    DBMS_OUTPUT.PUT_LINE('결과 : ' || RESULT);
EXCEPTION
--    WHEN ZERO_DIVIDE THEN DBMS_OUPPUT.PUT_LINE('나누기 연산시 0으로 나눌 수 없습니다.');
    WHEN OTHERS THEN DBMS_OUPPUT.PUT_LINE('나누기 연산시 0으로 나눌 수 없습니다.');
END;
/

-- UNIQUE 제약조건 위배
BEGIN
    UPDATE EMPLOYEE
    SET EMP_ID = &사번
    WHERE EMP_NAME = '노옹철';
EXCEPTION --이줄, 아래줄 주석처리 후 실행하면 나오는 오류명(ORA...)이 본 오류명
    WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('이미 존재하는 사번입니다.');
END;
/
-- 데이터가 없거나, 너무많은 케이스
DECLARE 
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
BEGIN
    SELECT EMP_ID,EMP_NAME
      INTO EID, ENAME
      FROM EMPLOYEE
     WHERE MANAGER_ID = &사수사번;
    
    DBMS_OUTPUT.PUT_LINE('사번 : ' || EID || '이름 : ' || EANME);
EXCEPTION
    WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('너무많은 행이 조회되었습니다.');
    WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('조회된 데이터가 없습니다.');
END;
/

DECLARE
    DUP_EMPMO EXCEPTION;
    PRAGMA EXCEPTION_INIT(DUP_EMPNO, -00001);
    -- 유니크제약조건에 위배되는 경우 ORA-00001에러가 발생한다.
    -- ORA-00001에러를 저장하기 위해서 위쪽에 -00001을 써줬는데 ORA는 자동으로 인식하기 때문에 생략되었다.
BEGIN
    UPDATE EMPLOYEE
    SET EMP_ID = &사번
    WHERE EMP_ID = 200;
EXCEPTION
    WHEN DUP_EMPNO
    THEN DBMS_OUTPUT.PUT_LINE('이미존재하는 사번입니다.');
END;
/

728x90
반응형
LIST