Chương III. PROCEDURE, FUNCTION,
VIEW,
TRIGGER & INDEX
1
Nội dung
1. Thủ tục (stored procedure)
2. Hàm (Function)
3. Khung nhìn (view)
4. Ràng buoc toàn vẹn (trigger)
5. Chỉ mục (index)
2
1. Stored procedure
3
Stored procedure trong CSDL tương tự như các
thủ tục trong ngôn ngữ lập trình. Mọi stored
procedure có thể:
Nhận tham số đầu vào, thực thi các câu lệnh bên trong
và trả vê các giá trị.
Bên trong mỗi thủ tục có thể có nhiều câu lệnh và có thể
gọi các thủ tục khác
Trả về các thông báo cho biết thủ tục thực hiện thành
công hay thất bại
Các câu trúc điều khiển (IF, WHILE, FOR) có thể được
sử dụng trong thủ tục
1. Stored procedure
4
Các lợi ích của stored procedure:
Cho phép module hóa các công việc và thực thi các
câu lệnh dễ dàng hơn
Tối ưu hóa việc phân tích, biên dịch và thực thi câu
lệnh
Thực hiện một yêu cầu bằng một câu lệnh đơn giản
hơn thay vì phải sử dụng nhiều dòng lệnh SQL khi
thực thi làm giảm thiểu sự lưu thông trên mạng
Tăng khả năng bảo mật khi cấp phát quyền thông
qua thủ tục
1. Stored procedure
5
Tạo thủ tục tên danh sách có tham số truyền vào là
tên nhân viên. Liệt kê mã nhân viên, họ lót, tên
nhân viên, ngày vào làm, lương:
CREATE PROC sp_danhsach @ten nvarchar(20)
AS
SELECT MaNV, HoLot, TenNV, NgayVaoLam,
Luong
FROM NhanVien
WHERE TenNV= @ten
1. Stored procedure
6
Thực thi thủ tục và truyền tham số cho thủ tục như
sau:
@tham_số=giá_trị
Thực thi: sp_danhsach 'Linh‘ hoặc
exec sp_danhsach ‘Linh’
1. Stored procedure
7
Người dùng có thể gán giá trị mặc định cho tham số
trong câu lệnh create procedure
CREATE PROC sp_danhsach1 @ten
nvarchar(20)='Bình'
AS
SELECT *
FROM NhanVien
WHERE TenNV = @ten
Thực thi: sp_danhsach1 ‘Duy’
1. Stored procedure
8
Tạo thủ tục tăng lương nhân viên với tham số đầu vào là
mức lương tăng và mã nhân viên
CREATE PROC asc_salary(@ascsalary int, @idemp int)
AS
BEGIN
UPDATE NhanVien
SET Luong=Luong+ @ascsalary
WHERE MaNV=@idemp
END
Thực thi: asc_salary 100, 1
(chú ý thứ tự giá trị truyền vào theo đúng tham số)
Hoặc thực thi: asc_salary (@ascsalary=100, @idemp=1)
(Nếu thực thi câu lệnh tường minh có thể hoán đổi vị trí
các tham sô)
1. Stored procedure
9
Tạo thủ tục tăng lương nhân viên với tham số đầu vào là mã nhân viên.
Nếu lương nhân viên lớn hơn 1000$ thì tăng 150$, ngược lại tăng 100$
CREATE PROC asc_salary(@idemp int) AS
DECLARE @salary INT
BEGIN
SELECT @salary=Luong
FROM NhanVien
WHERE MaNV=@idemp
If @salary>1000
BEGIN
UPDATE NhanVien SET Luong=Luong+150
WHERE MaNV=@idemp
END
Else
BEGIN
UPDATE NhanVien SET Luong=Luong+100
WHERE MaNV=@idemp
END
1. Stored procedure
10
Tạo thủ tục tăng lương nhân viên lên 5 lần, mỗi lần tăng
50$ dùng câu lệnh While
CREATE PROCEDURE asc_salary(@idemp int)
AS
DECLARE @count int
BEGIN
SET @count=1
WHILE @count<=5
BEGIN
UPDATE NhanVien
SET Luong=Luong+50
WHERE MaNV=@idemp
SET @count=@count+1
END
END
1. Stored procedure
11
Thông tin trả về các thủ tục:
Các thủ tục có thể trả về giá trị số nguyên để thông
báo thủ tục thực hiện thành công hay thất bại. SQL
Server định nghĩa sẵn tập các giá trị trả về nằm
trong khoảng [-99;0]. Giá trị 0 cho biết thủ tục thực
hiện thành công, các giá trị còn lại cho biết nguyên
nhân lỗi xảy ra.
1. Stored procedure
12
Ngoài ra, người dùng có thể định nghĩa giá trị trả
về bằng cách bổ sung một tham số vào câu lệnh
RETURN. Tất cả các số nguyên đều được chấp
nhận ngoại trừ các số do hệ thống định nghĩa và sử
dụng
CREATE PROC sp_vidu @ten nvarchar(20)
AS
IF EXISTS (SELECT *
FROM NhanVien
WHERE TenNV = @ten)
RETURN 1
ELSE
RETURN 2
1. Stored procedure
13
Thực thi thủ tục có câu lệnh RETURN:
Declare @a int
Exec @a = sp_vidu N‘Hà’
Select @a
1. Stored procedure
14
Tạo thủ tục với tham số mặc định
CREATE PROC sp_testdefault @MaNV int =3
AS
SELECT *
FROM NhanVien
WHERE MaNV=@MaNV
Thực thi thủ tục:
Exec sp_testdefault
Hoặc
Exec sp_testdefault 4
1. Stored procedure
15
Khi cả 2 câu lệnh Create Procedure và Execute
chứa mục chọn OUTPUT cho tên một tham số, thủ
tục có thể sử dụng một biến để trả về trị của tham
số đó đến người gọi
CREATE PROC Chia @sobichia real,@sochia real,
@ketqua real OUTPUT
AS
IF (@sochia =0)
Print ‘Loi chia cho 0’
ELSE
SELECT @ketqua = @sobichia / @sochia
1. Stored procedure
16
Thực thi thủ tục:
DECLARE @ketqua real
EXEC Chia 100, 2, @ketqua OUTPUT
SELECT @ketqua
Thực thi thủ tục
DECLARE @ketqua real
EXEC Chia 100, 0, @ketqua OUTPUT
SELECT @ketqua
1. Stored procedure
17
Tạo thủ tục với tham số đầu ra là lương nhân viên với tham
số đầu vào là mã nhân viên
CREATE PROCEDURE salary (@idemp int, @salary int
OUTPUT)
AS
SELECT @salary=Luong
FROM NhanVien
WHERE MaNV=@idemp
Thực thi:
DECLARE @salary int
EXEC salary 5, @salary=@salary OUTPUT
PRINT ‘Lương nhân viên:’+CAST(@salary AS
VARCHAR(10))+’$’
1. Stored procedure
18
Cho biết tổng lương của nhân viên với tham số đầu vào là mã phòng
ban
CREATE PROCEDURE sum_salary (@deptid int, @sumsalary int OUTPUT)
AS
BEGIN
If NOT EXISTS (SELECT *
FROM NhanVien
WHERE MaPB=@deptid)
RETURN 1
SELECT @sumsalary=SUM(Luong)
FROM NhanVien
WHERE MaPB=@deptid
RETURN
If @sumsalary IS NULL
SET @sumsalary=0
END
1. Stored procedure
19
Thự c thi thủ tục:
DECLARE @sumsalary, @result
EXEC @result=sum_salary 44,@sumsalary OUTPUT
If @result=1
PRINT ‘Không tồn tại phòng ban’
Else
PRINT ‘Tổng lương cả phòng là:’ +
CAST(@sumsalary AS VARCHAR(15))+ ‘$’
1. Stored procedure
20
Tạo thủ tục gọi trực tiêp:
CREATE PROC count_rows (@name Nvarchar(50))
WITH EXECUTE AS CALLER
AS
EXECUTE(‘SELECT COUNT(*) FROM ‘ + @name)
Tạo thủ tục gọi bởi người tạo ra thủ tục:
CREATE PROC count_rows_as_me (@name
Nvarchar(50))
WITH EXECUTE AS SELF
AS
EXECUTE(‘SELECT COUNT(*) FROM ‘ + @name)
1. Stored procedure
21
Tạo thủ tục thực thi bởi người dùng:
CREATE PROC count_rows_as_user1 (@name
Nvarchar(50))
WITH EXECUTE AS ‘User1’
AS
EXECUTE(‘SELECT COUNT(*) FROM ‘ + @name)
1. Stored procedure
22
Thực thi thủ tục:
DECLARE @sname VARCHAR(50)
SET @sname = ‘authors;drop table customers’
count_rows_as_me @sname
1. Stored procedure
23
Một thủ tục có thể sử dụng bất kỳ hoặc tất cả khả
năng sau để trả về giá trị:
Một hoặc nhiều giá trị
Một giá trị trả vê rõ ràng (lệnh RETURN)
Một tham sô OUTPUT
Bên trong câu lệnh Create Procedure có thể bao gồm
bất kỳ câu lệnh nào trừ các câu lệnh sau: Create
Procedure, Create View, Create Rule, Create
Default, Create Trigger
1. Stored procedure
24
Cần chỉ rõ tên chủ sở hữu đối tượng khi gọi đối tượng
bên trong thủ tục
CREATE PROC sp_index
AS
CREATE INDEX PhongBan_ind
ON user1.PhongBan (TenPB)
1. Stored procedure
25
Cú pháp sửa thủ tục:
ALTER PROC proc_name …
Cú pháp đổi tên thủ tục:
SP_RENAME old_name, new_name
SP_RENAME sp_index, sp_index_user1
Cú pháp xóa thủ tục:
DROP PROCEDURE proc_name
DROP PROCEDURE sp_index_user1