- Thay DEPTNO của các nhân viên này bằng DEPTNO của Boston Thay lương mỗi nhân viên bằng lương trung bình của bộ phậ n * 1.1 Thay commission
14.1.TH TC Ụ
M t nhóm các l nh th c hi n ch c năng nào đó có th độ ệ ự ệ ứ ể ược gom l i trong m t th t c (procedure) nh mạ ộ ủ ụ ằ làm tăng kh năng x lý, kh năng s d ng chung, tăng tính b o m t và an toàn d li u, ti n ích trong phátả ử ả ử ụ ả ậ ữ ệ ệ tri n. ể
Th t c có th đủ ụ ể ượ ưc l u gi ngay trong database nh m t đ i tữ ư ộ ố ượng c a database, s n sàng cho vi c tái sủ ẵ ệ ử d ng. Th t c lúc này đụ ủ ụ ược g i là Store procedure. V i các Store procedure, ngay khi l u gi Storeọ ớ ư ữ procedure, chúng đã được biên d ch thành d ng p-code vì th có th nâng cao kh năng th c hi n. ị ạ ế ể ả ự ệ
14.1.1. T o th t c ạ ủ ụ
Ta có th t o th t c tr c ti p b ng dòng l nh sau: Cúể ạ ủ ụ ự ế ằ ệ pháp:
CREATE [OR REPLACE] PROCEDURE procedure_name [(argument1 [mode1] datatype1, argument2 [mode2] datatype2, ...)] IS | AS BEGIN PL/SQL Block; END; V i: ớ procedure_name Tên th t c ủ ụ
argument Tên tham s ố
mode Lo i tham s : IN ho c OUT ho c IN OUT, ạ ố ặ ặ
m c đ nh là IN ặ ị
datatype Ki u d li u c a tham s ể ữ ệ ủ ố
PL/SQL Block N i dung kh i l nh SQL và PL/SQL trong ộ ố ệ
th t c ủ ụ Ví d : ụ
CREATE OR REPLACE PROCEDURE change_sal (p_Percentage IN number,
p_Error OUT varchar2, ) IS v_User_exp Exception; BEGIN IF p_Percentage < 0 THEN RAISE v_User_exp; END IF; UPDATE emp
SET sal = sal*p_Percentage/100; EXCEPTION
WHEN v_User_exp THEN
p_Error := ‘L i: Ph n trăm nh h n 0’;ỗ ầ ỏ ơ
RETURN; WHEN others THEN
p_Error := ‘L i: ‘ || SQLERRM; ỗ
END;
V i vi c t o các th t c thông qua câu l nh, ta có th d dàng t o các script ch a các th t c c n thi t khiớ ệ ạ ủ ụ ệ ể ễ ạ ứ ủ ụ ầ ế t o m i m t database. ạ ớ ộ
M t cách khác, ta có th t o m i hay s a đ i th t c thông qua công c c a Oracle. Trong chộ ể ạ ớ ử ổ ủ ụ ụ ủ ương trước, ta đã bi t cách s d ng Procedure Builder đ t o m i th t c. ế ử ụ ể ạ ớ ủ ụ
14.1.2. Hu b th t c ỷ ỏ ủ ụ
Tương t nh vi c t o th t c, ta có th hu b th t c thông qua câu l nh SQL. Cú pháp: ự ư ệ ạ ủ ụ ể ỷ ỏ ủ ụ ệ
DROP PROCEDURE Tên th t c; ủ ụ Ví d : ụ
DROP PROCEDURE change_sal;
14.1.3. Các bướ ưc l u gi m t th t c ữ ộ ủ ụ
M t th t c trong Oracle độ ủ ụ ược th c hi n theo hai bự ệ ước chính sau:
1. N i dung c a th t c độ ủ ủ ụ ược thi t l p và l u gi trong database dế ậ ư ữ ưới d ng văn b n ạ ả (text)
2. Toàn b n i dung c a th t c độ ộ ủ ủ ụ ược biên d ch ra d ng mã p-code, ti n cho viêc th c ị ạ ệ ự hi n th t c đó. ệ ủ ụ
Hình v 13. Các bẽ ước th c hi n m t th t c ự ệ ộ ủ ụ
14.2.HÀM
Tương t nh th t c, hàm (function) cũng là nhóm các l nh PL/SQL th c hi n ch c năng nào đó. Khácự ư ủ ụ ệ ự ệ ứ v i th t c, các hàm s tr v m t giá tr ngay t i l i g i c a nó. ớ ủ ụ ẽ ả ề ộ ị ạ ờ ọ ủ
Oracle c b n - SQL và PL/SQL ơ ả
Hàm cũng có th để ượ ưc l u gi ngay trên database dữ ướ ại d ng Store procedure. 14.2.1. T o hàm ạ
Ta có th t o hàm tr c ti p b ng dòng l nh sau: Cúể ạ ự ế ằ ệ pháp:
CREATE [OR REPLACE] FUNCTION function_name
[(argument1 [mode1] datatype1, argument2 [mode2] datatype2, ...)] RETURN datatype IS | AS BEGIN PL/SQL Block; END; V i: ớ function_name Tên hàm argument Tên tham s ố
mode Lo i tham s : IN ho c OUT ho c IN OUT, ạ ố ặ ặ
m c đ nh là IN ặ ị
datatype Ki u d li u c a tham s ể ữ ệ ủ ố
PL/SQL Block N i dung kh i l nh SQL và PL/SQL trong ộ ố ệ
th t c ủ ụ Ví d : ụ
CREATE OR REPLACE FUNCTION get_sal (p_Emp_id IN number) RETURN varchar2 IS BEGIN SELECT sal FROM emp
WHERE emp_id = p_Emp_id; RETURN null;
EXCEPTION
WHEN others THEN
RETURN ‘L i: ‘ || SQLERRM; ỗ
END;
14.2.2. Th c hi n m t hàm ự ệ ộ
Quá trình l u gi và biên d ch m t hàm cũng tư ữ ị ộ ương t nh đ i v i m t th t c. Quá trìnhự ư ố ớ ộ ủ ụ g i và th c hi n m t hàm đọ ự ệ ộ ược di n ra theo ba bễ ước:
1. Vi c g i hàm đệ ọ ược th c hi n ngay khi tên hàm trong bi u th c đự ệ ể ứ ược tham chi u t i ế ớ 2. M t bi n host (host variable) độ ế ượ ự ộc t đ ng t o ra đ l u gi giá tr tr v c a hàm ạ ể ư ữ ị ả ề ủ 3. Th c hi n n i dung trong ph n thân hàm, l u l i giá tr ự ệ ộ ầ ư ạ ị
Ví d : ụ
SQL> VARIABLE v_Sal number;
SQL> EXECUTE :v_SAL := get_sal(7934); PL/SQL procedure successfully completed. SQL> PRINT v_Sal;
v_Sal 1300
14.2.3. L i ích c a vi c s d ng hàm ợ ủ ệ ử ụ
V i vi c s d ng hàm, trong m t s trớ ệ ử ụ ộ ố ường h p ta có th th y đợ ể ấ ược các l i đi m nh sau: ợ ể ư
Cho phép th c hi n các thao tác ph c t p (các phép tìm ki m, so sánh ph c t p) ự ệ ứ ạ ế ứ ạ ngay trong m nh đ c a câu l nh SQL mà n u không s d ng hàm ta s không th ệ ề ủ ệ ế ử ụ ẽ ể nào th c hi n đự ệ ược
Tăng tính đ c l p c a d li u do vi c phân tích và x lý d li u độ ậ ủ ữ ệ ệ ử ữ ệ ược th c hi n ngay ự ệ trên Server thay vì tr v d li u tr c ti p cho ng d ng dả ề ữ ệ ự ế ứ ụ ưới Client đ chúng ti p t c ể ế ụ x lý. ử
Tăng tính hi u qu c a câu l nh truy v n b ng vi c g i các hàm ngay trong câu l nh ệ ả ủ ệ ấ ằ ệ ọ ệ SQL
Ta có th s d ng hàm đ thao tác trên các ki u d li u t t o. ể ử ụ ể ể ữ ệ ự ạ Cho phép th c hi n đ ng th i các câu l nh truy v n ự ệ ồ ờ ệ ấ
14.2.4. M t s h n ch khi s d ng hàm trong câu l nh SQL ộ ố ạ ế ử ụ ệ
Ch các hàm do ngỉ ười dùng đ nh nghĩa đị ượ ưc l u trên database m i có th s d ng ớ ể ử ụ được cho câu l nh SQL. ệ
Các hàm do người dùng đ nh nghĩa ch đị ỉ ược áp d ng cho đi u ki n th c hi n trên ụ ề ệ ự ệ các dòng d li u (m nh đ ữ ệ ệ ề WHERE), không th áp d ng cho các đi u ki n th c hi n ể ụ ề ệ ự ệ trên nhóm (m nh đ ệ ềGROUP).
Tham s s d ng trong hàm ch có th là lo i ố ử ụ ỉ ể ạ IN, không ch p nh n giá tr ấ ậ ị OUT hay giá tr ịIN OUT.
Ki u d li u tr v c a các hàm ph i là ki u d li u ể ữ ệ ả ề ủ ả ể ữ ệ DATE, NUMBER, NUMBER. Không cho phép hàm tr v ki u d li u nh ả ề ể ữ ệ ưBOOLEAN, RECORD, TABLE. Ki u d ể ữ li u tr v này ph i tệ ả ề ả ương thích v i các ki u d li u bên trong Oracle Server. ớ ể ữ ệ
14.2.5. Hu b hàm ỷ ỏ
Tương t nh vi c t o hàm, ta có th hu b hàm thông qua câu l nh SQL. Cú pháp: ự ư ệ ạ ể ỷ ỏ ệ
DROP FUNCTION Tên hàm;
Ví d : ụ
DROP FUNCTION get_sal;
Oracle c b n - SQL và PL/SQL ơ ả 14.2.6. Hàm và th t c ủ ụ
Ta t o các th t c đ l u gi m t lo t các các câu l nh ph c v cho nhi u l n g i khác nhau. Th t c cóạ ủ ụ ể ư ữ ộ ạ ệ ụ ụ ề ầ ọ ủ ụ th không có, có m t ho c nhi u tham s . Tuy nhiên th t c không tr l i b t kỳ m t k t qu nào. ể ộ ặ ề ố ủ ụ ả ạ ấ ộ ế ả Hàm cũng gi ng nh th t c, nó cũng bao g m m t lo t các câu l nh, có th không có, có m t ho c nhi uố ư ủ ụ ồ ộ ạ ệ ể ộ ặ ề tham s . Tuy nhiên khác v i th t c, hàm bao gi cũng tr v m t k t qu . Vì v y, ta s d ng hàm trongố ớ ủ ụ ờ ả ề ộ ế ả ậ ử ụ các phép tính toán, gán giá tr . Khi đó, câu l nh th c hi n s d dàng và sáng s a h n. ị ệ ự ệ ẽ ễ ủ ơ
So sánh gi a hàm và th t c ữ ủ ụ
Th t c ủ ụ Hàm
Th c hi n gi ng nh th c hi n các câu ự ệ ố ư ự ệ Có th để ược g i gi ng nh m t ph n c a ọ ố ư ộ ầ ủ l nh PL/SQL ệ bi u th c ể ứ
Không có ki u giá tr tr v ể ị ả ề Có ch a giá tr tr v ứ ị ả ề Có th tr v m t ho c nhi u giá tr ể ả ề ộ ặ ề ị Tr v m t giá tr ả ề ộ ị (thông qua tham s OUT) ố
L i ích c a vi c s d ng hàm, th t c ợ ủ ệ ử ụ ủ ụ
Nâng cao hi u su t: Tránh vi c tái s d ng các câu l nh nhi u l n b i nhi u User ệ ấ ệ ử ụ ệ ề ầ ở ề khác nhau. Gi m thi u th i gian biên d ch câu l nh PL/SQL trong pha phân tích câu ả ể ờ ị ệ l nh. Gi m thi u s l n g i l nh th c hi n trên database, t đó, làm gi m l u lệ ả ể ố ầ ọ ệ ự ệ ừ ả ư ượng
truy n thông trên m ng. ề ạ
Nâng cao kh năng b o trì: Ta có th d dàng s a n i dung bên trong các hàm, th ả ả ể ễ ử ộ ủ t c mà không nh hụ ả ưởng đ n vi c giao ti p c a chúng (các tham s và l i g i v n y ế ệ ế ủ ố ờ ọ ẫ nguyên). Thay đ i n i dung c a m t hàm, hay th t c có th ng d ng đổ ộ ủ ộ ủ ụ ể ứ ụ ược ngay
cho nhi u user khác nhau. ề
Tăng tính b o m t và toàn v n c a d li u: V i vi c đi u khi n truy nh p d li u dán ả ậ ẹ ủ ữ ệ ớ ệ ề ể ậ ữ ệ ti p đ i v i các đ i tế ố ớ ố ượng trong database s làm nâng cao tính b o m t c a d li u. ẽ ả ậ ủ ữ ệ Quan h gi a các câu l nh trong hàm, th t c luôn đệ ữ ệ ủ ụ ược đ m b o. ả ả
14.3.PACKAGE
Package là m t t p h p các ki u d li u, bi n l u gi giá tr và các th t c, hàm có cùng m t m i liên hộ ậ ợ ể ữ ệ ế ư ữ ị ủ ụ ộ ố ệ v i nhau, đớ ược g p chung l i. Đ c đi m n i b t nh t c a package là khi m t ph n t trong package độ ạ ặ ể ổ ậ ấ ủ ộ ầ ử ược g i thì toàn b n i dung c a package s đọ ộ ộ ủ ẽ ược n p vào trong h th ng. Do đó, vi c g i t i các ph n tạ ệ ố ệ ọ ớ ầ ử khác trong package sau này s không ph i m t th i gian n p vào h th ng n a. T đó, nâng cao t c đẽ ả ấ ờ ạ ệ ố ữ ừ ố ộ th c hi n l nh c a toàn b hàm, th t c có trong package. ự ệ ệ ủ ộ ủ ụ
14.3.1. C u trúc c a package ấ ủ
M t package độ ượ ấc c u trúc làm hai ph n. Ph n mô t (specification) đ nh nghĩa các giao ti p có th có c aầ ầ ả ị ế ể ủ package v i bên ngoài. Ph n thân (body) là các cài đ t cho các giao ti p có trong ph n mô t trên. ớ ầ ặ ế ầ ả ở
Hình v 14. C u trúc package ẽ ấ
Trong c u trúc c a package bao g m 05 thành ph n: ấ ủ ồ ầ
1. Public variable (bi n công c ng): là bi n mà các ng d ng bên ngoài có th tham ế ộ ế ứ ụ ểchi u t i đế ớ ược.