Thứ Tư, 26 tháng 10, 2022

PL / SQL - Ngoại lệ (Exceptions)

Trong chương này, chúng ta sẽ thảo luận về các Ngoại lệ trong . Một ngoại lệ là một điều kiện lỗi trong quá trình thực thi chương trình.  hỗ trợ lập trình viên nắm bắt các điều kiện như vậy bằng cách sử dụng khối EXCEPTION trong chương trình và một hành động thích hợp được thực hiện đối với điều kiện lỗi. Có hai loại ngoại lệ -

  • Các ngoại lệ do hệ thống xác định

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

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

Cú pháp chung để xử lý ngoại lệ như sau. Tại đây, bạn có thể liệt kê bao nhiêu trường hợp ngoại lệ mà bạn có thể xử lý. Ngoại lệ mặc định sẽ được xử lý bằng cách sử dụng WHEN others THEN -

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;

Thí dụ

Hãy để chúng tôi viết một đoạn mã để minh họa khái niệm này. Chúng tôi sẽ sử dụng bảng CUSTOMERS mà chúng tôi đã tạo và sử dụng trong các chương trước -

DECLARE 

   c_id customers.id%type := 8; 

   c_name customerS.Name%type; 

   c_addr customers.address%type; 

BEGIN 

   SELECT  name, address INTO  c_name, c_addr 

   FROM customers 

   WHERE id = c_id;  

   DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name); 

   DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 


EXCEPTION 

   WHEN no_data_found THEN 

      dbms_output.put_line('No such customer!'); 

   WHEN others THEN 

      dbms_output.put_line('Error!'); 

END; 

/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

No such customer!  


PL/SQL procedure successfully completed. 


Chương trình trên hiển thị tên và địa chỉ của khách hàng có ID được cung cấp. Vì không có khách hàng 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 , được ghi lại trong khối EXCEPTION .

Nâng cao ngoại lệ

Các ngoại lệ được máy chủ cơ sở dữ liệu tự động nâng lên bất cứ khi nào có bất kỳ lỗi cơ sở dữ liệu nội bộ nào, nhưng lập trình viên có thể nêu ra các ngoại lệ một cách rõ ràng bằng cách sử dụng lệnh RAISE . Sau đây là cú pháp đơn giản để tăng một ngoại lệ:

DECLARE 

   exception_name EXCEPTION; 

BEGIN 

   IF condition THEN 

      RAISE exception_name; 

   END IF; 

EXCEPTION 

   WHEN exception_name THEN 

   statement; 

END;

Bạn có thể sử dụng cú pháp trên để nâng cao ngoại lệ tiêu chuẩn Oracle hoặc bất kỳ ngoại lệ nào do người dùng xác định. Trong phần tiếp theo, chúng tôi sẽ cung cấp cho bạn một ví dụ về việc nâng cao một ngoại lệ do người dùng xác định. Bạn có thể nâng cao các ngoại lệ tiêu chuẩn Oracle theo cách tương tự.

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

 cho phép bạn xác định các ngoại lệ của riêng mình theo nhu cầu của chương trình của bạn. Một ngoại lệ do người dùng xác định phải được khai báo và sau đó được nêu ra một cách rõ ràng, sử dụng câu lệnh RAISE hoặc thủ tục DBMS_STANDARD.RAISE_APPLICATION_ERROR .

Cú pháp để khai báo một ngoại lệ là:

DECLARE 

   my-exception EXCEPTION; 


Thí dụ

Ví dụ sau minh họa khái niệm. Chương trình này yêu cầu một ID khách hàng, khi người dùng nhập một ID không hợp lệ, thì ngoại lệ valid_id sẽ được nâng lên.

DECLARE 

   c_id customers.id%type := &cc_id; 

   c_name customerS.Name%type; 

   c_addr customers.address%type;  

   -- user defined exception 

   ex_invalid_id  EXCEPTION; 

BEGIN 

   IF c_id <= 0 THEN 

      RAISE ex_invalid_id; 

   ELSE 

      SELECT  name, address INTO  c_name, c_addr 

      FROM customers 

      WHERE id = c_id;

      DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name);  

      DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 

   END IF; 


EXCEPTION 

   WHEN ex_invalid_id THEN 

      dbms_output.put_line('ID must be greater than zero!'); 

   WHEN no_data_found THEN 

      dbms_output.put_line('No such customer!'); 

   WHEN others THEN 

      dbms_output.put_line('Error!');  

END; 

/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Enter value for cc_id: -6 (let's enter a value -6) 

old  2: c_id customers.id%type := &cc_id; 

new  2: c_id customers.id%type := -6; 

ID must be greater than zero! 

 

PL/SQL procedure successfully completed. 


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

 cung cấp nhiều ngoại lệ đượ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. Ví dụ, ngoại lệ được xác định trước NO_DATA_FOUND được đưa ra khi câu lệnh SELECT INTO trả về không có hàng nào. 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:

Ngoại lệ

Lỗi Oracle

SQLCODE

Sự mô tả

ACCESS_INTO_NULL

06530

-6530

Nó được nâng lên khi một đối tượng null được tự động 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 nâng lên 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ó được nâng 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 việc chuyển đổi một chuỗi ký tự thành một số không thành công vì chuỗi không đại diện cho một số hợp lệ.

ĐĂNG NHẬP BỊ TỪ CHỐI

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ệ.

KHÔNG TÌM THẤY DỮ LIỆU NÀO

01403

+100

Nó được nâng lên khi một 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 nêu ra khi  có vấn đề nội bộ.

ROWTYPE_MISMATCH

06504

-6504

Nó được nâng lên khi một 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 thể hiệ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  hết bộ nhớ hoặc bộ nhớ bị hỏng.

TOO_MANY_ROWS

01422

-1422

Nó được nâng lên khi một 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 sizeconstraint.

ZERO_DIVIDE

01476

1476

Nó được nâng lên khi cố gắng chia một số cho không.


=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
Pl/SQL, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master