Chương 7 trang bị cho người học những hiểu biết cơ bản về Stored procedure. Chương này gồm có những nội dung chính sau: Khái niệm Stored procedure, tạo stored procedure bằng lệnh create procedure, tạo stored procedure bằng công cụ quản lý management studio.
Trang 1CHƯƠNG VII
STORED PROCEDURE
Giảng viên: Phạm Mạnh Cương
CHƯƠNG VII
STORED PROCEDURE
Giảng viên: Phạm Mạnh Cương
1
Trang 2I- Khái niệm:
• Là một chương trình con được xây dựng bởi những phát biểu của T-SQL
• Có tham số Input và Output
• Được lưu trữ trong CSDL với 1 tên phân biệt
• Cho phép gọi thực hiện từ các ngôn ngữ lập trình
khác.
• Stored Procedure thường dùng thực hiện truy vấn hay
cập nhật dữ liệu theo yêu cầu của người dùng.
Trang 3II-Tạo Stored Procedure
3
1 Bằng Lệnh CREATE PROCEDURE
2 Bằng công cụ quản lý Management
Studio
Trang 41- Bằng Lệnh CREATE PROCEDURE:
Create Proc <sp_name>
[<các tham số hình thức>]
[With Recompile | Encryption | Recompile , Encryption]
As
[Begin]
<Các phát biểu>
[End]
Trang 5Ví dụ: Tạo thủ tục liệt kê sản phẩm tồn kho
trong một tháng
5
Create Proc spTonKho(@Thang int = 8, @Nam int = 2005)
As
Begin
Select * From TonKho
Where Thang = @Thang And Nam = @Nam
End
Trang 6Ví dụ: Tạo thủ tục trả về Doanh thu của một năm
Create Proc spDTNam (@Nam Smallint, @DoanhThu Float Output )
AS
Begin
Select @DoanhThu=Sum(SL*DGBan)
From HoaDon hd Inner Join CTHD ct On hd.SoHD=ct.SoHD
Where Year(NgayHD) = @Nam
End
Trang 71.1 Khai báo tham số hình thức của thủ tục:
7
Cú pháp: @par_name datatype [= default][OUTPUT] [,…n]
Có 2 loại tham số hình thức: Input và Output.
• Tham số Output dùng liên kết với một biến tại nơi gọi , nhận
giá trị của biến và trả giá trị về cho biến.
Ví dụ:
Create Proc spTonKho(@Thang int = 8, @Nam int = 2005)
Create Proc spDTNam(@Nam int, @DoanhThu Float Output)
• Tham số hình thức nhận giá trị mặc định khi không truyền
giá trị cho nó.
Trang 81.2 Thực hiện Stored Procedures có Tham số
• Cách 1 Truyền theo vị trí :
EXEC sp_name <exp> [OUTPUT] [,…n]
Ví dụ gọi thủ tục:
Create Proc spTonKho(@Thang int = 8, @Nam int = 2005)
Exec spTonKho 9, 2005
Sử dụng giá trị default : Exec spTonKho 9
• Cách 2 Truyền theo tên:
EXEC sp_name @par_name = <exp> [OUTPUT][,…n]
Ví dụ gọi thủ tục : Create Proc spTonKho(@Thang int = 8, @Nam int = 2005)
Trang 91.3 Nhận giá trị từ tham số
Output
9
• Phải dùng Biến với từ khóa Output trong lời gọi để nhận giá
trị từ tham số hình thức loại Output
Create Proc spDTNam(@Nam int, @DoanhThu Float Output)
Ví dụ: Thực hiện thủ tục spDTNam
Declare @DT Float
Exec spDTNam 2005, @DT Output
Print @DT
Hay
Declare @DT Float
Exec spDTNam @DoanhThu = @DT Output, @Nam = 2005
Print @DT
Trang 10III- Các Phát Biểu Điều Khiển:
1 Biến cục bộ
2 Phát biểu If Else
3 Phát biểu WHILE
4 Phát biểu: RETURN [Biểu thức số nguyên]
5 Phát biểu: GOTO <label>
Trang 111- Biến cục bộ :
11
a) Khai báo biến cục bộ: DECLARE @VarName data_type [, n]
Ví dụ: Declare @n TinyInt , @m TinyInt, @y SmallInt
• Biến cục bộ phải bắt đầu bằng ký hiệu @ trước tên của nó
• Phạm vi biến: Biến chỉ khả dụng bên trong thủ tục, hàm hoặc một gói
lệnh đã khai báo biến
• Giá trị ban đầu của biến là NULL
b) Gán giá trị cho biến cục bộ:
• Cách 1 : SET @VarName = <Expression>
Ví dụ: Declare @Ngay DateTime
set @Ngay ='2005/5/15'
print @Ngay
• Cách 2 : SELECT @VarName = <Expression> [FROM …]
– Nếu SELECT trả về nhiều dòng, thì biến được gán giá tri từ dòng
cuối cùng trả về bởi Select
Trang 12Ví dụ: Tạo thủ tục liệt kê danh sách mặt
hàng có
đơn giá cao nhất và thấp nhất.
CREATE PROCEDURE spMatHangCaoNhatThapNhat
AS
Begin
Declare @Dgmax float, @Dgmin float
SELECT @Dgmax = Max(DonGia), @Dgmin = Min(DonGia)
FROM MatHang
SELECT * FROM MatHang
WHERE DonGia = @Dgmax OR DonGia = @Dgmin
Trang 132- Phát biểu If Else:
IF <Boolean Expression>
BEGIN
<Các lệnh>
END
ELSE
BEGIN
<Các lệnh>
END
Create Proc spTonKho(@Thang int, @Nam int)
As
If @Thang<1 Or @Thang>12 Begin
Print 'Thang sai' End
Else Begin
Select * From TonKho Where Thang = @Thang And Nam = @Nam
End
13
Trang 143- Phát biểu WHILE :
WHILE <BTDK>
BEGIN
<Các lệnh>
[CONTINUE]
[BREAK]
END
Ví dụ: Thủ tục tính tổng S = 1 + 3 + … + (2N-1)
Create Proc spTongLe ( @N int ) AS
DECLARE @I int, @S int SET @I = 1
SET @S = 0 WHILE @I <= 2*@N -1 BEGIN
Set @S = @S + @I
Set @I = @I + 2 END
Trang 154- Phát biểu RETURN [Biểu thức số
nguyên]:
15
Dùng kết thúc thủ tục và trả về nơi gọi một số nguyên
• Mặc định là 0 nếu không chỉ định
• Gọi hàm và nhận giá trị Return của thủ tục:
EXEC @var_name = sp_name [@par_name =] <exp>[,…n]
Ví dụ: Gọi thực hiện thủ tục spTongLe( @N int )
declare @s int
Exec @s = spTongLe 9
print 'Tong la = ' + Cast (@s As Varchar)
Trang 16Ví dụ: Thủ tục Thêm hóa đơn
As
If Exists(Select * From HoaDon Where SoHD = @SoHD)
Begin
Print 'Trung so hoa don' Return 1
End
If Not Exists(Select * From NhanVien Where MaNV = @MaNV)
Begin
Print 'Sai Ma nhan vien ' Return 2
End
If @NgayHD > GetDate()
Begin
Print 'Ngay lap hoa don lon hon ngay hien hanh ' Return 3
End
Insert HoaDon (SoHD, MaNV, NgayHD) Values(@SoHD, @MaNV, @NgayHD)
if @@Error <> 0
Begin
Trang 175- Phát biểu: GOTO <label>
17
Create Proc spTongLe ( @N int )
AS
DECLARE @I int, @S int
SET @I = 1 SET @S = 0 Lap:
IF (@I > 2*@N -1) GoTo KetQua
Set @S = @S + @I Set @I = @I + 2
GoTo Lap
KetQua:
Return @S
Thuc hien thu tuc
Declare @KQ int Exec @KQ = spTongLe 9 Print @kq
Trang 18IV- Sửa Xóa Thủ Tục:
1 Đổi Tên :
sp_Rename <OldName>, <NewName>
2 Xóa Thủ tục được lưu:
DROP PROC <spName>
3 Thay đổi nội dung thủ tục lưu trữ:
ALTER PROC spName
[Danh sách tham số]
[With Recompile | Encryption | Recompile, Encryption]
Trang 19CẢM ƠN
19