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