Xử lý ngoại lệ trong Oracle PL/SQL (Ví dụ)

Xử lý ngoại lệ trong PL/SQL là gì?

Một ngoại lệ xảy ra khi công cụ PL/SQL gặp một lệnh mà nó không thể thực thi do lỗi xảy ra trong thời gian chạy. Những lỗi này sẽ không được ghi lại tại thời điểm biên dịch và do đó những lỗi này chỉ cần được xử lý trong thời gian chạy.

Ví dụ: nếu công cụ PL/SQL nhận được lệnh chia bất kỳ số nào cho '0' thì công cụ PL/SQL sẽ đưa ra lệnh đó như một ngoại lệ. Ngoại lệ chỉ được đưa ra trong thời gian chạy bởi công cụ PL/SQL.

Các ngoại lệ sẽ ngăn chương trình thực thi thêm, vì vậy để tránh tình trạng đó, chúng cần được ghi lại và xử lý riêng. Quá trình này được gọi là Xử lý ngoại lệ, trong đó lập trình viên xử lý ngoại lệ có thể xảy ra trong thời gian chạy.

Cú pháp xử lý ngoại lệ

Các ngoại lệ được xử lý ở khối, cấp độ, tức là, một khi có bất kỳ ngoại lệ nào xảy ra trong bất kỳ khối nào thì điều khiển sẽ thoát ra khỏi phần thực thi của khối đó. Ngoại lệ sau đó sẽ được xử lý tại phần xử lý ngoại lệ của khối đó. Sau khi xử lý ngoại lệ, không thể gửi lại điều khiển trở lại phần thực thi của khối đó.

Cú pháp dưới đây giải thích cách bắt và xử lý ngoại lệ.

Xử lý ngoại lệ trong PL/SQL

BEGIN
<execution block>
.
.
EXCEPTION
WHEN <exceptionl_name>
THEN
  <Exception handling code for the “exception 1 _name’' >
WHEN OTHERS
THEN
  <Default exception handling code for all exceptions >
END;

Giải thích cú pháp:

  • Trong cú pháp trên, khối xử lý ngoại lệ chứa chuỗi điều kiện WHEN để xử lý ngoại lệ.
  • Mỗi điều kiện WHEN được theo sau bởi tên ngoại lệ dự kiến ​​sẽ được nêu ra trong thời gian chạy.
  • Khi bất kỳ ngoại lệ nào được đưa ra trong thời gian chạy, thì công cụ PL/SQL sẽ xem xét phần xử lý ngoại lệ cho ngoại lệ cụ thể đó. Nó sẽ bắt đầu từ mệnh đề 'WHEN' đầu tiên và tuần tự nó sẽ tìm kiếm.
  • Nếu nó tìm thấy cách xử lý ngoại lệ cho ngoại lệ đã được nêu ra thì nó sẽ thực thi phần mã xử lý cụ thể đó.
  • Nếu không có mệnh đề 'WHEN' nào xuất hiện cho ngoại lệ đã được nêu ra thì công cụ PL/SQL sẽ thực thi phần 'WHEN OTHERS' (nếu có). Điều này là phổ biến cho tất cả các ngoại lệ.
  • Sau khi thực hiện ngoại lệ, phần điều khiển sẽ thoát ra khỏi khối hiện tại.
  • Chỉ một phần ngoại lệ có thể được thực thi cho một khối trong thời gian chạy. Sau khi thực thi nó, bộ điều khiển sẽ bỏ qua phần xử lý ngoại lệ còn lại và sẽ thoát ra khỏi khối hiện tại.

Lưu ý: KHI KHÁC phải luôn ở vị trí cuối cùng của chuỗi. Phần xử lý ngoại lệ xuất hiện sau WHEN OTHERS sẽ không bao giờ được thực thi vì điều khiển sẽ thoát khỏi khối sau khi thực thi WHEN OTHERS.

Các loại ngoại lệ

Có hai loại Ngoại lệ trong Pl/SQL.

  1. Ngoại lệ được xác định trước
  2. Ngoại lệ do người dùng xác định

Ngoại lệ được xác định trước

Oracle đã xác định trước một số ngoại lệ phổ biến. Những ngoại lệ này có tên ngoại lệ và số lỗi duy nhất. Những ngoại lệ này đã được xác định trong gói 'TIÊU CHUẨN' trong Oracle. Trong mã, chúng ta có thể trực tiếp sử dụng tên ngoại lệ được xác định trước này để xử lý chúng.

Dưới đây là một số ngoại lệ được xác định trước

