Tìm hiểu cách xử lý ngoại lệ trong PL / SQL



Bài viết này là một hướng dẫn toàn diện về cách thực hiện xử lý ngoại lệ trong PL / SQL bằng cách thảo luận về các loại ngoại lệ khác nhau được cung cấp trong PL / SQL.

Nếu bạn là một lập trình viên, bạn có thể quen với khái niệm xử lý ngoại lệ là một phần không thể thiếu của bất kỳ . Vì lỗi là không thể tránh khỏi và ngay cả những người thông minh nhất trong chúng ta cũng có thể mắc lỗi trong khi viết mã, chúng ta phải làm quen với cách xử lý chúng. Trong bài này, chúng ta sẽ đặc biệt tìm hiểu về cách xử lý ngoại lệ trong PL / SQL.

Xử lý ngoại lệ SQL trong PL / SQL-EdurekaDưới đây là các chủ đề được đề cập trong bài viết này:





Ngoại lệ là gì?

Bất kỳ điều kiện hoặc sự kiện bất thường nào làm gián đoạn luồng thông thường của hướng dẫn chương trình của chúng tôi tại thời điểm chạy hoặc nói cách đơn giản là một ngoại lệ là lỗi.

Cú pháp xử lý ngoại lệ trong PL / SQL

DECLARE BẮT ĐẦU NGOẠI LỆ KHI ngoại lệ1 THÌ ngoại lệ1-câu lệnh xử lý-khi ngoại lệ2 THÌ ngoại lệ2-xử lý-câu lệnh KHI ngoại lệ3 THÌ ngoại lệ3-xử lý-câu lệnh ........ KHI những câu lệnh khác THEN ngoại lệ

Tại đây, chúng tôi có thể liệt kê nhiều trường hợp ngoại lệ mà chúng tôi muốn xử lý. Ngoại lệ mặc định sẽ được xử lý bằng cách sử dụng 'WHEN others THEN'



Ví dụ về xử lý ngoại lệ trong PL / SQL

Chương trình dưới đây hiển thị tên và địa chỉ của một sinh viên có ID được cung cấp. Vì không có sinh viên nào có giá trị ID 8 trong cơ sở dữ liệu của chúng tôi, chương trình tăng ngoại lệ thời gian chạy NO_DATA_FOUND, ngoại lệ này được ghi lại trong khối EXCEPTION.

DECLARE s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN CHỌN tên, loation INTO s_name, s_loc FROM sinh viên WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('Tên:' || s_name) DBMS_OUTPUT .PUT_LINE ('Vị trí:' || s_loc) NGOẠI LỆ KHI no_data_found THÌ dbms_output.put_line ('Không có sinh viên nào như vậy!') KHI những người khác THÌ dbms_output.put_line ('Rất tiếc, Lỗi!') HẾT

Đầu ra

Không có học sinh như vậy! Thủ tục PL / SQL đã hoàn tất thành công.

Tại đây, chúng tôi có thể liệt kê nhiều trường hợp ngoại lệ mà chúng tôi muốn xử lý. Ngoại lệ mặc định sẽ được xử lý bằng cách sử dụng ‘ KHI những người khác THÌ '

Các loại ngoại lệ trong PL / SQL

  • Hệ thống xác định
  • Người dùng bất chấp

Tiếp theo trong bài viết này về xử lý ngoại lệ trong PL / SQL , hãy để chúng tôi thảo luận chi tiết về cả hai loại này.



Hệ thống xác định

Được xác định và duy trì ngầm bởi máy chủ Oracle, các ngoại lệ này chủ yếu được định nghĩa trong Gói tiêu chuẩn của Oracle. Bất cứ khi nào ngoại lệ xảy ra bên trong chương trình, máy chủ Oracle sẽ khớp và xác định ngoại lệ thích hợp từ tập hợp các ngoại lệ có sẵn trong gói tiêu chuẩn oracle. Về cơ bản, những ngoại lệ này được xác định trước trong PL / SQL cái nào được nâng lên KHI quy tắc cơ sở dữ liệu cụ thể bị vi phạm .

Các Các ngoại lệ do hệ thống xác định được chia thành hai loại:

  • Hệ thống được đặt tên ngoại lệ
  • Hệ thống ngoại lệ không tên

Hệ thống được đặt tên Ngoại lệ

Các ngoại lệ PL / SQL được đặt tên là có tên trong gói tiêu chuẩn của PL / SQL , do đó nhà phát triển không cần xác định các ngoại lệ PL / SQL trong mã của họ. PL / SQL cung cấp nhiều ngoại lệ có tên được xác định trước, được thực thi khi bất kỳ quy tắc cơ sở dữ liệu nào bị chương trình vi phạm. Bảng sau liệt kê một số trường hợp ngoại lệ và trừ đi quan trọng được xác định trước

