3. It.kma
February 13, 2019 3
Thủ tục lưu trữ
Khái niệm
1
Tạo thủ tục lưu trữ
2
Lời gọi thủ tục lưu trữ
3
Sử dụng biến trong thủ tục lưu trữ
4
Sửa và xóa thủ tục lưu trữ
5
4. It.kma
February 13, 2019 4
Khái niệm
Một thủ tục lưu trữ là một đối tượng trong cơ sở dữ
liệu bao gồm một tập nhiều câu lệnh SQL được nhóm
lại với nhau tạo thành một nhóm với những khả năng
sau:
Các cấu trúc điều khiển có thể được dùng trong thủ tục
Bên trong thủ tục có thể sử dụng các biến.
Một tập các câu lệnh kết hợp thành một khối lệnh trong thủ
tục.
5. It.kma
February 13, 2019 5
Tạo thủ tục lưu trữ
Tạo thủ tục với cú pháp như sau:
CREATE PROCEDURE tên_th _t c
ủ ụ
[(danh sách tham s )]
ố
[WITH RECOMPILE|ENCRYPTION|
RECOMPILE,ENCRIPTION]
AS
Các_câu_l nh_c a_th _t c
ệ ủ ủ ụ
6. It.kma
February 13, 2019 6
Tạo thủ tục lưu trữ (tiếp)
Tên thủ tục: tuân theo quy tắc định danh và
không vượt quá 128 ký tự.
Danh sách tham số: khai báo ngay sau tên thủ
tục. Tham số tối thiểu phải có 2 phần:
Tên tham số bắt đầu bởi chứ @
Kiểu dữ liệu của tham số
Recompile: Thủ tục được dịch lại mỗi khi gọi
Encryption: thủ tục được mã hóa, không thể
xem được nội dụng thủ tục
Câu lệnh: thường được đặt trong từ khóa
BEGIN..END.
7. It.kma
February 13, 2019 7
Tạo thủ tục lưu trữ (tiếp)
Tạo một thủ tục cho biết thông tin sinh viên theo
lớp.
Create procedure sp_thongtinsinhvien
(@lop nvarchar(10))
as
select Masv, tensv, gioitinh, que,
ngaysinh, lop
from sinhvien
where lop = @lop
9. It.kma
February 13, 2019 9
Tạo thủ tục lưu trữ (tiếp)
Chèn dữ liệu vào 2 bảng sinhvien và monhoc
create proc them_sinhvien_monhoc
(@tensv nvarchar(50),@Ngaysinh date, @que nvarchar(50), @Lop
nvarchar(10),@tenmh nvarchar(50),@DVHT int)
as
insert into Sinhvien (TenSV, Ngaysinh, Que, Lop)
values (@tensv, @Ngaysinh, @que, @Lop)
INSERT INTO Monhoc (TenMH, DVHT)
VALUES (@tenmh, @DVHT)
10. It.kma
February 13, 2019 10
Lời gọi thủ tục
Thực thi lời gọi thủ tục có dạng
Tên_thủ_tục [danh_sách_tham_số]
Lời gọi thủ tục được thực hiện bên trong một thủ tục
khác, bên trong trigger hay với các câu lệnh SQL
khác ta thực thi như sau:
execute tên_thủ_tục [danh_sách_các_đối_số]
Thứ tự các đối số có thẻ không cần tuân theo thứ tự
của các tham số như khi định nghĩa
@tên_tham_số = giá_trị
11. It.kma
February 13, 2019 11
Sử dụng các biến nhằm lưu giá trị tính toán được
hoặc truy xuất được từ cơ sở dữ liệu.
Khai báo biến bằng từ khóa DECLARE
DECLARE TÊN_BI N
Ế KI U_D _LI U
Ể Ữ Ệ
Sử dụng biến trong thủ tục
12. It.kma
February 13, 2019 12
/*kiểm tra 2 bạn sinhvien có cùng năm sinh hay không*/
create procedure kiemtra_thongtinsv
@masv1 int,
@masv2 int
AS
declare @namsinh1 int, @namsinh2 int
select @namsinh1 = year(Ngaysinh) from Sinhvien where MaSV =
@masv1
select @namsinh2 = year(Ngaysinh) from Sinhvien where MaSV =
@masv2
if @namsinh1 <>@namsinh2
print 'hai b n sinh viên mã'
ạ + str(@masv1)+' và '+str(@masv2)+'
không cùng năm sinh'
else
print 'hai b n sinh viên mã'
ạ + str(@masv1)+' và '+str(@masv2)+'
cùng năm sinh'
Sử dụng biến trong thủ tục (tiếp)
13. It.kma
February 13, 2019 13
NHANVIEN(MaNV, HoTen, NgaySinh, Luong, …., MaPB)
CREATE PROC DSNV_Luong_Max
As
Begin
declare @maxLuong float
set @maxLuong = Select max(Luong)
From NHANVIEN
select MaNV, HoTen, NgaySinh
from NHANVIEN
where Luong = @maxLuong
End
*Thủ tục cho DS Lương cao nhất
13
14. It.kma
February 13, 2019 14
Ví dụ
NHANVIEN(MaNV, Hoten, DiaChi, SDT, NgaySinh, GT, HSL)
HANG(MaHang, TenHang, NhaSX, TGianBaoHanh)
KHACHHANG(MaKH, TenKH, CMT, DiaChi, SoDienThoai, Email)
HOADONXUAT(MaHD, MaKH, NgayLapHD, MaNV,
PhuongThucTT)
CT_HOADON(MaHD, MaHang, SoLuongMua, DonGia)
Tạo Proc tính tổng tiền đã mua hàng của một khách hàng nào đó
theo mã KH
Tạo Proc cho biết tổng số tiền hàng đã mua của một hóa đơn nào đó
Tạo Pro cho biết tổng số tiền hàng đã bán của một tháng nào đó
Tạo Proc cho biết họ tên của nhân viên có tuổi cao nhất
14
15. It.kma
February 13, 2019 15
Khi một thủ tục được tạo ra, ta có thể tiến hành định
nghĩa lại thủ tục đó bằng câu lệnh có cú pháp sau:
ALTER PROCEDURE tên_th _t c
ủ ụ
[(danh sách tham s )]
ố
[WITH RECOMPILE|ENCRYPTION|
RECOMPILE,ENCRIPTION]
AS
Các_câu_l nh_c a_th _t c
ệ ủ ủ ụ
Sửa thủ tục
16. It.kma
February 13, 2019 16
Để xóa một thủ tục đã có ta sử dụng câu lệnh có cú
pháp sau:
DROP PROCEDURE TÊN_TH _T C
Ủ Ụ
Xóa thủ tục
17. It.kma
February 13, 2019 17
Lợi ích khi sử dụng thủ tục
Đơn giản hóa các thao tác trên CSDL nhờ khả năng
module hóa.
Thủ tục được phân tích, tối ưu khi tạo ra nên thực thi
chúng nhanh hơn so với việc thực hiện tập hợp rời rác
các câu lệnh.
Cho phép ta thực hiện cùng một yêu cầu bằng một
câu lệnh đơn giản thay vì sử dụng nhiều dòng lệnh
SQL => Làm giảm thiểu nhiều sự lưu thông trên
mạng.
Cấp phát quyền thông qua thủ tục làm tang khả năng
bảo mật với hệ thống.
18. It.kma
February 13, 2019 18
Hàm - Function
Khái niệm và sử dụng hàm
1
Hàm với giá trị trả về là kiểu bảng
2
19. It.kma
February 13, 2019 19
Hàm là đối tượng trong cơ sở dữ liệu
Hàm trả về một giá trị thông qua tên hàm
Có thể sử dụng hàm như là một thành phần của biểu
thức.
Khái niệm hàm
20. It.kma
February 13, 2019 20
Cú pháp tạo một hàm:
CREATE FUNCTION tên_hàm
([danh_sách_tham_s ]
ố )
RETURNS (ki u_tr _v _c a_hàm
ể ả ề ủ )
AS
BEGIN
các_câu_l nh_c a_hàm
ệ ủ
END
Sử dụng hàm
21. It.kma
February 13, 2019 21
Ví dụ: Định nghĩa hàm tính ngày trong tuần của một
giá trị kiểu ngày
CREATE FUNCTION thu(@ngay DATETIME)
RETURNS NVARCHAR(10)
AS
BEGIN
DECLARE @st NVARCHAR(10)
SELECT @st=CASE DATEPART(DW,@ngay)
WHEN 1 THEN N’Ch nh t'
ủ ậ
WHEN 2 THEN N'Th hai'
ứ
WHEN 3 THEN N'Th ba'
ứ
WHEN 4 THEN N'Th t '
ứ ư
WHEN 5 THEN N'Th năm'
ứ
WHEN 6 THEN N'Th sáu'
ứ
ELSE N'Th b y'
ứ ả
END
RETURN (@st) /* Tr tr v c a hàm */
ị ả ề ủ
END
Sử dụng hàm (tiếp)
22. It.kma
February 13, 2019 22
Sau đó ta có thể sử dụng hàm trong câu truy vấn
select masv, TenSV, Ngaysinh, dbo.thu(ngaysinh) as 'Ngày trong tu n'
ầ
from sinhvien
Sử dụng hàm (tiếp)
23. It.kma
February 13, 2019 23
Hàm cũng có thể trả về giá trị là bảng nhằm tăng thêm
tính linh hoạt của khung nhìn.
Hàm nội tuyến
CREATE FUNCTION tên_hàm
([danh_sách_tham_s ]
ố )
RETURNS TABLE
AS
RETURN (câu_l nh_select
ệ )
Kiểu trả về phải được chỉ định bởi mệnh đề Returns table
Phần thân chỉ có duy nhất 1 câu lệnh RETURN.
Hàm với giá trị trả về là kiểu bảng
24. It.kma
February 13, 2019 24
Ví dụ: Viết một hàm hiển thị điểm của sinh viên theo
lớp.
create function diem_lop
(@lop nvarchar(10)
)
returns table
as
return
(
select Sinhvien.MaSV, TenSV, Lop, TenMH, Diem
from Sinhvien, Monhoc, Ketqua
where sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH
and Lop = @lop
)
Hàm với giá trị trả về là kiểu bảng
25. It.kma
February 13, 2019 25
Sau khi khởi tạo hàm ta có thể thực thi hàm:
select * from dbo.diem_lop('L03')
Hàm với giá trị trả về là kiểu bảng
26. It.kma
February 13, 2019 26
Trong trường hợp cần sử dụng nhiều câu lệnh trong phần thân
hàm, ta sử dụng cú pháp sau:
CREATE FUNCTION tên_hàm([danh_sách_tham_s ]
ố )
RETURNS @bi n_b ng
ế ả TABLE đ nh_nghĩa_b ng
ị ả
AS
BEGIN
các_câu_l nh_trong_thân_hàm
ệ
RETURN
END
Hàm với giá trị trả về là kiểu bảng (tiếp)
27. It.kma
February 13, 2019 27
Ví dụ: Viết một hàm cho biết tổng số sinh viên của mỗi lớp đã
thi môn học được nhập vào.
create function func_tongsv
(@mamon int)
returns @bangthongke table
(
lop nvarchar(10),
tongsosv int
)
as
BEGIN
insert into @bangthongke
select lop, count(sinhvien.masv)
from ((Sinhvien join Ketqua on Sinhvien.MaSV = Ketqua.MaSV)
join Monhoc on Monhoc.MaMH = Ketqua.MaMH)
where Monhoc.MaMH = @mamon
group by Lop
return
END
Hàm với giá trị trả về là kiểu bảng (tiếp)
28. It.kma
February 13, 2019 28
select * from dbo.func_tongsv(1)
Hàm với giá trị trả về là kiểu bảng (tiếp)
29. It.kma
February 13, 2019 29
S a hàm:
ử
ALTER FUNCTION tên_hàm ([danh_sách_tham_s ]
ố )
RETURNS (ki u_tr _v _c a_hàm
ể ả ề ủ )
AS
BEGIN
các_câu_l nh_c a_hàm
ệ ủ
END
Xóa hàm:
DROP FUNCTION tên_hàm
Sửa và xóa hàm
30. It.kma
February 13, 2019 30
Câu 1: Vi t m t th t c đ a ra các sinh viên có
ế ộ ủ ụ ư
năm sinh b ng v i năm sinh đ c nh p vào (l y
ằ ớ ượ ậ ấ
năm sinh b ng hàm datepart(yyyy,ngaysinh))
ằ
Câu 2: So sánh 2 sinh viên có mã đ c nh p vào
ượ ậ
xem sinh viên nào đ c sinh tr c.
ượ ướ
Câu 3:Vi t m t hàm đ a ra tháng sinh. Áp d ng
ế ộ ư ụ
đ đ a ra tháng sinh các b n sinh viên đã thi
ể ư ạ
môn có mã là 1.
Câu hỏi