Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Tìm hiểu cách xử lý ngoại lệ 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ỳ 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

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&nbsp; 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt thuộc tính kết nối ODBC mà không cần phải viết mã

  2. Xóa dấu vết mặc định - Phần 3

  3. Cờ theo dõi 2389 và Công cụ ước tính số lượng thẻ mới

  4. Tác động của phân mảnh đối với các kế hoạch thực thi

  5. Lỗ hổng Joomla SQL Injection