Giới thiệu Các DBMS hiện nay đều cho phép người dùng tạo các chương trình con: nhóm các câu lệnh để có thể gọi lại Hai loại chương trình con: Thủ tục (procedure): không trả về giá trị Hàm (function): có trả về giá trị Tác dụng: Tương tự các hàm của ngôn ngữ lập trình, các chương trình con của SQL giúp tái sử dụng và phân chia các câu lệnh dễ dàng hơn Giảm lưu lượng trao đổi dữ liệu giữa client và DBMS Tăng tốc độ thực thi do DBMS không cần phân tích lại các câu...
Stored Routines EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Giới thiệu Các DBMS cho phép người dùng tạo chương trình con: nhóm câu lệnh để gọi lại Hai loại chương trình con: Thủ tục (procedure): không trả giá trị Hàm (function): có trả giá trị Tác dụng: Tương tự hàm ngôn ngữ lập trình, chương trình SQL giúp tái sử dụng phân chia câu lệnh dễ dàng Giảm lưu lượng trao đổi liệu client DBMS Tăng tốc độ thực thi DBMS khơng cần phân tích lại câu lệnh lần thực thi EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội MySQL EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Cú pháp Tạo thủ tục: create procedure tên-thủ-tục([các-tham-số]) begin các-câu-lệnh; end Xoá thủ tục tạo: drop procedure tên-thủ-tục; Gọi thủ tục: call tên-thủ-tục([các-tham-số]); EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Ví dụ - thủ tục khơng có tham số delimiter // Đổi ký hiệu phân tách câu lệnh (để dùng dấu “;” bên thủ tục con) create procedure all_students() begin select * from Student; end // delimiter ; call all_students(); Tạo thủ tục Đổi lại ký hiệu phân tách thành dấu “;” Gọi thủ tục (in bảng Student) EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Ví dụ - thủ tục có tham số delimiter // create procedure students_of (class_name varchar(50)) begin select * from Student where class = class_name; end// delimiter ; call students_of('A'); EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Tham số vào Các tham số không dùng để truyền tham số cho thủ tục (IN), mà cịn dùng để truyền giá trị từ thủ tục ngồi (OUT) Mỗi tham số thủ tục khai báo loại: in: tham số vào (truyền giá trị cho thủ tục) – mặc định out: tham số (truyền giá trị từ thủ tục ngoài) inout: tham số vào Cách khai báo tham số: create procedure tên-thủ-tục ( [in/out/inout] tên-tham-số kiểu-tham-số, [in/out/inout] tên-tham-số kiểu-tham-số, ) EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Ví dụ - tham số delimiter // create procedure student_count (out stdcnt int) begin select count(*) into stdcnt from Student; end// delimiter ; call student_count(@a); select @a; EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Hàm Tương tự thủ tục có giá trị trả Cách khai báo: create function tên-hàm (các-tham-số) returns kiểu-kết-quả begin các-câu-lệnh; end Các tham số khai báo tương tự thủ tục Để kết thúc trả kết hàm, dùng câu lệnh: return giá-trị; EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Ví dụ - hàm delimiter // create function update_class( in class_name varchar(20)) returns int begin update Student set class = class_name; return row_count(); end// delimiter ; set @rows = update_class('B'); select @rows; 10 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội SQL Server 11 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Khái quát Khái niệm việc sử dụng chương trình SQL Server tương tự MySQL, câu lệnh khơng hồn tồn giống Tạo thủ tục: create procedure tên-thủ-tục [các-tham-số] as begin các-câu-lệnh; end; Gọi thủ tục: exec tên-thủ-tục [các-tham-số]; 12 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Ví dụ - thủ tục create procedure count_student_of @class_name varchar(20), @stdcnt int out as begin select @stdcnt = count(*) from Student where class = @class_name; end; declare @classA_stdcnt int; exec count_student_of 'A', @stdcnt = @classA_stdcnt out; select @classA_stdcnt; 13 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Một số ý Không cần thay đổi ký hiệu phân tách MySQL Các tham số phải có ký hiệu @ trước Từ khố “out” khai báo sau tên kiểu tham số Hàm (giống MySQL): 14 Khai báo cách thêm “returns …” Trả giá trị “return …” EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Trigger 15 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Khái niệm Trigger [một đối tượng bao gồm] câu lệnh SQL, thực thi tự động xảy kiện mà đăng ký Ví dụ: Giúp đảm bảo tính tồn vẹn qn liệu Khi xoá tác giả (sự kiện) xoá sách tương ứng (trigger) Khi thêm thuê bao (sự kiện) khuyến mại $50 vào tài khoản (trigger) Trigger đăng ký thực thi trước sau kiện xảy Các DBMS hỗ trợ 16 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Trong MySQL Tạo: create trigger tên-trigger thời-điểm sự-kiện on tên-quan-hệ for each row câu-lệnh-được-gọi; thời-điểm: before / after sự-kiện: insert / delete / update Nếu nhiều câu lệnh cần thực thi: dùng “begin end” Xố: drop trigger tên-trigger; Ví dụ: 17 create trigger DelAuthorBooks after delete on Author for each row ; create trigger PromoteNewAcc after insert on Account for each row ; EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Trong MySQL (tiếp) Để tham chiếu tới hàng liệu trước sau kiện xảy ra, dùng từ khoá “old” “new” update: old, new insert: có new delete: có old Ví dụ: 18 create trigger DelAuthorBooks after delete on Author for each row delete from Book where author_id = old.id; create trigger PromoteNewAcc after insert on Account for each row set new.balance = new.balance + 50; EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Trong SQL Server Cú pháp tạo trigger: create trigger tên-trigger on tên-quan-hệ [thời-điểm] sự-kiện as câu-lệnh-được-gọi; thời-điểm: for / after / instead of for, after: sau kiện xảy instead of: thực trigger thay cho kiện Không có “before” dùng “instead of” thực lại kiện cần thực sự-kiện: insert / delete / update Tham chiếu hàng liệu thêm/xoá từ khố “inserted” “deleted” thay “new” “old” 19 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Bài tập 20 Viết hàm trả số sinh viên xếp loại giỏi lớp có tên cho từ tham số Tạo trigger thực hiện: thêm nhân viên vào dự án, cập nhật lại thời gian làm việc cho dự án thành viên Tạo trigger thực hiện: bỏ nhân viên dự án, cập nhật lại thời gian làm việc cho dự án thành viên; khơng cịn nhân viên nào, xố dự án khỏi danh sách EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội ... tục: create procedure tên-thủ-tục([các-tham-số]) begin các-câu-lệnh; end Xoá thủ tục tạo: drop procedure tên-thủ-tục; Gọi thủ tục: call tên-thủ-tục([các-tham-số]); EE4509, EE6133 – HK2... procedure tên-thủ-tục ( [in/out/inout] tên-tham-số kiểu-tham-số, [in/out/inout] tên-tham-số kiểu-tham-số, ) EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Ví dụ - tham số... procedure tên-thủ-tục [các-tham-số] as begin các-câu-lệnh; end; Gọi thủ tục: exec tên-thủ-tục [các-tham-số]; 12 EE4509, EE6133 – HK2 2011/2012 TS Đào Trung Kiên – ĐH Bách khoa Hà Nội Ví dụ - thủ tục