Ngoại lệ Mã lỗi Lý do ngoại lệ
ACCESS_INTO_NULL ORA-06530 Gán giá trị cho thuộc tính của đối tượng chưa được khởi tạo
CASE_NOT_FOUND ORA-06592 Không có mệnh đề 'WHEN' nào trong câu lệnh CASE được thỏa mãn và không có mệnh đề 'ELSE' nào được chỉ định
BỘ SƯU TẬP_IS_NULL ORA-06531 Sử dụng các phương thức thu thập (ngoại trừ EXISTS) hoặc truy cập các thuộc tính bộ sưu tập trên bộ sưu tập chưa được khởi tạo
CURSOR_ALREADY_OPEN ORA-06511 Đang cố gắng mở một con trỏ đã được mở
DUP_VAL_ON_INDEX ORA-00001 Lưu trữ một giá trị trùng lặp trong cột cơ sở dữ liệu bị ràng buộc bởi chỉ mục duy nhất
INVALID_CURSOR ORA-01001 Hoạt động con trỏ bất hợp pháp như đóng con trỏ chưa mở
INVALID_NUMBER ORA-01722 Chuyển đổi ký tự thành số không thành công do ký tự số không hợp lệ
KHÔNG TÌM THẤY DỮ LIỆU NÀO ORA-01403 Khi câu lệnh 'SELECT' chứa mệnh đề INTO không tìm nạp hàng nào.
ROW_MISMATCH ORA-06504 Khi kiểu dữ liệu biến con trỏ không tương thích với kiểu trả về con trỏ thực tế
ĐĂNG KÝ_BEYOND_COUNT ORA-06533 Giới thiệu bộ sưu tập theo số chỉ mục lớn hơn kích thước bộ sưu tập
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Tham chiếu bộ sưu tập theo số chỉ mục nằm ngoài phạm vi pháp lý (ví dụ: -1)
TOO_MANY_ROWS ORA-01422 Khi câu lệnh 'SELECT' có mệnh đề INTO trả về nhiều hàng
VALUE_ERROR ORA-06502 Lỗi hạn chế về số học hoặc kích thước (ví dụ: gán giá trị cho một biến lớn hơn kích thước biến)
ZERO_DIVIDE ORA-01476 Chia một số cho '0'

Ngoại lệ do người dùng xác định

In Oracle, ngoài các ngoại lệ được xác định trước ở trên, lập trình viên có thể tạo ngoại lệ của riêng mình và xử lý chúng. Chúng có thể được tạo ở cấp chương trình con trong phần khai báo. Những ngoại lệ này chỉ hiển thị trong chương trình con đó. Ngoại lệ được xác định trong đặc tả gói là ngoại lệ công khai và nó hiển thị ở bất kỳ nơi nào có thể truy cập gói.

Cú pháp: Ở cấp độ chương trình con

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • Trong cú pháp trên, biến 'Exception_name' được định nghĩa là loại 'EXCEPTION'.
  • Điều này có thể được sử dụng theo cách tương tự như một ngoại lệ được xác định trước.

Cú pháp:Ở cấp độ Đặc tả gói

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • Trong cú pháp trên, biến 'Exception_name' được định nghĩa là loại 'EXCEPTION' trong đặc tả gói của .
  • Điều này có thể được sử dụng trong cơ sở dữ liệu ở bất cứ nơi nào gói 'package_name' có thể được gọi.

PL/SQL Tăng ngoại lệ

Tất cả các ngoại lệ được xác định trước đều được ngầm nêu ra bất cứ khi nào lỗi xảy ra. Nhưng các ngoại lệ do người dùng xác định cần phải được nêu rõ ràng. Điều này có thể đạt được bằng cách sử dụng từ khóa 'RAISE'. Điều này có thể được sử dụng theo bất kỳ cách nào được đề cập dưới đây.

Nếu 'RAISE' được sử dụng riêng trong chương trình thì nó sẽ truyền ngoại lệ đã được nêu ra tới khối gốc. Chỉ trong khối ngoại lệ mới có thể được sử dụng như hiển thị bên dưới.

PL/SQL Tăng ngoại lệ

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Giải thích cú pháp:

  • Trong cú pháp trên, từ khóa RAISE được sử dụng trong khối xử lý ngoại lệ.
  • Bất cứ khi nào chương trình gặp ngoại lệ “Exception_name”, ngoại lệ đó sẽ được xử lý và hoàn thành bình thường
  • Nhưng từ khóa 'RAISE' trong phần xử lý ngoại lệ sẽ truyền bá ngoại lệ cụ thể này tới chương trình mẹ.

