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ỳ ngôn ngữ lập trình nào. 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 viết này, chúng ta sẽ đặc biệt tìm hiểu về cách xử lý ngoại lệ trong PL / SQL.
Dưới đây là các chủ đề được đề cập trong bài viết này:
- Ngoại lệ là gì?
- Cú pháp xử lý ngoại lệ
- Các loại Ngoại lệ
- Hệ thống đã xác định
- Các trường hợp ngoại lệ của hệ thống được đặt tên
- Các trường hợp ngoại lệ của hệ thống không được đặt tên
- Do người dùng xác định
- Các bước khai báo các hàm Do người dùng định nghĩa
- Ví dụ về các chức năng do Người dùng xác định
- Hệ thống đã xác định
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 một cách đơn giản là lỗi ngoại lệ.
Cú pháp xử lý ngoại lệ trong PL / SQL
DECLARE <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling goes here > 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;
Tại đây, chúng tôi có thể liệt kê ra 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 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;
Đầu ra
No such student! PL/SQL procedure successfully completed.
Tại đây, chúng tôi có thể liệt kê ra 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 '
Các loại ngoại lệ trong PL / SQL
- Hệ thống được 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, chúng ta hãy thảo luận chi tiết về cả hai kiểu này.
Hệ thống được xác định
Được xác định và duy trì ngầm bởi máy chủ Oracle, những ngoại lệ này chủ yếu được định nghĩa trong Gói Chuẩn của Oracle. Bất cứ khi nào một 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, các ngoại lệ này được xác định trước trong PL / SQL được nêu ra KHI quy tắc cơ sở dữ liệu cụ thể bị vi phạm .
Các trường hợp ngoại lệ do hệ thống xác định được chia thành hai loại:
- Các trường hợp ngoại lệ của hệ thống được đặt tên
- Các trường hợp ngoại lệ của hệ thống không được đặt tên
Hệ thống được đặt tên Ngoại lệ
Các ngoại lệ PL / SQL được đặt tên được đặt 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ệ quan trọng được xác định trước -
Exception | Lỗi Oracle | SQLCODE | Mô tả |
ACCESS_INTO_NULL | 06530 | -6530 | Nó được nâng lên khi một đối tượng null tự động được gán một giá trị. |
CASE_NOT_FOUND | 06592 | -6592 | Nó đượ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_NULL | 06531 | -6531 | Nó được đặt ra 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_INDEX | 00001 | -1 | Nó đượ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_CURSOR | 01001 | -1001 | Nó nổi 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_NUMBER | 01722 | -1722 | Nó được nâng lên khi chuyển đổi chuỗi ký tự thành số không thành công vì chuỗi không đại diện cho một số hợp lệ. |
LOGIN_DENIED | 01017 | -1017 | Nó đượ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ệ. |
NO_DATA_FOUND | 01403 | +100 | Nó được nâng lên khi câu lệnh SELECT INTO trả về không có hàng nào. |
NOT_LOGGED_ON | 01012 | -1012 | Nó đượ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_ERROR | 06501 | -6501 | Nó được đưa ra khi PL / SQL có sự cố nội bộ. |
ROWTYPE_MISMATCH | 06504 | -6504 | Nó được nâng lên khi 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_NULL | 30625 | -30625 | Nó được nâng lên khi một phương thức thành viên được gọi, nhưng phiên bản của kiểu đối tượng không được khởi tạo. |
STORAGE_ERROR | 06500 | -6500 | Nó được nâng lên khi PL / SQL hết bộ nhớ hoặc bộ nhớ bị hỏng. |
TOO_MANY_ROWS | 01422 | -1422 | Nó được nâng lên khi câu lệnh SELECT INTO trả về nhiều hơn một hàng. |
VALUE_ERROR | 06502 | -6502 | Nó đượ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_DIVIDE | 01476 | 1476 | Nó được nâng lên khi cố gắng chia một số cho không. |
Ví dụ
CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id, student _name ) VALUES ( student _id_in, student _name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,'Duplicate student _id'); WHEN OTHERS THEN raise_application_error (-20002,'An error occurred.'); END;
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 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:
1. Sử dụng trình xử lý ngoại lệ KHI NGƯỜI KHÁC
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.
Một số bước được thực hiện đối với các trường hợp ngoại lệ hệ thống không có tên là:
- Nâng cao chúng một cách ẩn ý.
- Trong trường hợp chúng không được xử lý trong "WHEN others" thì chúng phải được xử lý một cách 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 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, hãy để chúng tôi hiểu về excetpions do người dùng định nghĩa.
Do người dùng xác định
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 ra một cách 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
Tại đây, chúng ta có thể khai báo một ngoại lệ do Người dùng xác định bằng cách khai báo một biến kiểu dữ liệu EXCEPTION trong mã của chúng ta và nâng nó rõ ràng trong chương trình của chúng ta bằng câu lệnh RAISE.
- Sử dụng hàm PRAGMA EXCEPTION_INIT
Chúng tôi có thể xác định 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 thông báo và số lỗi tùy chỉnh của riêng chúng tôi.
Đến bây giờ bạn có thể đã biết sơ bộ về các cách mà chúng tôi có thể nêu ra 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 trình diễn 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, hãy để chúng tôi 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ệ có thể thay đổi
- Nâng cao trường hợp 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ẽ tăng lên và điều khiển 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 khắc phục.
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
Đâ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 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 =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); END;
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
Trong hàm PRAGMA EXCEPTION_INIT, 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 có 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.
Cú pháp:
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
Ví dụ
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN NULL; -- Some operation that causes an ORA-00060 error EXCEPTION WHEN deadlock_detected THEN NULL; -- handle the error END;
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 một chuỗi các 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
Đây là một quy trình có sẵn trong 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 | FALSE}]);
Ví dụ
/* A trigger trg_emp_detail_chk is created.*/ CREATE OR REPLACE TRIGGER trg_emp_detail_chk /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/ Before UPDATE ON employees DECLARE permission_denied EXCEPTION; BEGIN /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/ IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!'); /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter with a default text stating that the user is not authorized to do any modification in the weekends. */ END IF; END;
Với điều này, chúng ta sẽ 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! Hãy xem Chương trình đào tạo chứng chỉ MySQL DBA 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ê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ũng như 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 việc học 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ị và quản lý Cơ sở dữ liệu MySQL của riêng mình dữ liệu.
Bạn có câu hỏi cho chúng tôi? Vui lòng đề cập đến vấn đề này 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.