ngoại lệ Lỗi Oracle SQLCODE Sự miêu tả
ACCESS_INTO_NULL06530-6530Nó được nâng lên khi một đối tượng null được tự động gán một giá trị.
CASE_NOT_FOUND06592-6592Nó được đưa ra khi không có lựa chọn nào trong mệnh đề WHEN của Câu lệnh CASE được chọn và không có mệnh đề ELSE.
COLLECTION_IS_NULL06531-6531Nó được nâng lên khi một chương trình cố gắng áp dụng các phương thức thu thập khác với EXISTS cho một bảng hoặc varray lồng nhau chưa được khởi tạo hoặc chương trình cố gắng gán giá trị cho các phần tử của một bảng hoặc varray lồng nhau chưa được khởi tạo.
DUP_VAL_ON_INDEX00001-mộtNó được nâng lên khi các giá trị trùng lặp được cố gắng lưu trữ trong một cột có chỉ mục duy nhất.
INVALID_CURSOR01001-1001Nó được nâng lên khi cố gắng thực hiện một thao tác con trỏ không được phép, chẳng hạn như đóng một con trỏ chưa mở.
INVALID_NUMBER01722-1722Nó được nâng lên khi chuyển đổi một chuỗi ký tự thành một số không thành công vì chuỗi không đại diện cho một số hợp lệ.
ĐĂNG NHẬP BỊ TỪ CHỐI01017-1017Nó được nâng lên khi một chương trình cố gắng đăng nhập vào cơ sở dữ liệu bằng tên người dùng hoặc mật khẩu không hợp lệ.
KHÔNG TÌM THẤY DỮ LIỆU NÀO01403+100Nó được nâng lên khi câu lệnh SELECT INTO trả về không có hàng nào.
NOT_LOGGED_ON01012-1012Nó được nâng lên khi một lệnh gọi cơ sở dữ liệu được đưa ra mà không được kết nối với cơ sở dữ liệu.
PROGRAM_ERROR06501-6501Nó được nêu ra khi PL / SQL có vấn đề nội bộ.
ROWTYPE_MISMATCH06504-6504Nó được nâng lên khi một con trỏ tìm nạp giá trị trong một biến có kiểu dữ liệu không tương thích.
SELF_IS_NULL30625-30625Nó được đưa ra khi một phương thức thành viên được gọi, nhưng thể hiện của kiểu đối tượng không được khởi tạo.
STORAGE_ERROR06500-6500Nó được nâng lên khi PL / SQL hết bộ nhớ hoặc bộ nhớ bị hỏng.
TOO_MANY_ROWS01422-1422Nó được nâng lên khi một câu lệnh SELECT INTO trả về nhiều hơn một hàng.
VALUE_ERROR06502-6502Nó được nâng lên khi xảy ra lỗi số học, chuyển đổi, cắt bớt hoặc giới hạn kích thước.
ZERO_DIVIDE014761476Nó được nâng lên khi cố gắng chia một số cho không.

Thí dụ

TẠO HOẶC THAY THẾ THỦ TỤC add_new_student (sinh viên _id_in TRONG SỐ, sinh viên _name_in TRONG VARCHAR2) LÀ BẮT ĐẦU CHÈN VÀO sinh viên (sinh viên _id, sinh viên _name) GIÁ TRỊ (sinh viên _id_in, sinh viên _name_in) NGOẠI LỆ KHI DUP_VAL_ON_INDEX sau đó sinh viên tăng_dấp ) KHI NGƯỜI KHÁC THÌ raise_application_error (-20002, 'Đã xảy ra lỗi.') HẾT

Tiếp tục trong bài viết này về xử lý ngoại lệ trong PL / SQL, chúng ta hãy hiểu những ngoại lệ hệ thống không tên là gì.

Ngoại lệ hệ thống không tên

Các ngoại lệ hệ thống mà Oracle không có tên được gọi là các ngoại lệ hệ thống không tên. Những trường hợp ngoại lệ này không xảy ra thường xuyên và được viết bằng mã và thông báo liên quan.

Về cơ bản có hai cách để xử lý các ngoại lệ hệ thống không tên:

cái gì có thể thay đổi và bất biến

1. Sử dụng trình xử lý ngoại lệ WHEN OTHERS

2. Liên kết mã ngoại lệ với một tên và sử dụng nó như một ngoại lệ được đặt tên.

đi đến chức năng trong python

