
Bài th c hành s 5ự ố
PL/SQL (2)
Tóm t t n i dung:ắ ộ
X lý ngo i lử ạ ệ
Procedure và Function
Cursor
Trigger
I. X lý ngo i lử ạ ệ
1. Gi i thi u v Exceptionớ ệ ề
Các Exception là các danh đnh trong PL/SQL mà có th g p ph i trongị ể ặ ả
khi th c thi m t kh i d n đn thân chính c a các tác v s b k t thúc. M t kh iự ộ ố ẫ ế ủ ụ ẽ ị ế ộ ố
luôn luôn k t thúc khi g p m t exception, nh ng có th ch ra m t exception handlerế ặ ộ ư ể ỉ ộ
đ thi hành tác v cu i cùng tr c khi kh i b k t thúc. N u exception đc ki mể ụ ố ướ ố ị ế ế ượ ể
soát (handled) thì exception s không truy n ra ngoài kh i hay ra môi tr ng. Haiẽ ề ố ườ
nhóm chính c a exception là :ủ
Predefined: đã đc đnh nghĩa tr c b i PL/SQL và dính v i cácượ ị ướ ớ ớ
mã l i xác đnhỗ ị
User-defined: khai báo trong kh i, ch th ng dùng khi có nhuố ỉ ườ
c u c th v i chúng, ngoài ra có th g n chúng v i các mã l i c n thi t.ầ ụ ể ớ ể ắ ớ ỗ ầ ế
Trong bài này, chúng ta s t p trung vào các exception đã đnh nghĩaẽ ậ ị
tr c:ướ
Tên Exception L i Oracleỗ
----------------------------- --------------------------
DUP_VAL_ON_INDEX -1
INVALID_CURSOR -1001
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

INVALID_NUMBER -1722
LOGIN_DINIED -1017
NO_DATA_FOUND -1403 (ANSI +100)
NOT_LOGGED_ON -1012
PROGRAM_ERROR -6501
STORAGE_ERROR -6500
TIMEOUT_ON_RESOURCE -51
TOO_MANY_ROWS -1422
VALUES_ERROR -6502
ZERO_DIVIDE -1476
CURSOR_ALREADY_OPEN -6511
TRANSACTION_BACKED_OUT -61
2. B ki m soát l iộ ể ỗ
N u m t exception x y ra, quy n đi u khi n s chuy n cho ph nế ộ ả ề ề ể ẽ ể ầ
EXCEPTION trong kh i mà nó x y ra. N u exception đó không ki m soát đc trongố ả ế ể ượ
ph n này ho c là không có ph n này thì kh i s k t thúc v i exception unhandled vàầ ặ ầ ố ẽ ế ớ
có th tác đng đn môi tr ng ngoài.ể ộ ế ườ
Ví d :ụ
BEGIN
INSERT INTO dept (deptno, dname)
VALUES (50, ’CLEANING’);
INSERT INTO dept (deptno, dname)
VALUES (50, ‘TRANING’);
-- Exception DUP_VAL_ON_INDEX xảy ra tại đây
END;
-- Khối sẽ kết thúc với exception unhandled ORA-00001
Đ b y các s ki n này và ch n các exception, có th đnh nghĩa cácể ẫ ự ệ ậ ể ị
exception handler trong ph n EXCEPTION.ầ
Cú pháp:
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

WHEN exceptionn-identifier THEN actions;
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

Ví d :ụ
DECLARE
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
BEGIN
SELECT ename, job
INTO v_name, v_job
FROM emp
WHERE hiredate BETWEEN ‘01/01/92’ AND ‘31/12/92’;
EXCEPTION
WHEN no_data_found THEN
INSERT INTO error_tab VALUES (‘Nobody in 92’);
WHEN too_many_rows THEN
INSERT INTO error_tab VALUES (‘More than one
person in 92’);
END;
B ki m soát l i ‘WHEN OTHERS’: có th dùng đnh nghĩa này độ ể ỗ ể ị ể
ch n t t c các exception còn l i ngoài các exception đã đnh nghĩa trong ph nặ ấ ả ạ ị ầ
EXCEPTION. Ph n này đc đt cu i cùng trong ph n EXCEPTION.ầ ượ ặ ố ầ
Ví d :ụ
BEGIN
SAVEPOINT so_far_so_good;
INSERT INTO statistics_tab VALUES (18, 25, 91);
EXCEPTION
WHEN dup_val_on_index THEN
ROLLBACK TO so_far_so_good;
WHEN OTHERS THEN
INSERT INTO error_tab
VALUES (‘Error during block’);
END;
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

3. Các hàm dùng trong b y l iẫ ỗ
Khi m t exception x y ra, ta có th xác đnh mã l i và câu chú c a nó.ộ ả ể ị ỗ ủ
PL/SQL cung c p 2 hàm:ấ
SQLCODE Tr v mã l i c a exception đó. N u dùng nó ngoài ph nả ề ỗ ủ ế ầ
EXCEPTION thì mã tr ra là 0ả
SQLERR
M
Tr v toàn b câu chú l i (error message) và có c mã l iả ề ộ ỗ ả ỗ
Ví d :ụ
DECLARE
error_message CHAR (100);
error_code NUMBER;
BEGIN
…
EXCEPTION
WHEN OTHERS THEN
error_message := SUBSTR (SQLERRM, 1, 100);
error_code := SQLCODE;
INSERT INTO error
VALUES (error_message, error_code);
END;
II. Procedure
Cú pháp:
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] datatype )]
{IS | AS}
BEGIN
procedure_body
END procedure_name;
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

