Thứ Ba, 8 tháng 11, 2022

TRANSACT-SQL: XỬ LÝ LỖI VỚI TRY - CATCH - RAISEERROR

SQLServer Transact-SQL cung cấp cơ chế kiểm soát lỗi bằng TRY … CATCH như trong các ngôn ngữ lập trình phổ dụng hiện nay (Java, C, PHP). Bài viết này giới thiệu những vấn đề chung trong việc sử dụng TRY … CATCH cùng với hàm RAISEERROR để quản lý lỗi khi lập trình SQL trên SQL Server.

Ví dụ đơn giản về TRY … CATCH

Đầu tiên, ta xét một ví dụ phát sinh lỗi đơn giản sau:

Ví dụ về try ... catch ...

Sau khi thực thi câu lệnh, ta thu được kết quả:

Kết quả chạy try ... catch ...

Các hàm đọc thông tin lỗi

Dưới đây là một số hàm cung cấp thông tin về lỗi vừa phát sinh:

Các hàm xử lý lỗi

Sử dụng TRY … CATCH với TRANSACTION

Ta có thể sử dụng kết hợp TRY … CATCH với khối TRANSACTION. Bên trong khối TRANSACTION, các lệnh thao tác với dữ liệu được đặt trong một khối TRY để khi có bất cứ lỗi nào xảy ra, chương trình có thể bắt được và xử lý.

Trước tiên, ta chuyển vào làm việc trong CSDL tempdb:

Tạo dữ liệu minh họa

Sau khi thực hiện các lệnh trên, ta có bảng dữ liệu kết quả như sau:

Tạo dữ liệu minh họa

Sử dụng TRANSACTION để cập nhật một loạt dữ liệu:

Cập nhật dữ liệu trong một Transaction

Sau khi thực hiện xong, ta thử truy vấn lại bảng T1, kết quả truy vấn vẫn giống như trước khi thực hiện TRANSACTION (do TRANSACTION bị lỗi nên đã ROLLBACK toàn bộ):

Cập nhật dữ liệu trong một Transaction

Sử dụng TRY … CATCH với PROCEDURE

Trong ví dụ này, ta xây dựng Stored Procedure có sử dụng khối lệnh TRY … CATCH để bắt và xử lý lỗi. Xét 2 bảng A và B được tạo như sau:

Tạo bảng A

Kết quả thực thi lệnh tạo bảng A:

Kết quả thực thi lệnh tạo bảng A

Lệnh tạo bảng B:

Tạo bảng B

Kết quả thực thi lệnh tạo bảng B:

Kết quả thực thi lệnh tạo bảng B

Tạo STORED PROCEDURE xóa bản ghi trong A như sau:

Tạo STORED PROCEDURE xóa bản ghi trong A

Sử dụng STORED PROCEDURE này để xóa một bản ghi của A:

Sử dụng STORED PROCEDURE

Thông báo lỗi như sau:

Kết quả thực thi

Để có thể bắt và xử lý lỗi này ngay bên trong STORED PROCEDURE, ta cần sử dụng khối lệnh TRY … CATCH … Chỉnh sửa STORED PROCEDURE hiện tại để bổ sung TRY … CATCH:

Bổ sung thêm TRY ... CATCH vào Procedure

Gọi Procedure và bắt lỗi nếu có:

Gọi và bắt lỗi

Kết quả thực thi lệnh gọi thủ tục trên:

Kết quả thực thi

Muốn hiểu rõ giá trị các thông số Msg: 547, Level: 16, State: 0,… hãy đọc tiếp phần bài viết RAISEERROR ở bên dưới.

Sử dụng lệnh RAISEERROR để phát sinh lỗi

Xét bảng dữ liệu lưu danh sách sinh viên với dữ liệu mẫu như sau:

Tạo bảng dữ liệu minh họa

Và một STORED PROCEDURE có tên insertStudent dùng để chèn thêm Student mới vào bảng:

Tạo Procedure chèn thông tin sinh viên

Khi chèn dữ liệu, ta nhận thấy rằng mã sinh viên (trường rollno) phải có đúng 7 ký tự, ngoài ra tên của sinh viên (trường fullname) không được để rỗng. Trong trường hợp người dùng nhập sai dữ liệu, ta cần phát sinh thông báo lỗi để người dùng biết và nhập lại dữ liệu đúng. Khi đó, ta sử dụng câu lệnh RAISE ERROR như sau:

Tạo Procedure có sử dụng RaiseError

Lưu ý là giá trị SEVERITY phải lớn hơn 10 thì lệnh TRY … CATCH bên dưới đây mới bắt được lỗi:

Thực thi Procedure

Khi đó, ta nhận được thông báo lỗi:

Kết quả thực thi Procedure

Thông tin và cách sử dụng các thông số trong lời gọi RAISERROR tham khảo trong tài liệu MS SQLServer.

=============================
* 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

=============================
TRANSACT-SQL: XỬ LÝ LỖI VỚI TRY - CATCH - RAISEERROR, 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