Một số bước sau đối với các trường hợp ngoại lệ hệ thống không tên là:

  • Nâng cao chúng một cách ngầm.
  • Trong trường hợp chúng không được xử lý trong ‘WHEN others’ thì chúng phải được xử lý rõ ràng.
  • Để xử lý ngoại lệ một cách rõ ràng, chúng có thể được khai báo bằng Pragma EXCEPTION_INIT và được xử lý bằng cách tham chiếu đến tên ngoại lệ do người dùng xác định trong phần ngoại lệ.

Một ví dụ về xử lý các ngoại lệ không có tên bằng Pragma EXCEPTION_INIT được cung cấp ở phần sau của bài viết. Tiếp tục trong bài viết này về xử lý ngoại lệ trong PL / SQL, chúng ta hãy hiểu các excetpions do người dùng định nghĩa.

Đã xác định người dùng

Giống như tất cả các ngôn ngữ lập trình khác, Oracle cũng cho phép bạn khai báo các trường hợp ngoại lệ của riêng bạn. Không giống như các ngoại lệ do Hệ thống xác định, các ngoại lệ này được nêu rõ ràng trong khối PL / SQL.

Các bước khai báo ngoại lệ do người dùng xác định trong cơ sở dữ liệu Oracle

Chúng ta có thể xác định các ngoại lệ do người dùng xác định trong cơ sở dữ liệu Oracle theo 3 cách sau:

  • Sử dụng biến loại EXCEPTION

Ở đây, chúng ta có thể khai báo một ngoại lệ do Người dùng định nghĩa bằng cách khai báo một biến EXCEPTION loại dữ liệu trong mã của chúng tôi và nâng cao nó một cách rõ ràng trong chương trình của chúng tôi bằng cách sử dụng câu lệnh RAISE.

  • Sử dụng hàm PRAGMA EXCEPTION_INIT

Chúng tôi có thể xác định một số lỗi không được xác định trước bằng biến của kiểu dữ liệu EXCEPTION

  • Sử dụng phương pháp RAISE_APPLICATION_ERROR

Sử dụng phương pháp này, chúng tôi có thể khai báo một ngoại lệ do Người dùng xác định với số lỗi và thông báo tùy chỉnh của riêng chúng tôi.

Cho đến bây giờ bạn có thể đã có một ý tưởng sơ bộ về các cách mà chúng tôi có thể nâng cao các ngoại lệ do Người dùng xác định trong PL / SQL. Chúng ta sẽ tìm hiểu về từng phương pháp được đề cập ở trên với các ví dụ thêm trong bài viết này về xử lý ngoại lệ trong PL / SQL.

Tiếp theo trong bài viết này, chúng ta hãy tiếp tục với các minh họa về xử lý ngoại lệ do Người dùng xác định.

Trình diễn các trường hợp ngoại lệ do người dùng xác định

Tiếp tục trong bài viết này về Xử lý ngoại lệ trong PL / SQL, chúng ta hãy hiểu cách sử dụng biến kiểu EXCEPTION.

Sử dụng biến loại EXCEPTION

Quá trình khai báo ngoại lệ do người dùng xác định được chia thành ba phần và 3 phần này là:

  • Khai báo một kiểu dữ liệu ngoại lệ biến
  • Nâng cao ngoại lệ
  • Xử lý ngoại lệ

Hãy viết mã để trình bày chi tiết các bước trên.

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

Trong khối khai báo trên, chúng ta có bốn biến, trong đó ba biến đầu tiên là biến kiểu dữ liệu số bình thường và biến thứ tư là ex_DivZero là biến kiểu dữ liệu ngoại lệ đặc biệt. Điều thứ tư là ngoại lệ do người dùng xác định của chúng tôi.

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

Phần thực thi ở trên của khối ẩn danh này, sẽ chỉ hoạt động khi số chia là 0. Nếu số chia là 0 như trong trường hợp của chúng tôi, lỗi sẽ xuất hiện và quyền kiểm soát của chương trình sẽ bỏ qua tất cả các bước tiếp theo và sẽ tìm kiếm trình xử lý ngoại lệ phù hợp. Trong trường hợp nó tìm thấy bất kỳ cái nào khác, nó sẽ thực hiện hành động tương ứng, nếu không nó sẽ chấm dứt chương trình hoặc nhắc chúng tôi với một lỗi do hệ thống xác định chưa được xử lý.

NGOẠI LỆ KHI ex_DivZero THÌ DBMS_OUTPUT.PUT_LINE (‘LỖI, Số chia không được bằng 0’)

Đây là trình xử lý ngoại lệ. Ngay sau khi người dùng nhập số chia là 0, chuỗi thông báo trên sẽ được nhắc.

