12/08/2018, 17:15
Xử lí lỗi trong Oracle
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ề ...
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.
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;