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
반응형
'교육 > Oracle' 카테고리의 다른 글
Oracle 개발자 수업 45일차 - 프로시저의 매개변수 (0) | 2021.06.01 |
---|---|
Oracle 개발자 수업 44일차 - 커서(CURSOR), 프로시저(PROCEDURE) (0) | 2021.05.31 |
Oracle 개발자 수업 42일차 - 참조 자료형, 제어문(조건문) (0) | 2021.05.27 |
Oracle 개발자 수업 41일차 - Normalization, PL/SQL (0) | 2021.05.27 |
Oracle 개발자 수업 40일차 - Modeling (0) | 2021.05.25 |
댓글