Mã cuối cùng:

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero NGOẠI TRỪ BẮT ĐẦU NẾU var_divisor = 0 THEN RAISE ex-DivZero KẾT THÚC NẾU Var_result: = var_dividend / var_divisor var_divisor DBMS_OUTPUT.PUT_LINE ('Kết quả' = 0 THEN RAISE ex-DivZero KẾT THÚC NẾU Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Kết quả =' || var_result) HẾT

Tiếp tục trong bài viết này về xử lý ngoại lệ trong PL / SQL, hãy để chúng tôi hiểu cách sử dụng phương thức PRAGMA_EXCEPTION_INIT.

Sử dụng hàm PRAGMA EXCEPTION_INIT

bên trong Hàm PRAGMA EXCEPTION_INIT, một tên ngoại lệ được liên kết với số lỗi Oracle. Tên này có thể được sử dụng để thiết kế trình xử lý ngoại lệ cho lỗi.Đối với các dự án lớn với nhiều lỗi do người dùng xác định, PRAGMA EXCEPTION_INIT là phương pháp hữu ích và phù hợp nhất.

không gian tên trong c ++ là gì

Cú pháp:

PRAGMA EXCEPTION_INIT (tên_nguyên_lượng, -số_kinh_thể_năm)

Thí dụ

DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - Một số thao tác gây ra lỗi ORA-00060 NGOẠI TRỪ KHI deadlock_detected THEN NULL - xử lý lỗi HẾT

PRAGMA EXCEPTION_INIT yêu cầu trình biên dịch liên kết tên ngoại lệ với số lỗi Oracle như đã đề cập trước đó. Nó cho phép bạn tham chiếu đến bất kỳ ngoại lệ nội bộ nào theo tên và viết một trình xử lý cụ thể cho nó. Khi bạn nhìn thấy một ngăn xếp lỗi hoặc chuỗi thông báo lỗi, thông báo lỗi ở trên cùng là thông báo có thể được giữ lại và xử lý.

Tiếp tục trong bài viết này về Xử lý ngoại lệ trong PL / SQL, hãy để chúng tôi hiểu cách sử dụng phương thức RAISE_APPLICATION_ERROR.

Sử dụng phương pháp RAISE_APPLICATION_ERROR

Đó là một quy trình có sẵn với phần mềm oracle. Sử dụng quy trình này, chúng tôi có thể liên kết số lỗi với thông báo lỗi tùy chỉnh. Kết hợp cả số lỗi và thông báo lỗi tùy chỉnh, một chuỗi lỗi có thể được tạo ra trông tương tự như các chuỗi lỗi mặc định được oracle hiển thị khi gặp lỗi. Quy trình RAISE_APPLICATION_ERROR được tìm thấy bên trong gói DBMS_STANDARD

Cú pháp

raise_application_error (error_number, message [, TRUE])

Thí dụ

/ * Một trình kích hoạt trg_emp_detail_chk được tạo. * / TẠO HOẶC THAY THẾ TRIGGER trg_emp_detail_chk / * Thời gian kích hoạt được khai báo là TRƯỚC KHI CẬP NHẬT trên bảng NHÂN VIÊN. * / Trước khi CẬP NHẬT CHO nhân viên QUYẾT ĐỊNH quyền ngày của thời gian hệ thống là thứ bảy hoặc chủ nhật hoặc không. * / IF trim (TO_CHAR (sysdate, 'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error (-20000, 'Bạn không được phép làm bất kỳ sửa đổi nào vào cuối tuần !! ') / * Thủ tục raise_application_error được gọi với giá trị tham số đầu tiên là -20000 và tham số thứ hai với văn bản mặc định cho biết rằng người dùng không được phép thực hiện bất kỳ sửa đổi nào vào cuối tuần. * / KẾT THÚC NẾU KẾT THÚC

Với điều này, chúng ta kết thúc bài viết này về “Xử lý ngoại lệ trong PL / SQL”. Tôi hy vọng chủ đề này được hiểu rõ và giúp ích cho bạn. Cố gắng viết mã của riêng bạn và kết hợp các phương pháp được giải thích trong bài viết này.

Nếu bạn muốn được đào tạo từ các chuyên gia về công nghệ này, bạn có thể chọn đào tạo có cấu trúc từ edureka! Kiểm tra cái này của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa học này đào tạo bạn về các khái niệm cốt lõi, các công cụ và kỹ thuật nâng cao để quản lý dữ liệu và quản trị Cơ sở dữ liệu MySQL. Nó bao gồm học tập thực hành về các khái niệm như MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, Database Design, MySQL Command line, MySQL Functions, v.v. Kết thúc khóa đào tạo, bạn sẽ có thể tạo và quản trị Cơ sở dữ liệu MySQL của riêng mình và quản lý dữ liệu.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của bài viết “Xử lý ngoại lệ trong PL / SQL” này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.