커서와 예외처리
-커서 선언(Declaration)
-커서 열기(open)
-커서에서 읽어온 데이터 사용(Fetch)
-커서 닫기(Close)
DECLARE
CURSOR 커서이름 IS SQL문; -- 커서 선언(Declaration)
BEGIN
OPEN 커서 이름; - 커서 열기(open)
FETCH 커서이름 INTO 변수 - 커서로부터 읽어온 데이터 사용(Fetch)
CLOSE 커서이름; -- 커서 닫기(Close)
END;
DECLARE
CURSOR C1 IS
SELECT * FROM DEPT;
BEGIN
FOR d IN C1 LOOP
DBMS_OUTPUT.PUT_LINE('DEPTNO : ' || d.DEPTNO);
DBMS_OUTPUT.PUT_LINE('DNAME : ' || d.DNAME);
DBMS_OUTPUT.PUT_LINE('LOC : ' || d.LOC);
DBMS_OUTPUT.PUT_LINE('-------------------------');
END LOOP;
END;
CURSOR 커서명 (변수명 자료형, ....) IS
SELECT .... 변수는 SELECT문 내에서 사용 가능
OPEN 커서명(값, ...);
1) 다른 선언 없이 SQL문을 사용했을 때 오라클에서 자동으로 선언되는 커서
2) 사용자가 OPEN, FETCH, CLOSE를 지정하지 않습니다. PL/SQL문 내부에서 DML 명령어나 SELECT INTO문 등이 실행될 때 자동으로 생성 및 처리
EXCEPTION
WHEN 예외 이름1 [OR 예외 이름2 - ] THEN
예외 처리에 사용할 명령어;
WHEN 예외 이름3 [OR 예외 이름4 - ] THEN
예외 처리에 사용할 명령어;
...
WHEN OTHERS THEN
예외 처리에 사용할 명령어;
EX)
DECLARE
-- V_DNAME NUMBER;
V_DNAME VARCHAR2(20);
V_NUM NUMBER := 10;
BEGIN
SELECT DNAME INTO V_DNAME FROM DEPT WHERE DEPTNO=10;
DBMS_OUTPUT.PUT_LINE(V_NUM / 0);
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('수치 또는 값 오류');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('여러행 조회 오류');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('기타 오류');
END;
어떤 예외인지 모를때 OTHERS
SQLCODE : 오류 번호
SQLERRM : 오류 메시지