Xử lí lỗi trong Oracle
Bài đăng này đã không được cập nhật trong 6 năm
1. Lỗi ngoại lệ trong Oracle (Exception)
Giả sử ta có 1 table USERS(id, name, email).
Insert into Users
Values (1, 'NVA', 'a@gmail.com')
(2, 'NVB', 'b@gmail.com')
*Các lỗi ngoại lệ thường gặp:
- NO_DATA_FOUND: Kích hoạt khi một phát biếu SELECT INTO không thực hiện lời gọi hàm nhóm (SUM, COUNT, ...), không trả về bất kì dòng nào.
DECLARE
ename nvarchar(25);
BEGIN
SELECT name
INTO ename
WHERE email = 'a';
END;
> Lúc này exception NO_DATA_FOUND được kích hoạt vì SELECT INTO
không trả về bất cứ giá trị nào => lỗi
- TO_MANY_ROW: kích hoạt khi mệnh đề SELECT INTO trả về hơn một dòng( vì mệnh đề SELECT INTO chỉ trả về 1 dòng).
DECLARE
user users%ROWTYPE;
BEGIN
SELECT *
INTO ename;
END;
> Lúc này exception TO_MANY_ROW được kích hoạt vì SELECT INTO trả về 2 dòng dữ liệu => lỗi
- ZERO_DIVIDE: kích hoạt khi chương trình thực hiện phép chia cho 0.
- LOGIN_DENIED: kích hoạt khi một người dùng thử kết nối vào Oracle bằng tên người dùng và mật khấu không hợp lệ.
- PROGRAM_ERROR: một chương trình PL/SQL có lỗi bên trong.
- VALUE_ERROR: kích hoạt khi một lỗi về chuyển đổi kiểu hoặc lỗi đồng nhất về mặt kích thước xảy ra.
- DUP_VALUE_ON_INDEX: kích hoạt khi một chương trình đưa vào một giá trị trùng trong một cột hoặc các cột mà có chỉ mục duy nhất xây dựng nên các cột đó.
- OTHERS: tất cả các lỗi ngoại lệ của Oracle được định nghĩa trước có thể được xử lí bằng cách sử dụng trình xử lí Others.
2. Xử lí lỗi trong Oracle:
a. Sử dụng method "RAISE"
- Viết một procedure a/b:
CREATE OR REPLACE PROCEDURE sp_Test(a in number, b in number)
AS
result number(5, 2);
my_exception EXCEPTION;
BEGIN
IF b = 0 THEN
RAISE my_exception; // quăng ngoại lệ mẫu số = 0 vào biến my_exception
ELSE
result := a : b;
END IF;
EXCEPTION
WHEN my_exception THEN // trường hợp này là ZERO_DIVIDE
dbms_output.put_line('ZERO_DIVIDE'); // xuất lỗi ra màn hình
WHEN OTHERS // kết thúc xử lí lỗi = when others
dbms_output.put_line('Generic exception');
END;
*Note:
- Phải chạy lệnh "SET SERVEROUTPUT ON" trong SQL, lúc đó lệnh dbms_output.put_line mới có hiệu lực in text.
- Kiểu dữ liệu: number(5, 2) lấy tối đa 5 chữ số trước dấu phẩy, 2 chữ số sau dấu phẩy.
- Kí hiệu := được sử dụng như toán tử gán.
b. Sử dụng thủ tục(procedure): RAISE_APPLICATION_ERROR:
- Syntax:
raise_application_error(error_number, message [, {TRUE, FALSE}])
- Sử dụng: thường được sử ở hai vị trí khác nhau:
- Executable section.
- Exception section.
- Ví dụ:
DECLARE
e_name exception;
BEGIN
...
DELETE FROM employees
WHERE last_name = 'NTD';
IF SQL%NOTFOUND THEN
RAISE e_name; // executable section place
END IF;
EXCEPTION
// exception section place
When e_name THEN
Raise_application_error(-20999, 'This is invalid lastname');
END;
All rights reserved