PL / SQL에서 예외를 처리하는 방법 알아보기



이 기사는 PL / SQL에서 제공하는 다양한 유형의 예외를 논의하여 PL / SQL에서 예외 처리를 수행하는 방법에 대한 포괄적 인 가이드입니다.

당신이 프로그래머라면 예외 처리의 개념에 익숙 할 것입니다. . 오류는 피할 수없고 우리 중 가장 똑똑한 사람도 코드를 작성하는 동안 실수를 할 수 있으므로이를 처리하는 방법을 알고 있어야합니다. 이 기사에서는 특히 PL / SQL의 예외 처리에 대해 알아 봅니다.

PL / SQL-Edureka의 SQL 예외 처리이 기사에서 다루는 주제는 다음과 같습니다.





예외 란 무엇입니까?

런타임에 프로그램 명령의 정상적인 흐름을 방해하는 비정상적인 조건이나 이벤트 또는 간단한 단어로 예외는 오류입니다.

PL / SQL의 예외 처리 구문

DECLARE BEGIN EXCEPTION WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........ WHEN others THEN exception3-handling-statements END

여기에서 처리하려는 예외를 나열 할 수 있습니다. 기본 예외는 'WHEN others THEN'을 사용하여 처리됩니다.



PL / SQL의 예외 처리 예

아래 프로그램은 ID가 부여 된 학생의 이름과 주소를 표시합니다. 데이터베이스에 ID 값이 8 인 학생이 없기 때문에 프로그램은 EXCEPTION 블록에 캡처 된 런타임 예외 NO_DATA_FOUND를 발생시킵니다.

DECLARE s_id studentS.id % type : = 8 s_name studentS.Name % type s_loc studentS.loc % type BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id DBMS_OUTPUT.PUT_LINE ( ​​'Name :'|| s_name) DBMS_OUTPUT .PUT_LINE ( ​​'Location :'|| s_loc) EXCEPTION WHEN no_data_found THEN dbms_output.put_line ( 'No such student!') WHEN others THEN dbms_output.put_line ( 'Oops, Error!') END

산출

그런 학생은 없습니다! PL / SQL 절차가 성공적으로 완료되었습니다.

여기에서 처리하려는 예외를 나열 할 수 있습니다. 기본 예외는‘ 다른 사람들이 그때 '

PL / SQL의 예외 유형

  • 시스템 정의
  • 사용자가 거부 함

예외 처리에 대한이 기사의 다음 PL / SQL ,이 두 유형에 대해 자세히 논의하겠습니다.



시스템 정의

Oracle 서버에 의해 암시 적으로 정의되고 유지되는 이러한 예외는 주로 Oracle Standard Package에 정의되어 있습니다. 프로그램 내에서 예외가 발생할 때마다 Oracle 서버는 Oracle 표준 패키지에서 사용 가능한 예외 집합에서 적절한 예외를 일치시키고 식별합니다. 기본적으로 이러한 예외는 PL / SQL 제기되는 특정 데이터베이스 규칙을 위반 한 경우 .

그만큼 시스템 정의 예외 두 가지 범주로 더 나뉩니다.

  • 명명 된 시스템 예외
  • 명명되지 않은 시스템 예외

명명 된 시스템 예외

명명 된 PL / SQL 예외는 다음과 같습니다. PL / SQL의 표준 패키지에 이름이 지정됨 따라서 개발자는 코드에서 PL / SQL 예외를 정의 할 필요가 없습니다. PL / SQL은 프로그램이 데이터베이스 규칙을 위반할 때 실행되는 미리 정의 된 명명 된 예외를 많이 제공합니다. 다음 표는 몇 가지 중요한 사전 정의 된 예외를 나열합니다.

