오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

15
The Technique of Java Programming

Transcript of 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

Page 1: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

The Technique of Java Programming

Page 2: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

들어가기

이 자료는 교육 등 비영리 목적으로만 사용해야 합니다 !!!!

Page 3: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

만든사람 및 책 소개

• 오라클 SQL과 PL/SQL을 다루는 기술 : 오라클 프로그래밍 , 현장 밀착 입문서는 따로 있다 !

• 홍형경

• 주요 저서 : - 〈뇌를 자극하는 오라클 프로그래밍 SQL&PL/SQL

- Head First 시리즈를 비롯해 다수의 책 번역

Page 4: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

예외처리와 트랜잭션둘째 마당 . 복잡한 비즈니스 로직을 처리하는 PL/SQL

10장

Page 5: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01 예외처리

트랜잭션02

예외처리와 트랜잭션

Page 6: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

예외란 ?

예외처리

● 컴파일 시 발생하는 오류 문법 오류

● 런타임 오류 예외 (Exception)

● 예외처리구문

EXCEPTION WHEN 예외명 1 THEN 예외처리 구문 1 WHEN 예외명 2 THEN 예외처리 구문 2 … WHEN OTHERS THEN 예외처리 구문 n;

Page 7: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

예외란 ?

예외처리

● 예외처리 예제

DECLARE vi_num NUMBER := 0;

BEGIN vi_num := 10 / 0; DBMS_OUTPUT.PUT_LINE('Success!');

EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(' 오류가 발생했습니다 ');END;

Page 8: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

SQLCODE 와 SQLERRM

예외처리

● SQLCODE : 예외 발생 시 예외코드를 반환하는 빌트인 함수

예 ) DBMS_OUTPUT.PUT_LINE(SQLCODE); -1476

● SQLERRM : 예외 발생 시 예외 메시지를 반환하는 함수

예 ) DBMS_OUTPUT.PUT_LINE(SQLERRM); 제수가 0 입니다

● DBMS_UTILITY.FORAMT_ERROR_BACKTRACE 함수

예외가 발생한 소스상의 라인번호 반환

Page 9: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

시스템 예외

예외처리

● 미리 정의된 예외 : 예외 처리 시 사용하는 시스템 예외명

● 시스템 예외 종류

ㆍ NO_DATA_FOUND : SELECT INTO 시 데이터가 한 건도 없을 경우 (ORA-01403)

ㆍ TOO_MANY_ROWS : SELECT INTO 절 사용할 때 결과가 한 로우 이상일 때 (ORA-01422)

ㆍ ZERO_DIVIDE : 0 으로 나눌 때 (ORA-01476)

ㆍ INVALID_CURSOR : 존재하지 않는 커서를 참조 (ORA-01001)

ㆍ DUP_VAL_ON_INDEX : 유일 인덱스가 있는 컬럼에 중복값으로 INSERT, UPDATE 수행 (ORA-00001)

ㆍ LOGIN_DENIED : 잘못된 사용자 이름이나 비밀번호로 로그인을 시도 (ORA-01017)

Page 10: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

사용자 정의 예외

예외처리

● 시스템 예외와 달리 사용자가 직접 예외명과 예외코드를 정의해 사용

● 사용자 예외 정의

사용자 _ 정의 _ 예외명 EXCEPTION;

● 사용자 예외 발생 시키기

RAISE 사용자 _ 정의 _ 예외명 ;

● 발생된 예외 처리

EXCEPTION WHEN 사용자 _ 정의 _ 예외명 THEN ….

Page 11: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

사용자 정의 예외

예외처리

● 사용자 정의 예외처리 예제

DECLARE vn_cnt NUMBER := 0; ex_invalid_depid EXCEPTION; -- 잘못된 부서번호일 경우 예외 선언

BEGIN -- 부서테이블에서 해당 부서번호 존재유무 체크 SELECT COUNT(*) INTO vn_cnt FROM departments WHERE department_id = 999999999999999;

IF vn_cnt = 0 THEN RAISE ex_invalid_depid; -- 사용자 정의 예외를 의도적으로 발생시킴 END IF;

EXCEPTION WHEN ex_invalid_depid THEN -- 사용자 정의 예외 처리 DBMS_OUTPUT.PUT_LINE(' 해당 부서번호가 없습니다 '); END;

Page 12: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

시스템 예외에 이름 부여하기

예외처리

● 사용자 예외 정의

사용자 _ 정의 _ 예외명 EXCEPTION;

● 사용자 정의 예외명과 시스템 예외 코드 연결

PRAGMA EXCEPTION_INIT ( 사용자 _ 정의 _ 예외명 , 시스템 _ 예외 _ 코드 );

● 발생된 예외 처리

EXCEPTION WHEN 사용자 _ 정의 _ 예외명 THEN ….

Page 13: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

01

시스템 예외에 이름 부여하기

예외처리

● 제한사항

ㆍ 미리 정의된 예외 중 NO_DATA_FOUND (-1403) 는 사용자 정의 예외명에 해당 코드 (-1403) 을 연결할 수 없다

ㆍ 예외 코드로 0 이나 100 을 제외한 양수 , 그리고 -10000000 이하 값은 사용할 수 없다 .

ㆍ 동일한 예외명으로 다른 예외코드를 2 개 이상 연결하면 , 맨 마지막에 연결한 코드가 적용된다 .

● RAISE 와 RAISE_APPLICATION_ERROR

ㆍ 예외코드와 원하는 예외 메시지를 직접 매개변수로 넘겨 예외를 발생시킴

ㆍ RAISE_APPLICATION_ERROR ( 예외코드 , 예외메시지 );

Page 14: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

02

트랜잭션이란 ?

트랜잭션

● 여러 가지 데이터 조작 후 오류가 발생하면 변경된 내역 전체를 원상태로 되돌리고 , 성공하면

변경된 내역 전체를 적용 .

● COMMIT

ㆍ INSERT, UPDATE, DELETE, MERGE 작업 성공 시 , 최종적으로 변경된 결과를 DB 에 반영

ㆍ COMMIT [WORK];

● ROLLBACK

ㆍ INSERT, UPDATE, DELETE, MERGE 작업 실패 시 , 변경 전 상태로 되돌린다

ㆍ ROLLBACK [WORK] [TO [SAVEPOINT] savepoint 명 ];

Page 15: 오라클 SQL과 PL/SQL을 다루는 기술 - 10장.예외처리와 트랜잭션

02

SAVEPOINT

트랜잭션

● ROLLBACK 시 특정 지점에서 트랜잭션을 취소시킬 수 있는데 , 이 지점을 SAVEPOINT 로 설정

● SAVEPOINT 세이브포인트명 ;

● ROLLBACK TO 세이브포인트명 ;

ㆍ 세이브포인트명 지점까지만 ROLLBACK

ㆍ INSERT, UPDATE, DELETE, MERGE 작업 실패 시 , 변경 전 상태로 되돌린다