Tải bản đầy đủ (.pdf) (28 trang)

HỆ QUẢN TRỊ CSDL SQL SERVER chương 7 STORED PROCEDURE

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (151.69 KB, 28 trang )

HỆ QUẢN TRỊ CSDL
SQL SERVER

Chương 7:
STORED PROCEDURE
Giáo viên: Tạ Thúc Nhu
Khoa CNTT trường ĐH Lạc Hồng


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.



2

SQL Server


II-Tạo Stored Procedure
1. Bằng Lệnh CREATE PROCEDURE
2. Bằng công cụ quản lý Management Studio

3

SQL Server


1- 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]

4

SQL Server


Ví dụ: Tạo thủ tục liệt kê sản phẩm tồn kho

trong một tháng
Create Proc spTonKho(@Thang int = 8, @Nam int = 2005)
As
Begin
Select * From TonKho
Where Thang = @Thang And Nam = @Nam
End

5

SQL Server


Ví 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

6

SQL Server


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ó.

7

SQL Server


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
8

SQL Server


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)
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
9

SQL Server



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')

10

SQL Server


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:

Ví dụ:

SET @VarName = <Expression>

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.
11

SQL Server



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.
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
ORDER BY DonGia DESC
End
12

SQL Server


2- Phát biểu If .. Else:
IF <Boolean Expression>
BEGIN
<Các lệnh>
END
ELSE

Create Proc spTonKho(@Thang int, @Nam int)
As
If @Thang<1 Or @Thang>12
Begin
Print 'Thang sai'


BEGIN
<Các lệnh>
END

End
Else
Begin
Select * From TonKho
Where Thang = @Thang
And Nam = @Nam
End
13

SQL Server


Ví dụ: Tạo thủ tục truy vấn tồn kho theo tháng và năm.
Create Proc spTonKho (@TN
Varchar(7))

Set @m = Left(@TN, @i-1 )
Set @y = Right(@TN, Len(@TN)- @i)

As

If (@m <1 Or @m >12)

Declare @i TinyInt, @m TinyInt


Begin

Declare @y SmallInt

Print 'Thang Sai'

Set @TN = Ltrim(RTrim(@TN))

Return 2

Set @i = CharIndex('/', @TN)

End

If (@i = 0)

SELECT * FROM TonKho

Begin

WHERE Thang = @m

Print 'Khong co dau / '

And Nam = @y

Return 1

Return 0


End
14

SQL Server


3- Phát biểu WHILE :
WHILE <BTDK>

Ví dụ: Thủ tục tính tổng S = 1 + 3 + … + (2N-1)

BEGIN

Create Proc spTongLe ( @N int )

<Các lệnh>

AS

[CONTINUE]

DECLARE @I int, @S int

[BREAK]

SET @I = 1

END

SET @S = 0

WHILE @I <= 2*@N -1
BEGIN
Set @S = @S + @I
Set @I = @I + 2
END
Return @S
15

SQL Server


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)

16

SQL Server


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)
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
Print 'Loi them hoa don moi'
Return 4
End
Return 0
17

SQL Server


5- Phát biểu: GOTO <label>
Create Proc spTongLe ( @N int )

--Thuc hien thu tuc


AS

Declare @KQ int
DECLARE @I int, @S int

Exec @KQ = spTongLe 9

SET @I = 1

Print @kq

SET @S = 0
Lap:
IF (@I > 2*@N -1) GoTo KetQua
Set @S = @S + @I
Set @I = @I + 2
GoTo Lap
KetQua:
Return @S
18

SQL Server


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.

19

SQL Server


IV- 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.

20

SQL Server


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:
COMMIT TRAN [transaction_name]



Phục hồi dữ liệu đã thay đổi trong Transaction:
ROLLBACK TRAN [transaction_name]

21

SQL Server


Ví dụ:
Xây dựng thủ tục dùng:


Thêm một chi tiết hóa đơn gồm số hóa đơn, mã hàng, số lượng, đơn giá
bán vào table CTHD



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.

22

SQL Server


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>

23

SQL Server


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.

24

SQL Server


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 TRY
BEGIN CATCH
<các lệnh xử lý khi có lỗi trong khối TRY>
END CATCH



Khi có lỗi thực hiện một lệnh trong khối TRY thì chương trình sẽ chuyển
sang thực hiện các lệnh trong khối CATCH.



Sử dụng các hàm Error… để xuất thông báo lỗi:
– Error_Number(): Mã lỗi
– Error_Message(): câu thông báo lỗi
25

SQL Server


×