Lưu ý: Khi đưa ngoại lệ lên khối cha, ngoại lệ được đưa ra cũng phải hiển thị ở khối cha, nếu không thì Oracle sẽ báo lỗi.

  • Chúng ta có thể sử dụng từ khóa 'RAISE' theo sau là tên ngoại lệ để đưa ra ngoại lệ cụ thể do người dùng xác định/xác định trước đó. Điều này có thể được sử dụng trong cả phần thực thi và phần xử lý ngoại lệ để đưa ra ngoại lệ.

PL/SQL Tăng ngoại lệ

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

Giải thích cú pháp:

  • Trong cú pháp trên, từ khóa RAISE được sử dụng trong phần thực thi, theo sau là ngoại lệ “Exception_name”.
  • Điều này sẽ đưa ra ngoại lệ cụ thể này tại thời điểm thực thi và điều này cần được xử lý hoặc nêu lên thêm.

Ví dụ 1: Trong ví dụ này, chúng ta sẽ thấy

  • Cách khai báo ngoại lệ
  • Làm thế nào để nâng cao ngoại lệ được khai báo và
  • Làm thế nào để truyền nó vào khối chính

PL/SQL Tăng ngoại lệ

PL/SQL Tăng ngoại lệ

DECLARE
Sample_exception EXCEPTION;
PROCEDURE nested_block
IS
BEGIN
Dbms_output.put_line(‘Inside nested block’);
Dbms_output.put_line(‘Raising sample_exception from nested block’);
RAISE sample_exception;
EXCEPTION
WHEN sample_exception THEN 
Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’);
RAISE,
END;
BEGIN
Dbms_output.put_line(‘Inside main block’);
Dbms_output.put_line(‘Calling nested block’);
Nested_block;
EXCEPTION
WHEN sample_exception THEN	
Dbms_output.put_line (‘Exception captured in main block');
END:
/

Giải thích mã:

  • Dòng mã 2: Khai báo biến 'sample_Exception' là loại EXCEPTION.
  • Dòng mã 3: Khai báo thủ tục Nested_block.
  • Dòng mã 6: In câu lệnh “Bên trong khối lồng nhau”.
  • Dòng mã 7: In câu lệnh “Tăng sample_Exception từ khối lồng nhau.”
  • Dòng mã 8: Đưa ra ngoại lệ bằng cách sử dụng 'RAISE sample_Exception'.
  • Dòng mã 10: Trình xử lý ngoại lệ cho ngoại lệ sample_Exception trong khối lồng nhau.
  • Dòng mã 11: In câu lệnh 'Ngoại lệ được ghi lại trong khối lồng nhau. Nâng lên khối chính'.
  • Dòng mã 12: Đưa ngoại lệ lên khối chính (lan truyền tới khối chính).
  • Dòng mã 15: In câu lệnh “Bên trong khối chính”.
  • Dòng mã 16: In câu lệnh “Gọi khối lồng nhau”.
  • Dòng mã 17: Gọi thủ tục Nested_block.
  • Dòng mã 18: Ngoại lệ
  • Dòng mã 19: Trình xử lý ngoại lệ cho sample_Exception trong khối chính.
  • Dòng mã 20: In câu lệnh “Ngoại lệ được ghi lại trong khối chính.”

Những điểm quan trọng cần lưu ý trong Ngoại lệ

  • Trong hàm, một ngoại lệ phải luôn trả về giá trị hoặc nâng cao ngoại lệ hơn nữa. khác Oracle sẽ đưa ra lỗi 'Hàm được trả về không có giá trị' trong thời gian chạy.
  • Báo cáo kiểm soát giao dịch có thể được đưa ra tại khối xử lý ngoại lệ.
  • SQLERRM và SQLCODE là các hàm dựng sẵn sẽ cung cấp thông báo và mã ngoại lệ.
  • Nếu một ngoại lệ không được xử lý thì theo mặc định tất cả giao dịch đang hoạt động trong phiên đó sẽ bị khôi phục.
  • RAISE_APPLICATION_ERROR (- , ) có thể được sử dụng thay vì RAISE để đưa ra lỗi với mã người dùng và thông báo. Mã lỗi phải lớn hơn 20000 và có tiền tố là '-'.

Tổng kết

Sau chương này, bạn sẽ có thể làm việc cho các khía cạnh sau của Pl SQL trường hợp ngoại lệ

  • Xử lý các ngoại lệ
  • Xác định một ngoại lệ
  • Đưa ra ngoại lệ
  • Tuyên truyền ngoại lệ