Chương IV
ThS. Nguyễn ThịThúy Loan
Nguyễn ThịThúy Loan Trang 230 2/12/2011
NỘI DUNG Khái niệm Thủtục Thủtục với tham sốđầu vào Thủtục với tham sốđầu ra Thủtục có lệnh trảvềReturn Sửdụng bảng tạm trong thủtục
Tham sốcursor bên trong thủtục
Giao tác (Tracsaction)
Khái niệm
Khái niệm
Stored procedure là một tập các lệnh Transact
SQL được đặt tên và lưu trữ trong database
server.
Có thể nhận tham số vào và tham số trảgiá trị
ra.
Trả về trạng thái thực thi của procedure là
Nguyễn ThịThúy Loan Trang 233 2/12/2011 Khái niệm Thủ tục nội tại là một tập hợp chứa các dòng lệnh, các biến và các cấu trúc điều khiển trong ngôn ngữ Transaction-SQL dùng để thực hiện một hành động nào đó.
Nguyễn ThịThúy Loan Trang 234 2/12/2011
Khái niệm
Các nét đặc trưng
Tên thủtục.
Tham sốtruyền giá trịvào.
Tham sốnhận giá trịra .
Trong thủ tục nội tại được phép gọi thực thi một thủtục nội tại khác.
Có tính cục bộbên trong một cơ sởdữliệu lưu trữthủtục đó.
Có thể gọi thực hiện trong môi trường không phải Microsoft SQL Server.
Nguyễn ThịThúy Loan Trang 235 2/12/2011
Khái niệm
Lợi ích của thủtục:
o Tốc độxửlý của các thủtục nội tại rất nhanh.
o Việc tổ chức và phân chia các xử lý thành hai
nơi khác nhau: tại máy chủ hoặc tại máy trạm sẽgiúp giảm thời gian xây dựng ứng dụng.
Thủtục hệthống
o Bắt đầu bằng chữsp_ và hầu hết tất cảcác thủ
tục hệ thống được lưu trữ bên trong CSDL
Master.
Nguyễn ThịThúy Loan Trang 236 2/12/2011
NỘI DUNG Khái niệm Thủtục Thủtục với tham sốđầu vào Thủtục với tham sốđầu ra Thủtục có lệnh trảvềReturn Sửdụng bảng tạm trong thủtục
Tham sốcursor bên trong thủtục
Nguyễn ThịThúy Loan Trang 237 2/12/2011
Thủ tục
Tạo mới thủtục
Cú pháp:
CREATE PROC[EDURE] Tên_thủ_tục AS
[Declare biến_cục_bộ] các_lệnh
Nguyễn ThịThúy Loan Trang 238 2/12/2011
Thủ tục
Ví dụ: Tạo procedure để liệt kê danh sách tất cảcác mặt hàng. CREATE PROC P_MH AS SELECT * FROM MH Gọi thực thi thủtục EXEC[UTE] P_MH Thủ tục
Ví dụ: Tạo procedure để cập nhật giá cho mặt hàng kẹo là 17000.
create proc P_capnhat as
update ctdh set Dgdat = 17000 where mamh = 'keo'
Gọi thực thi thủtục exec P_capnhat
Thủ tục
Ví dụ: Cho biết số lượng sinh viên trong lớp? CREATE PROC P_DEMSV @MALOP
CHAR(9), @SLSV SMALLINT OUTPUT AS
SELECT @SLSV = COUNT(*) FROM SV
Nguyễn ThịThúy Loan Trang 241 2/12/2011
Thủ tục
DECLARE @SL SMALLINT EXEC P_DemSV '07CDTH',
@SLSV = @SL OUTPUT
PRINT 'SO LUONG SINH VIEN O LOP: ' + CAST(@SL AS CHAR(3))
Nguyễn ThịThúy Loan Trang 242 2/12/2011
Thủ tục
Thay đổi nội dung thủtục
o Cú pháp:
ALTER PROC[EDURE] Tên_thủ_tục AS [Declare biến_cục_bộ]
Các_lệnh.
Nguyễn ThịThúy Loan Trang 243 2/12/2011
Thủ tục
Alter Proc P_Demsv @Malop Char(9) As
Select Malop, Tenlop From Lop
Where @Malop = Malop
Nguyễn ThịThúy Loan Trang 244 2/12/2011
Thủ tục
Ví dụ: cho lược đồ CSDL như sau:
MAT_HG(MaMH, TenMH, DVT, MaNCC) PH_XUAT(SoPX, NgXuat, SoDH)
CTPX(MaMH, SoPX, SLX, DGX) DDH(MaDH, NgDat)
Nguyễn ThịThúy Loan Trang 245 2/12/2011
Thủ tục
Ví dụ: Cho biết mặt hàng nào có SO LUONG bán cao nhất trong tháng 01/2007.
Thủ tục
CREATE PROC p_MaxSLBan
AS Declare @TenMH varchar(50), @MaxSL int
Select @TenMH = RTRIM(TenMH), @MaxSL = SLXuat From CTPX, PH_XUAT, MAT_HG
Where CTPX.SoPX = PH_XUAT.SoPX And MAT_HG.MaMH = CTPX.MaMH And convert(char(7), NgayXuat, 21) = ‘2007-01’ And SLXuat = (Select Max(SLXuat)
From CTPX, PH_XUAT
Where CTPX.SoPX = PH_XUAT.SoPX
And convert(char(7), NgayXuat, 21) = ‘2007-01’) Print @TenMH + ‘Co doanh so cao nhat la’ +
Cast(@MaxSL as char(10))
Thủ tục
Gọi thực hiện thủtục
exec p_maxslban
Thủ tục
Ví dụ: Cho biết mặt hàng nào có SO LUONG bán cao nhất trong tháng 01/2007. Nếu không có thì hãy thông báo.
Nguyễn ThịThúy Loan Trang 249 2/12/2011
Thủ tục
alter proc p_maxslban
As declare @tenmh varchar(50), @maxsl int if not exists(select mamh
from ctpx, px
where ctpx.sopx = px.sopx
and convert(char(7), ngxuat, 21)= '2007-01') Begin
Print 'thang 01 nam 2007 chưa bán mặt hàng nào cả';
Return End
Nguyễn ThịThúy Loan Trang 250 2/12/2011
Thủ tục
Select @tenmh = rtrim(tenmh), @maxsl = slxuat Fromctpx, px, mh
Where ctpx.sopx = px.sopx and
mh.mamh = ctpx.mamh and convert(char(7), ngayxuat, 21)= ‘2007-01’ and slxuat =
(select max(slxuat) from ctpx, phieu_xuat
where ctpx.sopx=phieu_xuat.sopx
and convert(char(7), ngayxuat, 21)= ‘2007-01’) print @tenmh + ‘co doanh so cao nhat la’ +
cast(@maxsl as char(10))
Nguyễn ThịThúy Loan Trang 251 2/12/2011
Thủ tục
Gọi thực hiện thủtục
exec p_maxslban
Nguyễn ThịThúy Loan Trang 252 2/12/2011
NỘI DUNG Khái niệm Thủtục Thủtục với tham sốđầu vào Thủtục với tham sốđầu ra Thủtục có lệnh trảvềReturn Sửdụng bảng tạm trong thủtục
Tham sốcursor bên trong thủtục
Nguyễn ThịThúy Loan Trang 253 2/12/2011