Tải bản đầy đủ (.pdf) (20 trang)

Bài 6 Stored routines và triggers

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (512.39 KB, 20 trang )

Bài 6: Chương trình con
(Stored routines)
1
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
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 lệnh mỗi
lần thực thi

2
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
MySQL
3
EE4509, EE4253, EE6133 – HK1 2013/2014
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ố]);

4
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ - thủ tục không có tham số
delimiter //

create procedure all_students()
begin
select * from Student;
end //

delimiter ;

call all_students();
5
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Tạo thủ tục
Đổi lại ký hiệu phân tách thành dấu “;”
Đổi ký hiệu phân tách câu lệnh
(để dùng dấu “;” bên trong thủ tục con)
Gọi thủ tục (in ra bảng Student)
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');
6
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Tham số vào và ra
 Các tham số không chỉ dùng để truyền tham số cho thủ
tục (IN), mà còn có thể dùng để truyền giá trị từ thủ tục ra
ngoài (OUT)
 Mỗi tham số của thủ tục có thể được khai báo bằng một
trong các loại:
 in: tham số vào (truyền giá trị cho thủ tục) – mặc định
 out: tham số ra (truyền giá trị từ thủ tục ra ngoài)
 inout: tham số cả vào và ra
 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ố, )

7

EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ - tham số ra
delimiter //

create procedure student_count (out stdcnt int)
begin
select count(*) into stdcnt from Student;
end//

delimiter ;

call student_count(@a);
select @a;
8
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Hàm
 Tương tự như thủ tục nhưng có giá trị trả về
 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ố được khai báo tương tự thủ tục
 Để kết thúc và trả về kết quả trong hàm, dùng câu
lệnh:
return giá-trị;
9

EE4509, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
SQL Server
11
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Khái quát
 Khái niệm và việc sử dụng chương trình con trong
SQL Server cũng tương tự như trong MySQL,
nhưng các câu lệnh không hoàn toàn giống nhau
 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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Một số chú ý
 Không cần thay đổi ký hiệu phân tách như trong
MySQL

 Các tham số phải có ký hiệu @ ở trước
 Từ khoá “out” khai báo ở sau tên và kiểu của các
tham số

 Hàm (giống MySQL):
 Khai báo bằng cách thêm “returns …”
 Trả về giá trị bằng “return …”
14
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Trigger
15
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Khái niệm
 Trigger là [một đối tượng bao gồm] các câu lệnh SQL,
được thực thi tự động khi xảy ra các sự kiện mà nó đăng

 Giúp đảm bảo tính toàn vẹn và nhất quán của dữ liệu
 Ví dụ:
 Khi xoá một tác giả (sự kiện)
 xoá các sách tương ứng (trigger)
 Khi thêm một thuê bao mới (sự kiện)
 khuyến mại $50 vào tài khoản (trigger)
 Trigger có thể được đăng ký thực thi trước hoặc sau khi
sự kiện xảy ra
 Các DBMS hiện nay đều hỗ trợ
16
EE4509, EE4253, EE6133 – HK1 2013/2014
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”
 Xoá:
drop trigger tên-trigger;
 Ví dụ:
 create trigger DelAuthorBooks after delete on Author
for each row ;
 create trigger PromoteNewAcc after insert on Account
for each row ;
17
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Trong MySQL (tiếp)
 Để tham chiếu tới các hàng dữ liệu trước và sau khi
sự kiện xảy ra, dùng các từ khoá “old” và “new”
 update: old, new
 insert: chỉ có new
 delete: chỉ có old
 Ví dụ:
 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;
18
EE4509, EE4253, EE6133 – HK1 2013/2014
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 khi sự kiện xảy ra
 instead of: thực hiện trigger thay cho sự kiện
 Không có “before”  dùng “instead of” và thực hiện lại sự
kiện cần thực hiện
 sự-kiện: insert / delete / update
 Tham chiếu các hàng dữ liệu được thêm/xoá bằng các
từ khoá “inserted” và “deleted” thay vì “new” và “old”
19
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Bài tập
1. Viết hàm trả về số sinh viên xếp loại giỏi của một lớp
có tên cho từ tham số
2. Tạo trigger thực hiện: khi thêm một nhân viên vào một
dự án, cập nhật lại thời gian làm việc cho dự án đó của
từng thành viên
3. Tạo trigger thực hiện: khi bỏ một nhân viên của một dự
án, cập nhật lại thời gian làm việc cho dự án đó của
từng thành viên; nếu không còn nhân viên nào, xoá dự

án khỏi danh sách
20
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

×