안녕하세요.
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;
/