예외 Oracle 오류 SQLCODE 기술
ACCESS_INTO_NULL06530-6530null 개체에 자동으로 값이 할당되면 발생합니다.
CASE_NOT_FOUND06592-6592의 WHEN 절에 선택 항목이 없을 때 발생합니다. CASE 문 선택되고 ELSE 절이 없습니다.
COLLECTION_IS_NULL06531-6531프로그램이 EXISTS 이외의 수집 메서드를 초기화되지 않은 중첩 테이블 또는 varray에 적용하려고 시도하거나 프로그램이 초기화되지 않은 중첩 테이블 또는 varray의 요소에 값을 할당하려고 할 때 발생합니다.
DUP_VAL_ON_INDEX00001-하나고유 인덱스가있는 열에 중복 값을 저장하려고하면 발생합니다.
INVALID_CURSOR01001-1001열리지 않은 커서를 닫는 것과 같이 허용되지 않는 커서 조작을 시도 할 때 발생합니다.
잘못된 번호01722-1722문자열이 유효한 숫자를 나타내지 않아 문자열을 숫자로 변환하지 못한 경우 발생합니다.
LOGIN_DENIED01017-1017프로그램이 잘못된 사용자 이름 또는 암호를 사용하여 데이터베이스에 로그온하려고 할 때 발생합니다.
데이터가 없습니다01403+100SELECT INTO 문이 행을 반환하지 않을 때 발생합니다.
NOT_LOGGED_ON01012-1012데이터베이스에 연결되지 않고 데이터베이스 호출이 발행 될 때 발생합니다.
PROGRAM_ERROR06501-6501PL / SQL에 내부 문제가있을 때 발생합니다.
ROWTYPE_MISMATCH06504-6504데이터 유형이 호환되지 않는 변수에서 커서가 값을 가져올 때 발생합니다.
SELF_IS_NULL30625-30625멤버 메서드가 호출되었지만 개체 형식의 인스턴스가 초기화되지 않았을 때 발생합니다.
STORAGE_ERROR06500-6500PL / SQL의 메모리가 부족하거나 메모리가 손상되었을 때 발생합니다.
TOO_MANY_ROWS01422-1422SELECT INTO 문이 둘 이상의 행을 반환 할 때 발생합니다.
VALUE_ERROR06502-6502산술, 변환, 자르기 또는 크기 제한 오류가 발생하면 발생합니다.
ZERO_DIVIDE014761476 년숫자를 0으로 나누려고 할 때 발생합니다.

CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id_in, student _name_in) EXCEPTION WHEN DUP_VAL_ON_IND'DUP_VAL_ON_IND'DUP_VAL_ON_IND'DUP_VAL_ON_IND ' ) WHEN OTHERS THEN raise_application_error (-20002, '오류가 발생했습니다.') END

PL / SQL의 예외 처리에 대한이 기사에서 이름이 지정되지 않은 시스템 예외가 무엇인지 이해하겠습니다.

명명되지 않은 시스템 예외

Oracle에 이름이없는 시스템 예외를 이름없는 시스템 예외라고합니다. 이러한 예외는 자주 발생하지 않으며 코드 및 관련 메시지와 함께 작성됩니다.

기본적으로 명명되지 않은 시스템 예외를 처리하는 두 가지 방법이 있습니다.

1. WHEN OTHERS 예외 처리기 사용

2. 예외 코드를 이름에 연결하고 명명 된 예외로 사용합니다.

이름이 지정되지 않은 시스템 예외에 대한 몇 가지 단계는 다음과 같습니다.

  • 암시 적으로 올립니다.
  • 'WHEN Others'에서 처리되지 않는 경우 명시 적으로 처리해야합니다.
  • 예외를 명시 적으로 처리하기 위해 Pragma EXCEPTION_INIT를 사용하여 선언하고 예외 섹션에서 사용자 정의 예외 이름을 참조하여 처리 할 수 ​​있습니다.

Pragma EXCEPTION_INIT를 사용하여 명명되지 않은 예외를 처리하는 예는 기사 뒷부분에서 제공됩니다. PL / SQL의 예외 처리에 대한이 기사에서 사용자 정의 예외를 이해하도록하겠습니다.

사용자 정의

다른 모든 프로그래밍 언어와 마찬가지로 Oracle은 광고 구현 자체 예외를 선언 할 수도 있습니다. 시스템 정의 예외와 달리 이러한 예외는 PL / SQL 블록에서 명시 적으로 발생합니다.

