Bài giảng SQL server: Chương 5 - Lê Thị Minh Nguyện
lượt xem 7
download
Bài giảng SQL server - Chương 5 trình bày những kiến thức về Store Procedure (thủ tục). Các nội dung chính trong chương này gồ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 (Transaction). Mời các bạn cùng tham khảo.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng SQL server: Chương 5 - Lê Thị Minh Nguyện
- 10/03/2015 TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG 5. Store Procedure (thủ tục) GV: Lê Thị Minh Nguyện Email: leminhnguyen@itc.edu.vn 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 (Transaction) 1
- 10/03/2015 1.Khái niệm Store procedure (thủ tục): 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 đó. Các nét đặc trưng Tên thủ tục Tham số truyền giá trị vào Tham số đón 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. 1.Khái niệm Lợi ích của thủ tục Tốc độ xử lý của các thủ tục nội tại rất nhanh. 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 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. 2
- 10/03/2015 2.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 2.Thủ tục Ví dụ 1: cho lược đồ CSDL như sau: MAT_HANG(MaMH, TenMH, DVT, MaNCC, DonGia) PHIEU_XUAT(SoPX, NgayXuat, #SoDH) CTPX(Ma_MH, SoPX, SLXuat) HOA_DONDH(SoDH, NgayDat) CTDH(SoDH, MaMH, SLDH) 3
- 10/03/2015 2.Thủ tục Ví dụ 1: cho lược đồ CSDL như sau: NHANVIEN(MaNV, HoTen, NgaySinh, NgayVaoLam, MaPhong, ChucVu, LuongCB, PhuCap) Phong(MaPh, TenPh, DiaDiem) DEAN(MaDA, TenDA, KinhPhi, NgayKhoiCong) PHANCONG(MaNV,MaDA, NgayBatDau, NgayKetThuc) 2.Thủ tục Ví dụ 1: Cho biết mặt hàng nào có doanh số bán cao nhất trong tháng 01/20014. CREATE PROC sp_MaxSLHang AS Declare @TenMH varchar(50), @MaxSL int Select @TenMH=RTRIM(TenMH), @MaxSL=SLXuat*dongia From CTPX, PHIEU_XUAT, MAT_HANG Where CTPX.SoPX= PHIEU_XUAT.SoPX And MAT_HANG.MaMH=CTPX.MaMH And convert(char(7), NgayXuat, 21)= ‘2014-01’ And SLXuat *dongia= (Select Max(SLXuat*dongia) From CTPX, PHIEU_XUAT Where CTPX.SoPX=PHIEU_XUAT.SoPX And convert(char(7), NgayXuat, 21)= ‘2014-01’) Print @TenMH + ‘Co doanh so cao nhat la’ + Cast(@MaxSL as char(10)) 4
- 10/03/2015 2.Thủ tục Gọi thực hiện thủ tục: Cú pháp: EXEC[UTE] Tên_thủ_tục Ví dụ: EXEC sp_MaxSLHang Thay đổi nội dung thủ tục Cú pháp: ALTER PROC[EDURE] Tên_thủ_tục AS [Declare biến_cục_bộ] Các_lệnh. 2.Thủ tục ALTER PROC sp_MaxSLHang AS Declare @TenMH varchar(50), @MaxSL int IF NOT EXISTS(Select Ma_mh From CTPX, PHIEU_XUAT Where CTPX.SoPX= PHIEU_XUAT.SoPX And convert(char(7), NgayXuat, 21)= ‘2014-01’) Begin Print ‘thang 01 nam 2014 chưa bán mặt hàng nào cả’ Return End Select @TenMH=RTRIM(TenMH), @MaxSL=SLXuat From CTPX, PHIEU_XUAT, MAT_HANG Where CTPX.SoPX= PHIEU_XUAT.SoPX And MAT_HANG.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)) 5
- 10/03/2015 3.Thủ tục với tham số đầu vào Cú pháp: CREATE PROC[EDURE] Tên_thủ_tục @Tên_tham_số kiểu_dữ_liệu [= giá_trị] AS [Declare biến_cục_bộ] các_lệnh 3.Thủ tục với tham số đầu vào Create Proc sp_Days(@Thang Int, @Nam Int) As Declare @SN Int Set @SN = Case When @Thang In (1,3,5,7,8,10,12) Then 31 When @Thang In (4,6,9,11) Then 30 When @Nam % 4 = 0 Then 29 Else 28 End Return @SN 6
- 10/03/2015 3.Thủ tục với tham số đầu vào Gọi thực hiện thủ tục Declare @SN int Exec @SN = spr_ngaytrongthang 2,2015 print 'So ngay trong thang 2/2002 la ' + Cast(@SN As Char) 3.Thủ tục với tham số đầu vào Tạo thủ tục tính tổng giá trị của một phiếu xuất hàng hoá với tham số vào là số phiếu xuất với kiểu dữ liệu là chuỗi. CREATE PROC sp_TongTGXuat @SoPX char(4) AS Declare @TongTG money Select @TongTG=SUM(SLXuat*DGXuat) From CTPX Where @SoPX=SoPX Print ‘Tri gia phieu xuat’ + CAST(@SoPX AS char(4)) Print ‘là: ’ + CAST(@TongTG as Varchar(15)) Gọi thực hiện thủ tục Exec sp_TongTGXuat ‘PX01’ Hoặc: Exec sp_TongTGXuat @SoPX=‘PX01’ 7
- 10/03/2015 3.Thủ tục với tham số đầu vào Tạo thủ tục tính số đặt hàng của một mặt hàng trong một đơn đặt hàng có 2 tham số vào là số đặt hàng và mã mặt hàng. CREATE PROC sp_TinhSLDat @SoDH char(4), @MaMH char(4) AS Declare @Sldat int IF NOT EXISTS(Select MoDH From CTDH Where SoDH=@SoDH And MaMH=@MaMH) Begin Print ‘khong hop le, xem lai don dat hang’ Return End Select @SLDat = SLDat From CTDH Where SoDH = @SoDH And MaMH = @MaMH Print ‘Don dat hang ’ + @SoDH Print ‘Voi ma mat hang ’ + @MaMH Print ‘Co so luong dat la: ’ + Cast(@SLDat as varchar(10)) 3.Thủ tục với tham số đầu vào Gọi thực hiện thủ tục: Exec sp_TinhSLDat ‘DH01’, ‘Fe’ Hoặc Exec sp_TinhSLDat @MaMH = ‘Fe’, @SoDH = ‘DH01’ 8
- 10/03/2015 3.Thủ tục với tham số đầu vào Tạo thủ tục thêm mới dữ liệu vào bảng MAT_HANG với tên sp_MATHANG_Them gồm có 4 tham số vào chính là các giá trị thêm mới cho các cột trong bảng MAT_HANG: mã mặt hàng, tên mặt hàng, đơn vị tính… Trong đó cần kiểm tra các ràng buộc dữ liệu phải hợp lệ trước khi thực hiện lệnh INSERT INTO để thêm dữ liệu vào bảng MAT_HANG. Mã mặt hàng phải duy nhất Tỷ lệ phần trăm phải nằm trong miền giá trị 0 đến 100 MATHANG(MAMH, TENMH, DVT, PHANTRAM) 3.Thủ tục với tham số đầu vào CREATE PROC SP_MATHANG_Them @MaMH char(4), @TenMH varchar(50), @DVT varchar(50), @PhanTram INT AS --Định nghĩa chuỗi lỗi DECLARE @ErrMsg varchar(200) --Kiểm tra có mặt hàng chưa? IF EXISTS(SELECT MaMH FROM MAT_HANG WHERE MaMH=@MaMH) BEGIN SET @ErrMsg = ‘Mã mặt hàng [’ + @MaMH + ‘] đã có’ RAISERROR(@ErrMsg, 16, 1) RETURN END 9
- 10/03/2015 3.Thủ tục với tham số đầu vào --Kiểm tra tỷ lệ phần trăm nằm ngoài 0..100 IF @PhamTram NOT BETWEEN 0 AND 100 BEGIN SET @ErrMsg = ‘Tỷ lệ phần trăm nằm trong đoạn [0, 100]’ RAISERROR(@ErrMsg, 16, 1) Return END --Khi các RBTV hợp lệ thì thêm dữ liệu vào bảng MatHang INSERT INTO MAT_HANG(MaMH, TenMH, DVT, PhanTram) VALUES(@MaMH, @TenMH, @DvTinh, @PhanTram) 4.Thủ tục với tham số đầu ra Cú pháp: CREATE PROC Tên_thủ_tục @Tên_tham_số kiểu_dữ_liệu OUTPUT [,…] AS [Declare Biến cục bộ] Các_lệnh 10
- 10/03/2015 4.Thủ tục với tham số đầu ra Create Proc sp_ThuTrongTuan @D As SmallDateTime, @Thu VarChar(10) OUTPUT As Set @Thu = Case Datepart(w, @D) When 1 Then 'Chu Nhat’ When 2 Then 'Thu Hai’ When 3 Then 'Thu Ba’ When 4 Then ‘Thu Tu’ When 5 Then ‘Thu Nam’ When 6 Then ‘Thu Sau’ Else 'Thu Bay’ End 4.Thủ tục với tham số đầu ra Gọi thực hiện thủ tục set dateformat dmy declare @t varchar(10) exec sp_thutrongtuan @d='2/9/2015',@thu=@t Output print @t 11
- 10/03/2015 4.Thủ tục với tham số đầu ra Tạo thủ tục tính số đặt hàng của một mặt hàng trong một đơn đặt hàng có 2 tham số vào là số ĐƠN đặt hàng và mã mặt hàng, trả ra số lượng đặt hàng của một vật tư tương ứng trong đơn đặt hàng thông qua tham số đầu ra. CREATE PROC sp_TinhSLDat @Sodh char(4), @MaMH char(4), @SLDat int OUTPUT AS IF NOT EXISTS(Select MaDH From CTDH Where MaDH=@SoDH And MaMH=@MaMH) Begin Print 'khong hop le, xem lai don dat hang' Return End Select @SLDat = SLDH From CTDH Where SoDH = @SoDH And MaMH = @MaMH 4.Thủ tục với tham số đầu ra Gọi thực hiện thủ tục DECLARE @SLDatHang int EXEC sp_TinhSLDat @MaMH = ‘Fe’, @SoDH = ‘DH01’, @SLDat = @SLDatHang OUTPUT Print ‘Don dat hang DH01 với mặt hàng Fe’ Print ‘co so luong dat la: ’ + CAST(@SLDatHang AS varchar(10)) 12
- 10/03/2015 5.Thủ tục có lệnh trả về Return Return không có giá trị chỉ định thì thủ tục sẽ trả về giá trị là không (0). Return [Số_nguyên] Ví dụ: Tạo thủ tục tính tổng số lượng đặt hàng của một mặt hàng đối với một nhà cung cấp chỉ định, kiểm tra xem giá trị của mặt hàng và mã nhà cung cấp mà người dùng truyền vào thủ tục có đúng hay không? Qui định thủ tục trả về 1 khi mã mặt hàng không tồn tại, trả về 2 khi mã nhà cung cấp không tồn tại. 5.Thủ tục có lệnh trả về Return CREATE PROC sp_TinhTongSLDat @MaNCC char(3), @MaMH char(4), @TongSLdat INT OUTPUT AS IF NOT EXISTS(Select * From Mat_Hang Where MaMH=@MaMH) Return 1 IF NOT EXISTS(Select * From Mat_Hang Where MaNCC=@MaNCC) Return 2 Select @TongSLdat = SUM(SLDat) From HoaDon_DH, CTDH Where HoaDon_DH.MaDH = CTDH.MaDH And MaNCC=@MaNCC And MaMH=@MaMH IF @TongSLdat IS NULL Set @TongSLdat=0 Return 13
- 10/03/2015 5.Thủ tục có lệnh trả về Return Gọi thực hiện thủ tục: Declare @TongSLD INT, @Ketqua INT EXEC @ketqua = sp_TinhTongSLDat 'NCCA', 'Fe', @TongSLdat=@TongSLD OUTPUT IF @ketqua =1 Print 'Mã mặt hàng không hợp lệ' ELSE IF @ketqua=2 Print 'Mã nhà cung cấp không hợp lệ' ELSE Print 'Tổng số lượng đặt là: ' + CAST(@TongSLD as char(10)) 6.Sử dụng bảng tạm trong thủ tục Cú pháp: SELECT danh_sách_các_cột INTO #Tên_bảng_tạm FROM Tên_bảng_dữ_liệu (#): tạo ra các bảng tạm cục bộ (##): tạo ra các bảng tạm toàn cục 14
- 10/03/2015 6.Sử dụng bảng tạm trong thủ tục Tạo thủ tục đưa vào một năm tháng bất kỳ cho biết mặt hàng nào bán ra doanh thu cao nhất trong tháng năm đó CREATE PROC sp_TinhDTCaoNhat @namThang char(7), @TenMH char(50) OUTPUT, @TongTien Money OUTPUT AS Select MH.MaMH, TenMH, Sum(SLXuat*DGXuat) AS TT INTO #DoanhThu From Phieu_xuat PX, CTPX, Mat_Hang MH Where PX.SoPX = CTPX.SoPX And CTPX.MaMH = MH.MaMH And Convert(char(7), ngayxuat, 21) = @namthang Group By MH.MaMH, TenMH Order by SUM(SLXUAT*DGXUAT) DESC Select Top 1 @TenMH=TenMH, @Tongtien = TT From #DoanhThu 6.Sử dụng bảng tạm trong thủ tục Declare @Ten_MH char(50), @Tong_Tien Money EXEC sp_TinhDTCaoNhat ‘2007-01’, @TenMH = @Ten_MH OUTPUT, @TongTien = @Tong_Tien OUTPUT IF @TenMH IS NULL Print ‘không có dữ liệu tính toán’ ELSE Begin Print Rtrim(@TenMH) + ‘có doanh thu cao nhất’ Print ‘là ’ + CAST(@TongTien AS Varchar(20)) + ‘VND’ End 15
- 10/03/2015 7.Tham số cursor bên trong thủ tục Tham số cursor trả về danh sách các dòng dữ liệu theo điều kiện chọn lọc nào đó. Cursor được chia làm 2 phần: bên trong thủ tục và bên ngoài thủ tục. Các hành động trong thủ tục:định nghĩa dữ liệu cho biến kiểu cursor và mở cursor. Các hành động bên ngoài thủ tục: đọc từng dòng dữ liệu bên trong cursor và sau cùng là đóng cursor lại. 7.Tham số cursor bên trong thủ tục Tạo thủ tục trả về danh sách các mã vật tư đã bán ra nhiều nhất trong năm tháng nào đó. Bước 1: tạo thủ tục có tham số kiểu dữ liệu cursor chứa danh sách các mặt hàng đã bán ra nhiều nhất. CREATE PROC sp_TinhDSoBan @NamThang char(6), @cur_Dsmh CURSOR VARYING OUTPUT AS SELECT CTDH.MAMH, SUM(SLDH) AS TongSL INTO #TongSLBan FROM CTDH, MAT_HANG, HOA_DONDH WHERE Convert(char(6), NgayDat, 112) = @NamThang AND CTDH.MaMH=MAT_HANG.MaMH AND CTDH.SoDH=HOA_DONDH.SoDH Group By CTDH.MaMH 16
- 10/03/2015 7.Tham số cursor bên trong thủ tục --Kiểm tra dữ liệu có phát sinh IF EXISTS(SELECT MaMH FROM #TongSLBan) Begin -- Khởi tạo giá trị biến CURSOR SET @cur_Dsmh = CURSOR Forward_Only FOR SELECT MAMH, TongSLBan From #TongSLBan Where TongSLBan = (SELECT MAX(TongSLBan) FROM #TongSLBan) --Mở cursor OPEN @cur_Dsmh DROP TABLE #TongSLBan Return End -- Khi không có dữ liệu phát sinh DROP Table #TongSLBan Return 1 7.Tham số cursor bên trong thủ tục Bước 2: đọc cursor, đón nhận danh sách các mã mặt hàng đã bán ra nhiều nhất trong tháng 01 năm 2002 DECLARE @cur_Dsmh CURSOR, @Gtmh INT, @MaMH char(4), @TongslBan INT EXEC @Gtmh = sp_TinhDsoBan ‘200702’, @cur_Dsmh OUTPUT --Xử lý tiếp sau đó IF @Gtmh = 0 Begin Print ‘danh sách các mặt hàng’ While(0=0) Begin Fetch Next From @cur_Dsmh INTO @MaMH, @TongslBan IF @@Fetch_status0 Break; Print ‘Mã vật tư: ’ + @MaMH Print ‘Tổng số lượng: ’ + CAST(@TongslBan AS varchar(10)) Print Replicate(‘-’, 50) End End ELSE Print ‘không có bán hàng trong năm tháng chỉ định’ 17
- 10/03/2015 8.Giao tác (Transaction) Khái niệm Các tính chất Giao tác không tường minh Giao tác tường minh Phân vùng giao tác Kiểm tra lỗi bên trong giao tác 8.1.Khái niệm Một giao tác là một đơn vị xử lý nguyên tố gồm nhiều hành động. Khi thực hiện một giao tác hoặc phải thực hiện tất cả các hành động của nó hoặc thì không thực hiện hành động nào hết. Giao tác trong các loại CSDL quan hệ lớn được sử dụng trong những trường hợp mà các hành động cập nhật dữ liệu trên nhiều bảng khác nhau được thực hiện trong cùng một đơn vị (unit). 18
- 10/03/2015 8.2.Các tính chất Tính nguyên tố (Atomicity) Tính nhất quán (Consistency) Một giao tác phải biến csdl từ trạng thái nhất quán này sang trạng thái nhất quán khác Tính độc lập (Isolation) Một giao tác phải thực hiện độc lập với giao tác khác đang được xử lý đồng thời với nó Tính bền vững (Durability) Tất cả các thay đổi trên dữ liệu về thao tác thực hiện phải được ghi nhận bền vững trên csdl. 8.3.Giao tác không tường minh Mặc định các lệnh bên trong lô (batch) chứa các câu lệnh không tường minh, điều này có nghĩa là nếu có ít nhất 1 câu lệnh thực hiện không thành công trong lô thì tất cả các lệnh còn lại sẽ không được ghi nhận lại. 19
- 10/03/2015 8.3.Giao tác không tường minh Ví dụ: cho thực hiện cùng lúc 3 lệnh để cập nhật dữ liệu vào 3 bảng khác nhau trong cùng một lô. --Thêm mặt hàng mới INSERT INTO MAT_HANG(MaMH, TenMH, DVT) VALUES(‘D001’, ‘đèn ngủ’, ‘cái’ ) --Sửa đổi tên nhà cung cấp ‘NCC01’ UPDATE NHACC SET TenNCC = ‘Le Khai Hoan’ Where MaNCC = ‘NCC01’ --Xoá đơn đặt hàng ‘DH001’ DELETE HOA_DONDH Where MaDH = ‘DH001’ Vi phạm toàn vẹn DL về khóa ngoại. Nên các lệnh GO trứơc đó không thực hiện 8.4.Giao tác tường minh Giao tác tường minh trong những trường hợp cập nhật dữ liệu trên nhiều bảng khác nhau và phải đảm bảo các hành động này nằm trong cùng một đơn vị xử lý. 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng tóm tắt : Lập Trình Web
154 p | 272 | 82
-
CHƯƠNG 5 STORE PROCEDURE VÀ TRIGGER - Bài 10: Cơ bản về lập trình bằng T_SQL
30 p | 257 | 60
-
Bài giảng SQL Server 2008: Chương 5 - Nguyễn Đức Cương
72 p | 117 | 20
-
Tập bài giảng SQL Server
320 p | 70 | 19
-
Bài giảng SQL server 2005: Chương 5 - Phạm Mạnh Cương
15 p | 57 | 10
-
Bài giảng Kiến trúc cài đặt cơ sở dữ liệu - Chương 5 (phần 2): SQL server agent và replication
0 p | 113 | 9
-
Bài giảng SQL Server 2008: Chương 5 - Trần Thị Kim Chi
42 p | 72 | 9
-
Bài giảng Cơ sở dữ liệu: Chương 5
58 p | 78 | 9
-
Bài giảng Hệ quản trị CSDL - Chu Thị Hường
275 p | 63 | 8
-
Bài giảng SQL server 2
43 p | 52 | 7
-
Bài giảng Cơ sở dữ liệu: Chương 5 - TS. Nguyễn Quốc Tuấn
87 p | 73 | 7
-
Bài giảng Cơ sở dữ liệu nâng cao - Chapter 5: Automating administrative tasks
19 p | 79 | 7
-
Bài giảng Các hệ quản trị CSDL: Chương 5 - ĐH Sư phạm TP. HCM
65 p | 82 | 7
-
Bài giảng Hệ quản trị cơ sở dữ liệu: Chương 5 - Nguyễn Thị Uyên Nhi
28 p | 42 | 6
-
Bài giảng Kiến trúc cài đặt cơ sở dữ liệu - Chương 5 (phần 1): SQL server agent và replication
0 p | 102 | 5
-
Bài giảng Hệ quản trị cơ sở dữ liệu SQL Server: Chương 5 - Nguyễn Thị Mỹ Dung
24 p | 39 | 5
-
Bài giảng Microsoft SQL server: Chương 5 - Phạm Mạnh Cương
15 p | 67 | 4
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn