complete guide pl sql exception handling with examples
이 자습서에서는 PL SQL 예외 처리 및 예외 유형, 사용자 정의 및 시스템 정의 예외, 예외 발생 방법 등과 같은 관련 개념을 설명합니다.
에 PL / SQL 날짜 시간 형식 의 PL / SQL 시리즈 , 우리는 Datetime, Timestamp 및 Interval과 관련된 몇 가지 유용한 기능에 대해 배웠습니다.
이 기사에서는 PL SQL의 예외 처리에 대해 설명합니다. 또한 예외의 장점과이를 제기하는 방법을 살펴 보겠습니다.
배움부터 시작합시다 !!
학습 내용 :
PL SQL 예외 처리
오류 또는 경고 이벤트를 예외라고합니다. PL / SQL 프로그램의 런타임 실행 중에 발생합니다. PL / SQL에는 오류 조건에 대응하는 방법이 정의 된 EXCEPTION 코드 블록의 도움으로 이러한 예외적 인 조건을 처리하는 메커니즘이 있습니다.
두 가지 유형의 예외가 있습니다. 아래에 나열되어 있습니다.
- 사용자 정의 예외.
- 시스템 정의 예외.
인기있는 시스템 정의 예외 중 일부는 다음과 같습니다. 메모리 부족 과 0으로 나누기, 각각 STORAGE_ERROR 및 ZERO_DIVIDE와 같은 이름이 있습니다. 사용자 정의 예외는 패키지, 하위 프로그램 또는 PL / SQL 코드 블록의 선언 섹션 내에서 선언되며 이름을 할당해야합니다.
예외가 발생하면 자연스러운 실행 흐름이 중지되고 실행은 PL / SQL 코드의 예외 섹션을 가리 킵니다. 시스템 정의 예외는 기본적으로 throw되지만 사용자 정의 예외는 RAISE 키워드에 의해 명시 적으로 throw되어야합니다.
따라서 예외 처리는 프로그램을 컴파일하는 동안이 아니라 런타임 실행 중에 발생하는 오류를 처리하는 데 도움이됩니다.
예외 처리의 장점
장점은 다음과 같습니다.
- 코드에 예외 처리가 없으면 명령문을 실행할 때마다 실행 오류를 확인해야합니다.
- 코드에서 예외 처리를 피하면 실제 오류가 누락되어 다른 오류가 발생합니다.
- 예외 처리를 사용하면 코드에서 여러 확인을 건너 뛸 수 있습니다.
- 코드에서 오류 처리기를 분리하여 코드의 가독성을 높입니다.
예외 처리 구문 :
DECLARE <> BEGIN < > EXCEPTION <> WHEN excp1 THEN <> WHEN excp2 THEN <> ........ WHEN others THEN <> END;
기본 예외는 다음과 같이 수행됩니다. 다른 사람이 그때.
이름이 지정된 테이블을 고려해 보겠습니다. 시민 .
SELECT * FROM CITIZEN;
아래 주어진 SQL 문을 사용하여 CITIZEN 테이블을 만들었습니다.
CREATE TABLE CITIZEN ( ID INT NOT NULL, NAME VARCHAR (15) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID) );
아래에 제공된 SQL 문을 사용하여이 테이블에 값을 삽입합니다.
INSERT INTO CITIZEN VALUES (1, 'ZAKS', 14); INSERT INTO CITIZEN VALUES (8, 'RANNY', 75); INSERT INTO CITIZEN VALUES (5, 'TOM', 37);
예외 처리를 통한 코딩 구현 :
DECLARE citizen_id citizen.id%type; citizen_name citizen.name%type; citizen_age citizen.age%type := 9; BEGIN SELECT id, name INTO citizen_id, citizen_name FROM citizen WHERE age = citizen_age; DBMS_OUTPUT.PUT_LINE ('Citizen id is: '|| citizen_id); DBMS_OUTPUT.PUT_LINE ('Citizen name is: '|| citizen_name); EXCEPTION WHEN no_data_found THEN dbms_output.put_line ('No citizen detail found'); WHEN others THEN dbms_output.put_line ('Errors'); END; /
위 코드의 출력 :
위 코드에서는 CITIZEN 테이블에 9 세의 시민이 없기 때문에 런타임 예외가 발생합니다.
PL / SQL에서 예외 발생
개발자는 RAISE 키워드를 사용하여 명시 적으로 예외를 발생시킬 수 있습니다.
예외 발생 구문 :
DECLARE exception_n EXCEPTION; BEGIN IF condition THEN RAISE exception_n; END IF; EXCEPTION WHEN exception_n THEN <>; END;
여기서 exception_n은 우리가 발생시키는 예외의 이름입니다. 이러한 방식으로 사용자 정의 및 시스템 정의 예외를 모두 발생시킬 수 있습니다.
사용자 정의 예외
개발자는 자체 예외를 빌드하고이를 오류 처리에 사용할 수 있습니다. 하위 프로그램의 선언 부분에서 만들 수 있으며 해당 하위 프로그램 내에서만 액세스 할 수 있습니다.
패키지 수준에서 생성 된 예외는 패키지에 액세스 할 때마다 사용할 수 있습니다. 사용자 정의 예외는 RAISE 키워드를 사용하여 발생할 수 있습니다.
사용자 정의 오류의 구문은 다음과 같습니다.
최고의 무료 컴퓨터 클리너는 무엇입니까?
DECLARE exception_n EXCEPTION;
여기, exception_n 우리가 제기하는 예외의 이름입니다. 따라서 EXCEPTION 키워드 뒤에 이름을 지정하여 예외를 선언 할 수 있습니다. 예외는 변수가 선언되는 것과 유사한 방식으로 선언 될 수 있습니다. 그러나 예외는 데이터 항목이 아니라 예기치 않은 조건입니다.
PL / SQL의 예외 범위 :
PL / SQL 예외의 범위 규칙은 다음과 같습니다.
- 동일한 코드 블록에서 예외를 두 번 이상 선언 할 수 없습니다. 그러나 두 개의 다른 코드 블록에서 동일한 예외를 선언 할 수 있습니다.
- 코드 블록 내에서 선언 된 예외는 해당 블록 내에서 로컬이고 모든 하위 블록에 전역입니다.
- 하위 블록 내에서 전역 예외를 다시 선언하면 로컬 선언이 무시됩니다.
CITIZEN이라는 테이블을 다시 고려해 보겠습니다.
사용자 정의 예외가있는 코드 구현 :
DECLARE firstexception EXCEPTION; j NUMBER; BEGIN FOR j IN (SELECT * FROM CITIZEN) LOOP IF j.ID = 8 THEN RAISE firstexception; END IF; END LOOP; EXCEPTION WHEN firstexception THEN dbms_output.put_line ('Citizen with ID 8 already exist in table.'); END; /
위 코드의 출력 :
사전 정의 된 예외
데이터베이스 규칙을 위반하거나 시스템 종속 임계 값을 초과하면 내부 예외가 자동으로 발생합니다. 이러한 모든 오류에는 고유 번호가 있으며 모든 예외는 이름으로 정의됩니다. 예를 들면 PL / SQL은 SELECT 쿼리가 행을 가져 오지 않으면 사전 정의 된 NO_DATA_FOUND 예외를 발생시킵니다.
PL / SQL의 사전 정의 된 모든 예외는 PL / SQL 환경을 다루는 STANDARD 패키지에 선언되어 있습니다.
예외 | Oracle 오류 | SQL 코드 | 기술 |
---|---|---|---|
잘못된 번호 | 시간-01722 | -1722 | 이 예외는 문자열이 유효하지 않은 숫자를 나타내므로 문자열로의 변환이 전달되지 않는 경우 발생합니다. |
ACCESS_INTO_NULL | 지금-06530 | -6530 | 이 예외는 null 개체에 자연적으로 값이 할당되면 발생합니다. |
CASE_NOT_FOUND | 지금-06592 | -6592 | 이 예외는 WHEN 절의 옵션이 선택되지 않고 ELSE 절이없는 경우 발생합니다. |
COLLECTION_IS_NULL | 지금-06531 | -6531 | 이 예외는 코드가 EXISTS를 제외한 컬렉션 메서드를 초기화되지 않은 중첩 테이블 또는 varray에 적용하려고 할 때 발생합니다. 또한 코드가 초기화되지 않은 중첩 테이블 또는 varray에 값을 할당하려고하면 발생할 수 있습니다. |
DUP_VAL_ON_INDEX | 시간-00001 | -1 | 이 예외는 고유 인덱스에 의해 제한되는 열에 중복 값을 저장하려고하면 발생합니다. |
CURSOR_ALREADY_OPEN | 지금-06511 | -6511 | 이 예외는 코드가 이미 열려있는 커서를 열려고하면 발생합니다. |
INVALID_CURSOR | 시간-01001 | -1001 | 이 예외는 허용되지 않는 커서에 대해 일부 작업을 수행하려고하면 발생합니다. 예를 들어, 이미 닫힌 커서를 닫으려고합니다. |
LOGIN_DENIED | 시간-01017 | -1017 | 이 예외는 프로그램이 잘못된 사용자 이름과 암호를 사용하여 데이터베이스에 로그온을 시도하면 발생합니다. |
데이터가 없습니다 | 시간-01403 | 100 | 이 예외는 SELECT 쿼리가 행을 가져 오지 않으면 발생합니다. |
NOT_LOGGED_ON | 시간-01012 | -1012 | 연결하지 않고 데이터베이스 작업을 시도하면이 예외가 발생합니다. |
PROGRAM_ERROR | 시간-06501 | -6501 | PL / SQL 프로그램에 내부 오류가 발생한 경우이 예외가 발생합니다. |
ROWTYPE_MISMATCH | 시간-06504 | -6504 | 이 예외는 커서가 데이터 형식이 호환되지 않는 변수에 값을 반환하려고하면 발생합니다. |
SELF_IS_NULL | 지금-30625 | -30625 | 이 예외는 개체 형식을 초기화하지 않고 멤버 메서드를 호출하면 발생합니다. |
STORAGE_ERROR | 지금-06500 | -6500 | 이 예외는 PL / SQL 프로그램의 메모리가 부족하거나 실행 중에 메모리가 손상된 경우에 발생합니다. |
TOO_MANY_ROWS | 시간-01422 | -1422 | 이 예외는 SELECT 쿼리가 여러 행을 페치하는 경우 발생합니다. |
SUBSCRIPT_BEYOND_COUNT | 지금-06533 | -6533 | 이 예외는 아래 첨자가 컬렉션에있는 요소의 총 개수보다 많은 경우 발생합니다. |
SUBSCRIPT_OUTSIDE_LIMIT | 지금-06532 | -6532 | 이 예외는 아래 첨자가 임계 값 범위를 벗어난 경우 발생합니다. |
SYS_INVALID_ROWID | ORA-01410 | -1410 | 이 예외는 문자열이 유효하지 않은 행 ID를 나타내므로 범용 행 ID 로의 문자열 변환이 전달되지 않는 경우 발생합니다. |
TIMEOUT_ON_RESOURCE | ORA-00051 | -51 | Oracle이 리소스를 기다리는 경우이 예외가 발생합니다. |
VALUE_ERROR | ORA-06502 | -6502 | 이 예외는 프로그램에서 수학적, 변환, 잘림 오류가 발생하면 발생합니다. |
ZERO_DIVIDE | ORA-01476 | -1476 | 이 예외는 숫자를 0으로 나누려고하면 발생합니다. |
자주 묻는 질문과 답변
Q # 1) PL / SQL에서 사전 정의 된 예외 란 무엇입니까?
대답: 프로그램이 데이터베이스 규칙을 위반하는 경우 사전 정의 된 예외가 PL / SQL에 의해 자동으로 발생합니다.
Q # 2) PL / SQL 예외 처리 란 무엇이며 왜 필요한가요?
대답: 프로그램의 오류 또는 예기치 않은 이벤트를 예외라고합니다. 프로그램의 정상적인 실행 흐름을 중지합니다. PL / SQL에서 예외는 코드의 EXCEPTION 블록 내에서 처리되며 예외에 대한 적절한 조치는 해당 블록 내에서 설명됩니다.
Q # 3) 예외 처리 란 무엇입니까?
대답: 코드 실행 중 발생할 수있는 예기치 않은 이벤트에 대응하는 방법입니다.
Q # 4) 오류 처리의 두 가지 형태는 무엇입니까?
대답: 두 가지 형태의 오류 처리는 다음과 같습니다. 컴파일 타임 오류 과 런타임 에러 . 부적절한 데이터 또는 논리로 인해 프로그램 실행 중에 런타임 오류가 발생합니다. 컴파일 타임 오류는 코드를 컴파일하는 동안 포착됩니다.
Q # 5) 오류와 예외의 차이점은 무엇입니까?
대답: 예외는 try / catch 블록의 도움으로 처리되는 인시던트이며 프로그램 실행의 컴파일 타임과 런타임 모두에서 발생할 수 있습니다. 반면에 오류는 런타임에만 발생합니다.
결론
이 자습서에서는 프로그램의 예외를 관리하는 데 필수적인 PL / SQL의 몇 가지 기본 개념을 자세히 설명했습니다.
아래에 나열된 다음 주제를 다루었습니다.
- 예외.
- 예외 유형.
- 일부 사전 정의 된 예외.
다음 튜토리얼에서는 PL / SQL 트랜잭션, OOPS 개념 및 더 많은 관련 주제에 대해 논의 할 것입니다.
추천 도서
- 코드 예제가 포함 된 C # 예외 처리 자습서
- 예제를 사용한 Java 예외 및 예외 처리
- PL SQL 패키지 : Oracle PL / SQL 패키지 자습서 (예제 포함)
- C ++에서 예외 처리
- 예제가있는 초보자를위한 PL SQL 자습서 | PL / SQL이란?
- 예제가 포함 된 PL SQL 레코드 자습서