Oracle 데이터베이스에서 사용자 정의 예외를 선언하는 단계

Oracle 데이터베이스에서 다음 세 가지 방법으로 사용자 정의 예외를 정의 할 수 있습니다.

  • EXCEPTION 유형의 변수 사용

여기에서 EXCEPTION 변수를 선언하여 사용자 정의 예외를 선언 할 수 있습니다. 데이터 형식 코드에서 RAISE 문을 사용하여 프로그램에서 명시 적으로 올립니다.

  • PRAGMA EXCEPTION_INIT 함수 사용

EXCEPTION 데이터 유형의 변수로 미리 정의되지 않은 오류 번호를 정의 할 수 있습니다.

  • RAISE_APPLICATION_ERROR 메서드 사용

이 방법을 사용하면 사용자 정의 된 오류 번호와 메시지로 사용자 정의 예외를 선언 할 수 있습니다.

지금까지 PL / SQL에서 사용자 정의 예외를 발생시킬 수있는 방법에 대한 대략적인 아이디어를 얻었을 것입니다. PL / SQL의 예외 처리에 대한이 기사의 추가 예제를 통해 위에서 언급 한 각 방법에 대해 알아 보겠습니다.

이 기사의 다음으로 사용자 정의 예외 처리의 데모를 진행하겠습니다.

사용자 정의 예외 데모

PL / SQL의 예외 처리에 대한이 기사에서 EXCEPTION 유형의 변수를 사용하는 방법을 이해하겠습니다.

EXCEPTION 유형의 변수 사용

사용자 정의 예외를 선언하는 프로세스는 세 부분으로 나뉘며이 세 부분은 다음과 같습니다.

  • 변수 예외 데이터 유형 선언
  • 예외 제기
  • 예외 처리

위의 단계를 자세히 설명하는 코드를 작성해 보겠습니다.

DECLARE var_dividend NUMBER : = 10 var_divisor NUMBER : = 0 var_result NUMBER ex-DivZero EXCEPTION

위의 선언 블록에는 4 개의 변수가 있는데, 그중 처음 세 개는 일반 숫자 데이터 유형 변수이고, 네 번째는 ex_DivZero 인 특수 예외 데이터 유형 변수입니다. 네 번째는 사용자 정의 예외입니다.

DECLARE var_dividend NUMBER : = 10 var_divisor NUMBER : = 0 var_result NUMBER ex-DivZero EXCEPTION

이 익명 블록의 위 실행 부분은 제수가 0 일 때만 작동합니다. 우리의 경우와 같이 제수가 0이면 오류가 발생하고 프로그램의 제어는 모든 다음 단계를 건너 뜁니다. 일치하는 예외 처리기를 찾습니다. 다른 것을 찾은 경우 그에 따라 조치를 수행합니다. 그렇지 않으면 프로그램을 종료하거나 처리되지 않은 시스템 정의 오류를 표시합니다.

EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE (‘오류, 제수는 0 일 수 없습니다.’)

이것은 예외 처리기입니다. 사용자가 제수를 0으로 입력하면 위의 메시지 문자열이 프롬프트됩니다.

최종 코드 :

DECLARE var_dividend NUMBER : = 10 var_divisor NUMBER : = 0 var_result NUMBER ex-DivZero EXCEPTION BEGIN IF var_divisor = 0 THEN RAISE ex-DivZero END IF Var_result : = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ( ​​'Result ='|| var_result) BEGIN IF var_divisor ( 'Result ='|| var_result) = 0 THEN RAISE ex-DivZero END IF Var_result : = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ( ​​'Result ='|| var_result) END

PL / SQL의 예외 처리에 대한이 기사에서 PRAGMA_EXCEPTION_INIT 메서드를 사용하는 방법을 이해하겠습니다.

PRAGMA EXCEPTION_INIT 함수 사용

