Bài giảng SQL server: Chương 5 - Lê Thị Minh Nguyện

28 20 0
Bài giảng SQL server: Chương 5 - Lê Thị Minh Nguyện

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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.

10/03/2015 TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG 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  Thủ tục có lệnh trả Return  Sử dụng bảng tạm thủ tục  Tham số cursor bên thủ tục  Giao tác (Transaction) 10/03/2015 1.Khái niệm  Store procedure (thủ tục): tập hợp chứa dòng lệnh, biến cấu trúc điều khiển ngôn ngữ Transaction-SQL dùng để thực hành động  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ị  Trong thủ tục nội phép gọi thực thi thủ tục nội khác  Có tính cục bên sở liệu lưu trữ thủ tục  Có thể gọi thực môi trường Microsoft SQL Server 1.Khái niệm Lợi ích thủ tục  Tốc độ xử lý thủ tục nội nhanh  Việc tổ chức phân chia xử lý thành hai nơi khác nhau: máy chủ máy trạm giúp giảm thời gian xây dựng ứng dụng Thủ tục hệ thống  Bắt đầu chữ sp_ hầu hết tất thủ tục hệ thống lưu trữ bên CSDL Master 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 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) 10/03/2015 2.Thủ tục Ví dụ 1: cho lược đồ CSDL 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 có doanh số bán cao 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)) 10/03/2015 2.Thủ tục Gọi thực 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 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)) 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 % = Then 29 Else 28 End Return @SN 10/03/2015 3.Thủ tục với tham số đầu vào Gọi thực thủ tục Declare @SN int Exec @SN = spr_ngaytrongthang 2,2015 print 'So 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ị phiếu xuất hàng hoá với tham số vào số phiếu xuất với kiểu liệu 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 thủ tục Exec sp_TongTGXuat ‘PX01’  Hoặc: Exec sp_TongTGXuat @SoPX=‘PX01’ 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 mặt hàng đơn đặt hàng có tham số vào số đặt hàng 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 thủ tục: Exec sp_TinhSLDat ‘DH01’, ‘Fe’ Hoặc Exec sp_TinhSLDat @MaMH = ‘Fe’, @SoDH = ‘DH01’ 10/03/2015 3.Thủ tục với tham số đầu vào  Tạo thủ tục thêm liệu vào bảng MAT_HANG với tên sp_MATHANG_Them gồm có tham số vào giá trị thêm cho cột 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 ràng buộc liệu phải hợp lệ trước thực lệnh INSERT INTO để thêm liệu vào bảng MAT_HANG  Mã mặt hàng phải  Tỷ lệ phần trăm phải nằm miền giá trị đế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 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 100 IF @PhamTram NOT BETWEEN AND 100 BEGIN SET @ErrMsg = ‘Tỷ lệ phần trăm nằm đoạn [0, 100]’ RAISERROR(@ErrMsg, 16, 1) Return END Khi RBTV hợp lệ thêm 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 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 5.Thủ tục có lệnh trả Return  Gọi thực 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 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 bảng tạm cục (##): tạo bảng tạm toàn cục 14 10/03/2015 6.Sử dụng bảng tạm thủ tục Tạo thủ tục đưa vào năm tháng cho biết mặt hàng bán doanh thu cao 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 @TenMH=TenMH, @Tongtien = TT From #DoanhThu 6.Sử dụng bảng tạm 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ó liệu tính tố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 thủ tục Tham số cursor trả danh sách dòng liệu theo điều kiện chọn lọc Cursor chia làm phần: bên thủ tục bên thủ tục  Các hành động thủ tục:định nghĩa liệu cho biến kiểu cursor mở cursor  Các hành động bên ngồi thủ tục: đọc dịng liệu bên cursor sau đóng cursor lại 7.Tham số cursor bên thủ tục Tạo thủ tục trả danh sách mã vật tư bán nhiều năm tháng Bước 1: tạo thủ tục có tham số kiểu liệu cursor chứa danh sách mặt hàng bán nhiều 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 thủ tục Kiểm tra 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ó liệu phát sinh DROP Table #TongSLBan Return 7.Tham số cursor bên thủ tục Bước 2: đọc cursor, đón nhận danh sách mã mặt hàng bán nhiều 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 = Begin Print ‘danh sách 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 năm tháng đị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 giao tác 8.1.Khái niệm Một giao tác đơn vị xử lý nguyên tố gồm nhiều hành động Khi thực giao tác phải thực tất hành động khơng thực hành động hết Giao tác loại CSDL quan hệ lớn sử dụng trường hợp mà hành động cập nhật liệu nhiều bảng khác thực đơn vị (unit) 18 10/03/2015 8.2.Các tính chất Tính nguyên tố (Atomicity) Tính quán (Consistency)  Một giao tác phải biến csdl từ trạng thái quán sang trạng thái quán khác Tính độc lập (Isolation)  Một giao tác phải thực độc lập với giao tác khác xử lý đồng thời với Tính bền vững (Durability)  Tất thay đổi liệu thao tác thực phải ghi nhận bền vững csdl 8.3.Giao tác không tường minh Mặc định lệnh bên lô (batch) chứa câu lệnh khơng tường minh, điều có nghĩa có câu lệnh thực khơng thành cơng lơ tất lệnh cịn lại khơng ghi nhận lại 19 10/03/2015 8.3.Giao tác khơng tường minh Ví dụ: cho thực lúc lệnh để cập nhật liệu vào bảng khác lô Thêm mặt hàng 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 Vi phạm toàn vẹn DL Where MaDH = ‘DH001’ khóa ngoại Nên lệnh GO trứơc khơng thực 8.4.Giao tác tường minh Giao tác tường minh trường hợp cập nhật liệu nhiều bảng khác phải đảm bảo hành động nằm đơn vị xử lý 20 10/03/2015 8.4.Giao tác tường minh Bắt đầu giao tác  BEGIN TRAN[SACTION] Kết thúc giao tác không [Tên_giao_tác] ghi nhận lại hành động cập nhật liệu bên giao tác Kết thúc giao tác  ROLLBACK TRAN[SACTION] [Tên_giao_tác] Hoặc  COMMIT TRAN[SACTION] [Tên_giao_tác] Kết thúc giao tác đồng ý ghi nhận lại hành động cập nhật liệu bên giao tác 8.4.Giao tác tường minh  Ví dụ Begin tran cap1 insert into #test values(1,'aaa') begin tran cap2 insert into #test values(2,'bbb') begin tran cap3 insert into #test values(3,'ccc') commit tran cap3 go commit tran cap2 go rollback tran cap1 21 10/03/2015 8.5.Phân vùng giao tác Ta chia nhỏ hành động bên giao tác thành nhiều phần, tương ứng phần nhỏ ta dễ dàng chủ động đồng ý ghi nhận không ghi nhận lại việc cập nhật liệu Cú pháp SAVE TRAN[SACTION] [Tên vùng] Các lệnh 8.5.Phân vùng giao tác  Ví dụ: Begin tran Vùng SAVE TRAN Vung_1_2 insert into #test values(1,'aaa') insert into #test values(2,'bbb') Vùng SAVE TRAN Vung_3 insert into #test values(3,'ccc') RollBack Tran Vung_3 Commit Tran Vung_1_2 Chỉ có mẩu tin thứ thứ ghi nhận lại 22 10/03/2015 8.6.Kiểm tra lỗi bên giao tác Biến hệ thống @@ERROR kiểm tra kết câu lệnh thực gần (ERROR trả thực thành cơng) Ví dụ Thực việc cấp phát chứng từ tự động cho bảng DONDH, PNHAP, PXUAT đảm bảo số khơng bị trùng lắp lúc có nhiều người sử dụng lập chứng từ liên quan  B1 Xây dựng bảng CAPCTU dùng lưu trữ số chứng từ cấp cho bảng gồm: tên bảng (khố chính), số chứng từ, ký tự đầu  B2: Lần lượt thêm dòng liệu vào bảng CAPCTU  B3: Xây dựng thủ tục cấp số chứng từ tự động đảm bảo không trùng lắp  B4: Gọi thực thủ tục để có chứng từ bảng PNHAP 23 10/03/2015 Ví dụ  B1 Xây dựng bảng CAPCTU dùng lưu trữ số chứng từ cấp cho bảng gồm: tên bảng (khố chính), số chứng từ, ký tự đầu Create table CAPCTU ( tenbang char(20), soctu int, kytu char(1), primary key(tenbang) ) Ví dụ B2: thêm dòng liệu vào bảng CAPCTU INSERT INTO CAPCTU VALUES('DonDH',100,'D') INSERT INTO CAPCTU VALUES('PNhap',100,'N') INSERT INTO CAPCTU VALUES('PXuat',100,'X') 24 10/03/2015 Ví dụ B3: xây dựng thủ tục cấp số chứng từ tự động đảm bảo không trùng lắp CREATE PROC spud_cap_soctu_ke @stenbang char(20), @sSoctuke char(4) OUTPUT AS DECLARE @nError int, @nRowCount int, @nSoctuke int, @sChuoiTam char(4), @sKytu char(1) Begin Tran Tang so chung tu ke tiep UPDATE CAPCTU SET soctu=soctu+1 WHERE tenbang=@sTenbang Ví dụ kiem tra viec tang co cong khong? SELECT @nError=@@Error, @nRowCount=@@rowcount Neu co loi hoac khong cap nhat duoc mau tin nao IF @nError0 or @nRowCount1 BEGIN Rollback tran return -999 END 25 10/03/2015 Ví dụ Lay so chung tu ma ta da tang cong SELECT @nSoctuke=SOCTU,@skytu=kytu FROM CAPCTU WHERE tenbang=@stenbang kiem tra viec lay du lieu co cong khong SELECT @nError=@@ERROR, @nRowCount=@@rowcount Ví dụ Nếu có lỗi khơng lấy đươc mẩu tin IF @nError0 or @nRowCount1 BEGIN rollback tran return -998 end Tính số chứng từ khơng có lỗi hết SET @SchuoiTam = LTRIM(STR(@nSoctuke)) SET @sSoctuke=@skytu+@sChuoiTam COMMIT TRAN RETURN 26 10/03/2015 Ví dụ B4: Gọi thực thủ tục để có chứng từ bảng PNHAP DECLARE @sSoctu char(4),@nGttv int EXEC @nGttv=spud_Cap_Soctu_ke 'PNhap',@sSoctu OUTPUT IF @nGttv0 print 'co loi cap so chung tu, xem lai ' else print 'So chung tu moi la: '+@sSoctu Kết quả: So chung tu moi la: N101 27 10/03/2015 TRƯỜNG CAO ĐẲNG CƠNG NGHỆ THƠNG TIN THÀNH PHỐ HỒ CHÍ MINH 28 ... Replicate(? ?-? ??, 50 ) End End ELSE Print ‘khơng có bán hàng năm tháng định’ 17 10/03/20 15 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... không thực 8.4.Giao tác tường minh Giao tác tường minh trường hợp cập nhật liệu nhiều bảng khác phải đảm bảo hành động nằm đơn vị xử lý 20 10/03/20 15 8.4.Giao tác tường minh Bắt đầu giao tác  BEGIN... không tường minh Mặc định lệnh bên lô (batch) chứa câu lệnh khơng tường minh, điều có nghĩa có câu lệnh thực khơng thành cơng lơ tất lệnh cịn lại khơng ghi nhận lại 19 10/03/20 15 8.3.Giao tác

Ngày đăng: 09/05/2021, 18:41

Tài liệu cùng người dùng

Tài liệu liên quan