본문 바로가기
교육/Oracle

Oracle 개발자 수업 43일차 - 반복문(LOOP, FOR LOOP, WHILE LOOP), 예외처리(EXCEPTION)

by yhyuk 2021. 5. 28.
728x90
반응형

1. 반복문(LOOP, FOR LOOP, WHILE LOOP)

2. 예외처리(EXCEPTION)


1. 반복문(LOOP, FOR LOOP, WHILE LOOP)

[ LOOP ]

- 무한 루프

- 탈출 조건 처리(안하면 무한 반복)

- 예제

SET SERVEROUTPUT ON;

-- 예제1
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'HH24:MI:SS'));
    END LOOP;
END;
----> 현재시간이 무한반복.. -> 에러발생

-- 예제2
DECLARE
    VNUM NUMBER := 1;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(VNUM);
        VNUM := VNUM + 1;
        
        EXIT WHEN VNUM > 10; --> EXIT: Java의 if문과 다르게 조건을 만족하면 구문을 빠져나간다.
    END LOOP;
END;

-- 예제3
-- 더미데이터 + 100000개 추가하기
-- DATA: '데이터1', '데이터2', '데이터3' ..... '데이터10000'
CREATE TABLE TBLLOOP (
    SEQ NUMBER PRIMARY KEY,
    DATA VARCHAR2(30) NOT NULL
);

CREATE SEQUENCE SEQLOOP;

DECLARE
    VNUM NUMBER := 1;
BEGIN
    LOOP 
        INSERT INTO TBLLOOP (SEQ, DATA) VALUES (SEQLOOP.NEXTVAL, '데이터' || VNUM);
        VNUM := VNUM + 1;
        EXIT WHEN VNUM > 10000;
    END LOOP;
END;

 

[ FOR LOOP ]

- 지정 횟수 반복

- 예제

-- 예제1
BEGIN
    -- I: 루프변수
    -- IN: 연결 키워드
    -- 1: 초깃값
    -- 10: 최댓값
    -- ..: 증가
    FOR I IN 1..10 LOOP
        DBMS_OUTPUT.PUT_LINE(I);
    END LOOP;
    
    FOR I IN REVERSE 1..10 LOOP
        DBMS_OUTPUT.PUT_LINE(I);
    END LOOP;
END;


-- 예제2
-- 2~9 구구단 만들기

CREATE TABLE TBLGUGUDAN (
    DAN NUMBER NOT NULL,
    NUM NUMBER NOT NULL,
    RESULT NUMBER NOT NULL,
    
    -- 복합키 생성
    CONSTRAINT TBLGUGUDAN_DAN_NUM_PK PRIMARY KEY(DAN, NUM)
)

BEGIN
    FOR VDAN IN 2..9 LOOP
        FOR VNUM IN 1..9 LOOP
            INSERT INTO TBLGUGUDAN (DAN, NUM, RESULT)
                VALUES (VDAN, VNUM, VDAN * VNUM);
        END LOOP;
    END LOOP;
END;

SELET * FROM TBLGUGUDAN;


-- 예제3
-- 전체 직원 중, 번호가 1015 ~ 1045 인 사람의 이름 삽입하기
DECLARE
    VNAME TBLINSA.NAME%TYPE;
BEGIN
    FOR VNUM IN 1015..1045 LOOP
        SELECT NAME INTO VNAME FROM TBLINSA WHERE NUM = VNUM;
        INSERT INTO TBLOOP (SEQ, DATA) VALUES (SEQLOOP.NEXTVAL, VNAME);
    END LOOP;
END;

SELECT * FROM TBLLOOP;

 

[ WHILE LOOP ]

- 조건 반복

- 예제

-- 예제1
DECLARE
    VNUM NUMBER := 1;
BEGIN
    WHILE VNUM <= 10 LOOP
        DBMS_OUTPUT.PUT_LINE(VNUM);
        VNUM := VNUM + 1;
    END LOOP;
END;

---> 1 ~ 10 출력

2. 예외처리(EXCEPTION)

DECLARE
    VNUM NUMBER;
    VNAME NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('START');
    SELECT NAME INTO VNAME TBLINSA WHERE NUM = 10001;
    DBMS_OUTPUT.PUT_LINE(VNAME);
    
    VNUM := 0;
    DBMS_OUTPUT.PUT_LINE(100 / VNUM);
    DBMS_OUTPUT.PUT_LINE('END');
EXCEPTION
    -- Java의 catch절, 예외처리부
    WHEN VALUE_ERROR THEN
            DBMS_OUTPUT.PUT_LINE('자료형 불일치');
    WHEN ZERO_DIVIDE THEN
            DBMS_OUTPUT.PUT_LINE('0으로 나누지 못합니다.');
    WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('모든 종류의 예외처리');
END;

 


MEMO >

# SQL에서 FOR LOOP는 증감식 지정이 안된다. ex) 1..10 --> 1~10인데, 2씩증가는 안됨

 

# PL/SQL DECLARE에서 변수명 입력 시 항상 앞에 'V'를 붙였던 이유는 내가 접근하려는 테이블의 컬럼명과 같아도 되지만, 혼동을 주기에 다르게 하기위해 지정한다.

 

# 오늘 배운 EXCEPTION은 Java의 exception(예외처리)같이 일반적인 규칙이 없기때문에, Oracle DOCS에서 도움말을 참조하면서 예외구문을 넣어줘야한다.

----> 일부로 에러를 발생시키고 에러 구문의 고유번호를 참조한다. (전부 외우기가 매우 힘들다.)

----> ex) ORA-06502 ---> DOCS에서 6502 검색 후 참조한다.

 

728x90
반응형

댓글