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ệ.
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.
- Ngoại lệ được xác định trước
- 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.
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ệ.
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
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ệ