I- Khái niệm :I- 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.. Create P
Trang 2I- Khái niệm :
I- 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
1 Bằng Lệnh CREATE PROCEDURE
2 Bằng công cụ quản lý Management Studio
Trang 5Ví dụ: Tạo thủ tục liệt kê sản phẩm tồn kho
Select * From TonKho
Where Thang = @Thang And Nam = @Nam
End
Trang 71.1 Khai báo tham số hình thức của thủ tục:
1.1 Khai báo tham số hình thức của thủ tục:
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ố
1.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)
Exec spTonKho @Nam = 2005, @Thang = 8
Sử dụng giá trị default: Exec spTonKho @Nam = 2006
Trang 91.3 Nhận giá trị từ tham số Output
1.3 Nhận giá trị từ tham số Output
• 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 )
Trang 10III- Các Phát Biểu Điều Khiển:
III- 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>
6 Phát biểu : Exec (@string_var | [N]'string_expression')
Trang 111- Biến cục bộ :
1- Biến cục bộ :
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.
Ví 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.
AS
Begin
Declare @Dgmax float, @Dgmin float
FROM MatHang
SELECT * FROM MatHang
WHERE DonGia = @Dgmax OR DonGia = @Dgmin
ORDER BY DonGia DESC
End
Trang 13Print 'Thang sai' End
Else Begin
Select * From TonKho
Where Thang = @Thang
And Nam = @Nam End
Trang 14Ví dụ: Tạo thủ tục truy vấn tồn kho theo tháng và năm.
Ví dụ: Tạo thủ tục truy vấn tồn kho theo tháng và năm.
Set @m = Left(@TN, @i-1 ) Set @y = Right(@TN, Len(@TN)- @i)
If (@m <1 Or @m >12) Begin
Print 'Thang Sai' Return 2
End SELECT * FROM TonKho
WHERE Thang = @m
And Nam = @y Return 0
Create Proc spTonKho (@TN
Trang 15Set @S = @S + @I Set @I = @I + 2 END
Trang 164- Phát biểu RETURN [Biểu thức số nguyên]:
4- Phát biểu RETURN [Biểu thức số nguyên]:
• 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 17Ví dụ: Thủ tục Thêm hóa đơn mới
Ví dụ: Thủ tục Thêm hóa đơn mới
Create Proc spThemHoaDon(@SoHD int, @MaNV int, @NgayHD DateTime) As
If Exists(Select * From HoaDon Where SoHD = @SoHD)
Trang 185- Phát biểu: GOTO <label>
5- Phát biểu: GOTO <label>
Thuc hien thu tuc Declare @KQ int Exec @KQ = spTongLe 9 Print @kq
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
Trang 196-Phát biểu :
Exec(@string_var | [N]'string_expression')
6-Phát biểu :
Exec(@string_var | [N]'string_expression')
Dùng thực hiện phát biểu T-SQL lưu trong biến chuỗi hoặc
được tạo bởi một biểu thức chuỗi
Ví dụ: Tạo thủ tục truy vấn một Table, với tên table là tham số Input
Create Proc spMoBang (@TenBang VarChar(30))
Ví dụ: Tạo thủ tục liệt kê N mặt hàng có đơn giá thấp nhất hay cao nhất;
chọn thêm hay không chọn thêm các mặt hàng khác có cùng đơn giá
với mặt hàng thứ N
Có 3 tham số Input: số nguyên dương N, và 2 cờ hiệu 0 hay 1 cho biết
chọn đơn giá thấp nhất hay cao nhất; chọn thêm hay không chọn thêm.
Trang 20IV- Giao Tác (Transaction)
• Transaction là một gói lệnh dùng đảm bảo các lệnh cập nhật
dữ liệu trong gói đều được xử lý một cách trọn vẹn
• Nếu có một lệnh nào đó trong Transaction bị lỗi thì sẽ tự động bãi bỏ các lệnh trong Transaction và phục hồi lại toàn
bộ dữ liệu đã bị thay đổi bởi các lệnh trong Transaction.
Trang 211- Các phát biểu đóng gói một Transaction
1- Các phát biểu đóng gói một Transaction
a) Bắt đầu Transaction:
BEGIN TRAN [SACTION] [transaction_name]
• Nên đặt tên giao tác khi trong giao tác có lồng giao tác
khác
b) Kết thúc Transaction:
• Không phục hồi dữ liệu đã thay đổi:
• Phục hồi dữ liệu đã thay đổi trong Transaction:
Trang 22• Nếu lệnh chèn bị lỗi thì kết thúc giao tác, trả về giá trị 1
• Ngược lại thì giảm số tồn của mặt hàng đã ghi trong chi tiết hóa đơn đó.
• Nếu sau khi giảm mà số tồn < 0 thì bãi bỏ lệnh chèn chi tiết hóa đơn và
phục hồi lại số tồn đã thay đổi.
Trang 232- Phân đoạn nhóm lệnh trong Transaction:
2- Phân đoạn nhóm lệnh trong Transaction:
Được sử dụng khi muốn phân chia nhóm lệnh cần bãi bỏ
trong Transaction
• Đánh dấu đầu phân đoạn:
SAVE TRAN <save_name>
• Kết thúc Transaction và phục hồi dữ liệu đã thay đổi bởi
nhóm lệnh:
ROLLBACK TRAN <save_name>
Trang 24Ví dụ:
Ví dụ:
Xây dựng thủ tục dùng:
• Thêm một hóa đơn mới gồm số hóa đơn, ngày lập, mã số nhân viên lập
hóa đơn và một chi tiết của hóa đơn đó gồm mã hàng, số lượng, đơn
giá bán.
• Nếu lệnh thêm hóa đơn bị lỗi thì kết thúc giao tác và trả về giá trị 1
• Ngược lại thì thêm chi tiết hóa đơn vào table CTHD đồng thời giảm số
tồn của mặt hàng
• Nếu lệnh thêm chi tiết hóa đơn bị lỗi thì kết thúc giao tác và chỉ bỏ lệnh
chèn chi tiết hóa đơn và trả về giá trị lỗi là 2
• Nếu sau khi giảm mà số tồn < 0 thì chỉ bỏ lệnh chèn chi tiết hóa đơn và
phục hồi lại số tồn đã thay đổi.
Trang 25V- Kiểm soát lỗi thực hiện:
V- Kiểm soát lỗi thực hiện:
• Cú pháp:
BEGIN TRY
<các lệnh cần kiểm tra lỗi thực hiện>
END TRYBEGIN CATCH
<các lệnh xử lý khi có lỗi trong khối TRY>
Trang 26Ví dụ sử dung Try Catch
Ví dụ sử dung Try Catch
Xây dựng thủ tục dùng thêm một hóa đơn mới gồm số hóa đơn, ngày lập,
mã số nhân viên lập hóa đơn và một chi tiết của hóa đơn đó gồm mã
hàng, số lượng, đơn giá bán.
Nếu một trong 2 lệnh chèn bị lỗi thì hủy bỏ cả 2, trả về mã lỗi và thông báo lỗi.
Trang 27VI- Sửa Xóa Thủ Tục:
VI- Sửa Xóa Thủ Tục:
1 Đổi Tên TTLT:
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ữ:
[Danh sách tham số]
[ With Recompile | Encryption | Recompile , Encryption ]
AS
< Các phát biểu t_sql >
Trang 28VII- XEM THÔNG TIN THỦ TỤC:
VII- XEM THÔNG TIN THỦ TỤC:
1 Table Sys.Procedures : chứa các thủ tục trong CSDL hiện
hành
Select * From Sys.Procedures
2 Table Sys Parameters : chứa các tham số của thủ tục
Select * From Sys.Parameters
Where Object_ID= Object_ID ('spTonKho‘)
3 Xem nội dung thủ tục: SP_HELPTEXT ‘spName’
Ví dụ:
IF EXISTS ( SELECT * FROM Sys.Procudures