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. Các lỗi này sẽ không được ghi lại tại thời điểm biên dịch và do đó chúng cần được xử lý chỉ tại thời điểm 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ẽ ném nó như một ngoại lệ. Ngoại lệ chỉ được đưa ra tại thời điểm 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 như vậy, chúng cần được nắm bắt và xử lý riêng biệt. 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 tại thời điểm chạy.
Trong hướng dẫn này, bạn sẽ học các chủ đề sau-
- Cú pháp xử lý ngoại lệ
- Các loại ngoại lệ
- Các ngoại lệ được xác định trước
- Ngoại lệ do người dùng xác định
- PL / SQL Raise Exception
- Các điểm quan trọng cần lưu ý trong Ngoại lệ
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 nếu 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 đó. Sau đó, ngoại lệ 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ệ.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN 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âng lên 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 cho ngoại lệ đã được nêu ra, thì công cụ PL / SQL sẽ thực thi phần 'KHI NGƯỜI KHÁC' (nếu có). Điều này là phổ biến cho tất cả các trường hợp ngoại lệ.
- Sau khi thực hiện ngoại lệ, điều khiển một phần sẽ đi 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ẽ đi ra khỏi khối hiện tại.
Lưu ý: KHI NÀO KHÁC phải luôn ở vị trí cuối cùng của dãy số. 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 hiện WHEN OTHERS.
Các loại ngoại lệ
Có hai loại Ngoại lệ trong Pl / SQL.
- Các ngoại lệ được xác định trước
- Ngoại lệ do người dùng xác định
Các ngoại lệ được xác định trước
Oracle đã xác định trước một số ngoại lệ phổ biến. Các ngoại lệ này có một tên ngoại lệ duy nhất và số lỗi. Những ngoại lệ này đã được định nghĩa trong gói 'TIÊU CHUẨN' trong Oracle. Trong mã, chúng ta có thể sử dụng trực tiếp 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 một giá trị cho các thuộc tính của các đố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 thỏa mãn và không có mệnh đề 'ELSE' nào được chỉ định |
COLLECTION_IS_NULL | ORA-06531 | Sử dụng các phương pháp thu thập (ngoại trừ EXISTS) hoặc truy cập các thuộc tính của bộ sưu tập trên một 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ữ giá trị trùng lặp trong cột cơ sở dữ liệu bị hạn chế bởi chỉ mục duy nhất |
INVALID_CURSOR | ORA-01001 | Các hoạt động con trỏ bất hợp pháp như đóng một con trỏ chưa mở |
INVALID_NUMBER | ORA-01722 | Chuyển đổi ký tự thành một 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' có 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ế |
SUBSCRIPT_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 | Giới thiệu bộ sưu tập theo số chỉ mục nằm ngoài phạm vi hợp pháp (ví dụ: -1) |
TOO_MANY_ROWS | ORA-01422 | Khi câu lệnh 'SELECT' với mệnh đề INTO trả về nhiều hơn một hàng |
VALUE_ERROR | ORA-06502 | Lỗi giới hạn 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
Trong 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 họ 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. Các 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 cứ nơi nào mà gói có thể truy cập được. <
Cú pháp: Ở cấp chương trình con
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Trong cú pháp trên, biến 'exception_name' được định nghĩa là kiểu '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 điểm kỹ thuật gói
CREATE PACKAGEIS EXCEPTION;… END ;
- Trong cú pháp trên, biến 'exception_name' được định nghĩa là kiểu '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 có thể gọi gói 'package_name'.
PL / SQL Raise Exception
Tất cả các ngoại lệ được xác định trước được nêu lên một cách ngầm định 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 được nêu ra một cách 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 bên dưới.
Nếu 'RAISE' được sử dụng riêng biệt trong chương trình, thì nó sẽ truyền ngoại lệ đã được nâng lên cho khối mẹ. Chỉ trong khối ngoại lệ có thể được sử dụng như hình dưới đây.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN 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à sẽ hoàn thành bình thường
- Nhưng từ khóa 'RAISE' trong phần xử lý ngoại lệ sẽ phổ biến ngoại lệ cụ thể này cho chương trình mẹ.
Lưu ý: Trong khi tăng ngoại lệ cho khối mẹ, ngoại lệ đang được nâng lên cũng phải hiển thị ở khối mẹ, nếu không 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ệ để nâng cao 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ệ để nâng cao ngoại lệ.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN 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ệ "tên_chỉ_lệ".
- Điều này sẽ làm tăng 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âng cao hơn nữa.
Ví dụ 1 : Trong ví dụ này, chúng ta sẽ thấy
- Cách khai báo ngoại lệ
- Cách tăng ngoại lệ đã khai báo và
- Cách truyền nó đến khối chính
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN 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à kiểu 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: Nâng cao 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ệ bị bắt trong khối lồng nhau. Đang nâng lên khối chính '.
- Dòng mã 12: Nâng cao ngoại lệ cho khối chính (lan truyền đến 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 "Đang gọi khối lồng nhau".
- Dòng mã 17: Gọi thủ tục nested_block.
- Dòng mã 19: 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ệ bị bắt trong khối chính."
Các đ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. nếu không Oracle sẽ ném ra lỗi 'Hàm được trả về không có giá trị' tại thời điểm chạy.
- Các câu lệnh 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 tích hợp sẵn sẽ đưa ra 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ẽ được khôi phục.
- RAISE_APPLICATION_ERROR (-
, ) có thể được sử dụng thay vì RAISE để tăng 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óm lược
Sau chương này. bạn sẽ có thể làm việc cho các khía cạnh sau của ngoại lệ Pl SQL
- Xử lý các ngoại lệ
- Xác định một ngoại lệ
- Nâng cao ngoại lệ
- Sự truyền bá ngoại lệ