Bài giảng Cơ sở dữ liệu: Hàm do người dùng định nghĩa trình bày các khái niệm, các loại hàm, định nghĩa hàm vô hướng, ví dụ về hàm, định nghĩa hàm trả về bảng, khác nhau giữa hàm và thủ tục, định nghĩa view,... Mời các bạn cùng tham khảo.
Trang 1HÀM DO NGƯỜI DÙNG ĐỊNH NGHĨA
(USER-DEFINED FUNCTION)
Trang 3CÁC LOẠI HÀM
• Hàm vô hướng: trả về một giá trị
• Hàm thao tác trên bản ghi: trả về một bảng
Trang 4ĐỊNH NGHĨA HÀM VÔ HƯỚNG
• Cú pháp:
Trang 5VÍ DỤ VỀ HÀM
• Ví dụ về hàm vô hướng: viết một hàm để tính
số lượng nhân viên trong một phòng
CREATE FUNCTION Ham_Soluong_Phong ( @BienMaPhong CHAR (3) ) RETURNS int
AS
BEGIN
DECLARE @SL int;
SELECT @SL = COUNT (*) FROM NhanVien
WHERE MaPhong=@BienMaPhong ; RETURN (@SL);
END
Trang 9• Ví dụ 2: Viết một hàm trả về ngày sinh của
một nhân viên Tham số của hàm là mã nhânviên
• Viết một thủ tục sử dụng hàm đó so sánh ngàysinh của hai nhân viên bất kỳ Nếu trùng nhauthì in ra “Hai nhân viên cùng ngày sinh”
Ngược lại thì in ra “Hai nhân vien không cùngngày sinh”
Trang 10VÍ DỤ VỀ HÀM
• Sử dụng hàm HAM_DSPHONG:
• SELECT * FROM HAM_DSPHONG(‘QT’)
Trang 11ĐỊNH NGHĨA HÀM TRẢ VỀ BẢNG
• Cú pháp 2
Trang 12ĐỊNH NGHĨA HÀM TRẢ VỀ BẢNG
Ví dụ 2: sử dụng cú pháp 2 để viết lại hàm trong ví dụ 1:
CREATE FUNCTION HAM_DSPHONG (@bienmaphong
Trang 13BÀI TẬP
• Cho CSDL như sau:
– Sinhvien (MãSV, Họ tên, Ngày sinh, Mã lớp )
– Lớp (Mã lớp, Tên lớp, Mã khóa)
Câu 1: Viết hàm để tính xem một ngày nào đó là rơi vào thứ mấy trong tuần (Gợi ý, sử dụng cấu trúc IF…ELSE hoặc cấu trúc CASE)
Câu 2: Viết hàm cho biết (mã khóa, tổng số sinh viên) của một khóa nào đó (Mã khóa >=1)
Câu 3: Viết hàm cho biết (mã khóa, tổng số sinh viên) của một khóa nào đó Trong trường hợp khóa có giá trị=0 thì cho biết (mã khóa, tổng số sinh viên) của tất cả các khóa
Trang 14KHÁC NHAU GIỮA HÀM VÀ THỦ TỤC
• Sinh viên tự tìm hiểu
Trang 15VIEW
Trang 16KHÁI NIỆM
– View là bảng không chứa dữ liệu, nó chỉ là truy vấn
dữ liệu từ 1 hay nhiều bảng View được lưu thànhmột đối tượng của SQL SV
– NSD có thể áp dụng ngôn ngữ thao tác dữ liệu trêncác View giống như Table
Trang 18Ví dụ 1: tạo View nv_kinh doanh
CREAT VIEW nv_kinhdoanh
Trang 19Ví dụ 2: tạo View nv_tre (nhân viên dưới 35 tuổi)
CREAT VIEW nv_tre (Manv, Hoten, Tuoi)
SELECT * FROM NV_TRE
Nếu một thuộc tính trong View được xây dựng từ một biểu thức thì bắt buộc phải đặt tên cho thuộc tính đó.
Trang 20HAI LOẠI VIEW
• VIEW chỉ đọc (read-only view): View này chỉ dùng để xem dữ liệu
• VIEW có thể cập nhật (updatable view):
Trang 21• Các yêu cầu để tạo view có thể cập nhật :Câu lệnh SELECT trong định nghĩa VIEW không
• Nếu câu lệnh tạo View vi phạm một trong số điều
kiện trên =>VIEW được tạo ra là VIEW chỉ đọc
Trang 22• Tóm lược nhiều cơ sở dữ liệu vật lý vào một
cơ sở dữ liệu logic
Trang 23TRIGGER
Trang 24KHÁI NIỆM
• Là một stored procedure đặc biệt
• Trigger không có tham số đầu vào, đầu ra
• Trigger tự động chạy khi có một hành động liên quan đến nó xảy ra.
• Sử dụng trong việc:
– Kiểm tra dữ liệu nhập
– Tính toán, cập nhật giá trị tự động
• Các loại trigger: INSERT TRIGGER, DELETE
TRIGGER, UPDATE TRIGGER, TRIGGER tổng hợp
Trang 25Cú pháp
CREATE TRIGGER <tên triger>
ON <tên bảng>|<tên view>
FOR | AFTER | INSTEAD OF
< INSERT [, UPDATE ] [, DELETE ]>
AS
<câu lệnh SQL>
Trang 26PRINT ‘Ban da chen thanh cong’
Trigger này tự động được thực hiện mỗi khi có bản
ghi mới được chèn vào bảng NHANVIEN
Trang 27PRINT ‘Ban da xoa thanh cong’
Trigger này tự động được thực hiện mỗi khi có một
hoặc nhiều bản ghi bị xóa ở bảng NHANVIEN
Trang 28Trigger cập nhật (Update trigger): ví dụ
CREATE TRIGGER trUpNV
ON NHANVIEN
FOR UPDATE
AS
PRINT ‘Ban da cap nhat thanh cong’
Trigger này tự động được thực hiện mỗi khi có một
câu lệnh Update được thực hiện trên bảng
NHANVIEN.
Trang 30Trigger Instead of
– cho phép cập nhật DL các bảng thông qua
view có liên kết nhiều bảng
Trang 31Xóa, sửa trigger
Trang 32Ứng dụng: Đảm bảo ràng buộc toàn vẹn dữ liệu
CREATE TRIGGER trDelNV
Trang 33Một số chú ý khi dùng trigger
– Một bảng có nhiều trigger
– Mỗi một trigger có tên duy nhất
– Trong trigger thường dùng mệnh đề IF
EXISTS
Trang 341 Viết một trigger không cho phép thêm một
nhân viên nếu như tuổi của anh ta >60
2 Viết một trigger không cho phép cập nhật trên
bảng NHANVIEN nếu như số lượng bản ghi
được cập nhật >3
3 Viết một trigger để đảm bảo rằng lương của
nhân viên không được phép thay đổi giá trị
>1000
4 Viết một trigger để đảm bảo rằng không được
phép xóa những nhân viên là trưởng phòng
Trang 351 Trong CSDL QLNV, tạo một view chứa những
thông tin sau: MaNv, TenNV, MaP TenP
2 Tạo một view cho biết mức lương trung bình
của mỗi phòng
3 Sử dụng view ở câu 1để tìm xem phòngnào có
số nhân viên đông nhất
Trang 36• CREATE
Trang 37sp_configure 'nested trigger', 1
Create trigger casc_del
create trigger del_NV
on Nhanvien for delete
as
select * from Phong
select * from Nhanvien
Trang 38• CSDL NHANVIEN gồm bảng:
NHANVIEN (MaNV, TenNV, Ngaysinh, Luong, MATP) PHONG (MaP, TenP, SoLuong)