에서 PRAGMA EXCEPTION_INIT 함수, 예외 이름은 Oracle 오류 번호와 연결됩니다. 이 이름은 오류에 대한 예외 처리기를 디자인하는 데 사용할 수 있습니다.사용자 정의 오류가 많은 대규모 프로젝트의 경우 PRAGMA EXCEPTION_INIT가 가장 유용하고 적합한 방법입니다.

통사론:

PRAGMA EXCEPTION_INIT (예외 _ 이름, -Oracle_error_number)

DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL-ORA-00060 오류를 유발하는 일부 작업 EXCEPTION WHEN deadlock_detected THEN NULL-오류 처리 END

PRAGMA EXCEPTION_INIT는 앞에서 언급 한대로 예외 이름을 Oracle 오류 번호와 연결하도록 컴파일러에 지시합니다. 내부 예외를 이름으로 참조하고 이에 대한 특정 처리기를 작성할 수 있습니다. 오류 스택 또는 일련의 오류 메시지가 표시되면 맨 위에있는 것이 트랩 및 처리 될 수있는 것입니다.

PL / SQL의 예외 처리에 대한이 기사에서 RAISE_APPLICATION_ERROR 메서드를 사용하는 방법을 이해하겠습니다.

RAISE_APPLICATION_ERROR 메서드 사용

오라클 소프트웨어에 내장 된 절차입니다. 이 절차를 사용하여 오류 번호를 사용자 지정 오류 메시지와 연결할 수 있습니다. 오류 번호와 사용자 지정 오류 메시지를 모두 결합하여 오류가 발생했을 때 Oracle에서 표시하는 기본 오류 문자열과 유사한 오류 문자열을 구성 할 수 있습니다. RAISE_APPLICATION_ERROR 프로 시저가 DBMS_STANDARD 패키지 내에 있습니다.

통사론

raise_application_error (오류 _ 번호, 메시지 [, TRUE])

/ * 트리거 trg_emp_detail_chk가 생성됩니다. * / CREATE OR REPLACE TRIGGER trg_emp_detail_chk / * 트리거 타이밍은 EMPLOYEES 테이블에서 BEFORE UPDATE로 선언됩니다. * / Before UPDATE ON 직원 DECLARE permission_denied EXCEPTION BEGIN / * IF 조건 시작 여부 확인 시스템 시간의 요일이 토요일 또는 일요일이거나 아닙니다. * / IF trim (TO_CHAR (sysdate, 'Day')) IN ( 'Saturday', 'Sunday') THEN raise_application_error (-20000, '할 권한이 없습니다. 주말에 수정 !! ') / * raise_application_error 프로시 저는 첫 번째 매개 변수 값이 -20000이고 두 번째 매개 변수는 사용자가 주말에 수정을 수행 할 권한이 없음을 나타내는 기본 텍스트로 호출됩니다. * / END IF END

이것으로 'PL / SQL의 예외 처리'에 대한이 기사의 마지막 부분입니다. 이 주제가 잘 이해되어 도움이 되었기를 바랍니다. 자신의 코드를 작성하고이 기사에서 설명하는 방법을 통합하십시오.

자바 스크립트의 이벤트는 무엇입니까

이 기술에 대한 전문가로부터 교육을 받고 싶다면 edureka에서 구조화 된 교육을 선택할 수 있습니다! 이것을 확인하십시오 전 세계에 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 이 과정은 데이터를 관리하고 MySQL 데이터베이스를 관리하기위한 핵심 개념과 고급 도구 및 기술에 대해 교육합니다. 여기에는 MySQL Workbench, MySQL Server, 데이터 모델링, MySQL 커넥터, 데이터베이스 설계, MySQL 명령 줄, MySQL 함수 등과 같은 개념에 대한 실습 학습이 포함됩니다. 교육이 끝나면 자신의 MySQL 데이터베이스를 만들고 관리하고 관리 할 수 ​​있습니다. 데이터.

질문이 있으십니까? 이 'PL / SQL의 예외 처리'기사의 주석 섹션에 언급 해 주시면 가능한 한 빨리 연락 드리겠습니다.