Tạo các STORED PROCEDURE

Một phần của tài liệu Báo cáo bài tập lớn môn hệ quản trị csdl Đề tài quản lý khách sạn (Trang 35 - 53)

/* ---TẠO STORED PROCEDURE HIỆN DỮ LIỆU (20 CÂU) ---*/

/*1. Tạo Stored Procedure có tham số truyền vào là tháng, năm cho biết những khách hàng

nào thuê phòng trong tháng đó.

--có tham số truyền vào là năm và tháng

*/

CREATE PROC [những khách hàng nào thuê phòng trong tháng đó] (@thang INT, @nam INT)

AS BEGIN

IF EXISTS(

SELECT FROM * tblChi_tiet_hoa_don_phong WHERE MONTH(sNgayThue) @thang = AND YEAR(sNgayThue) @nam=

)BEGIN

SELECT kh.sMaKH sTenKH, sGioiTinh, sSDTKH , FROM tblKhachHang kh

INNER JOIN tblHoaDon hd ON kh sMaKH = hd sMaKH. . INNER JOIN tblChi_tiet_hoa_don_phong p ON p sMaHD.

= hd.sMaHD

GROUP BY kh.sMaKH sTenKH, sGioiTinh, sSDTKH, , sNgayThue

HAVING MONTH(sNgayThue @thang ) = AND YEAR(sNgayThue) @nam=

END ELSEBEGIN

PRINT N'không có khách hàng nào thuê trong tháng

này' END

END

EXEC [những khách hàng nào thuê phòng trong tháng đó] 5, 2020

/*2. Tạo thủ tục để bổ sung thêm một bản ghi mới cho bảng [dbo].[tblNhanVien]

-có tham số truyền vào là tênnv, ngày sinh, giới tính, diachi, sdt, luong, phu cap, mapb

-với điều kiện:

+) ngày vào làm đủ 18 tuổi +) mã PB phải nhập đúng

+) Ngày vào làm phải <= Ngày hiện tại +) SDT phải có 10 hoặc 11 số

+) giới tính chỉ nhận giá trị là Nam hoặc Nu +) lương và phụ cấp phải lớn hơn 0

*/CREATE PROC [INSERTtblNhanVien] @ten ( NVARCHAR( ),20

@ngaysinh DATETIME, @gioitinh NVARCHAR(10), @diachi NVARCHAR( ),30 @sdt NVARCHAR(11), @luong FLOAT( ),2

@phucap FLOAT( ),2 @mapb INT, @ngayvaolam DATETIME) ASBEGIN

DECLARE @CHECK INT = 0

IF(DATEDIFF day( , @ngaysinh, @ngayvaolam) 365 18/ < ) BEGIN

PRINT N'chưa đủ 18 tuổi' SET @CHECK 1=

END IF NOT EXISTS(

SELECT FROM * tblBoPhanQuanLy WHERE sMaPB @mapb=

) BEGIN

PRINT N'Mã phòng ban chưa nhập đúng' SET @CHECK 1=

END

IF(@ngayvaolam > GETDATE()) BEGIN

PRINT N'Ngày vào làm phải nhỏ hơn hoặc bằng ngày hiện tại'

SET @CHECK 1= END

IF(LEN(@sdt 11 ) != ANDLEN(@sdt) != 10) BEGIN

PRINT N'Số điện thoại phải có 10 hoặc 11 chữ số' SET @CHECK 1=

END

IF(@gioitinh NOT IN ('Nam' 'Nu', )) BEGIN

PRINT N'giới tính chỉ nhận giá trị Nam hoặc Nữ' SET @CHECK 1=

END

IF(@luong 0 < OR @phucap < 0) BEGIN

PRINT N'Lương cơ bản và phụ cấp phải lớn hơn 0' SET @CHECK 1=

END IF(@CHECK 1= )

BEGIN

PRINT N'Mời bạn nhập lại' ROLLBACK

END ELSEBEGIN

INSERT INTO tblNhanVien(sTenNV, sNgaysinh , sGioiTinh, sDiaChi sSDT sLuongcb sPhuCap sMaPB , , , , ,

sNgayVaoLam)

VALUES (@ten, @ngaysinh, @gioitinh @diachi , ,

@sdt, @luong, @phucap, @mapb, @ngayvaolam) END END

EXEC [INSERTtblNhanVien] N'Đặng Thành Công','2002/5/20', 'Nam',N'thanh xuân', '0914133179', 10000000, 500000, 56, '2021/8/14'

/*3. Thêm bản ghi mới vào bảng chi tiết hóa đơn phòng với tham số truyền vào là

mã hóa đơn và chuỗi {{map1, ngaythue1, ngaytra1}, {map2, ngaythue2, ngaytra2},....}

mặc định giá phòng là giá phòng hiện tại

*/CREATE PROC [INSERTtbltblChi_tiet_hoa_don_phong] @mhd ( INT, @s NVARCHAR(1000))

ASBEGIN

IF NOT EXISTS(

SELECT FROM * tblHoaDon WHERE @mhd sMaHD= ) BEGIN

PRINT N'Mã hóa đơn nhập không đúng' RETURN

END

DECLARE @x NVARCHAR(1000)

SET @x =Replace Replace( (@s, '{','' '}' ''), , )

DECLARE contro CURSOR FOR SELECT FROM * STRING_SPLIT(@x, )','

OPEN contro

DECLARE @map NVARCHAR(10) DECLARE @ngaythue NVARCHAR(10) DECLARE @ngaytra NVARCHAR(10) FETCH NEXT FROM contro INTO @map WHILE @@FETCH_STATUS 0=

BEGIN

FETCH NEXT FROM contro INTO @ngaythue FETCH NEXT FROM contro INTO @ngaytra DECLARE @check INT = 0

IF NOT EXISTS(

SELECT FROM * tblPhong

WHERE CAST(@map AS INT) sMaP= )BEGIN

PRINT N'Không có phòng nào có mã phòng là ' + @map

SET @check 1 = END

IF(@ngaythue @ngaytra> ) BEGIN

PRINT N'Ngày thuê phải trước hoặc bằng ngày trả '

SET @check 1 = END

IF(@check 0= ) BEGIN

DECLARE @giap FLOAT(2)

SELECT @giap = sGiaP FROM tblPhong

WHERE @map sMaP= INSERT INTO

tblChi_tiet_hoa_don_phong

VALUES (CAST(@map AS INT), @mhd, CAST(@ngaythue AS DATETIME), CAST(@ngaytra AS

DATETIME), @giap ) END

FETCH NEXT FROM contro INTO @map CLOSE controEND

DEALLOCATE contro END

EXEC dbo.INSERTtbltblChi_tiet_hoa_don_phong 6, '{{4,2021/8/10,2021/8/15},{18,2021/8/10,2021/8/15}}'

--4. Tạo thủ tục thống kê tổng số hoá đơn đã lập của nhân viên có tên MNV truyền vào

CREATE OR ALTER PROC [tổng số hoá đơn đã lập của nhân viên] (@tennv NVARCHAR( ))20

ASBEGIN

IF EXISTS (

SELECT FROM * tblNhanVien WHERE sTenNV @tennv= )BEGIN

SELECT COALESCE COUNT( (*), ) 0 AS [tổng số hoá đơn đã lập] FROM tblNhanVien

INNER JOIN tblHoaDon ON tblNhanVien.sMaNV = tblHoaDon.sMaNV

WHERE sTenNV @tennv= ENDELSE

BEGIN

PRINT N'không có nhân viên tên '+ @tennv ENDEND

EXEC [tổng số hoá đơn đã lập của nhân viên] N'Đặng Thành Công'

/*

5. Tạo thủ tục có tham số truyền vào là tên loại dv, cho biết những khách hàng nào đã dùng loại dv này

*/

CREATE OR ALTER PROC [những khách hàng đã dùng loại dv]

(@tenloai NVARCHAR( ))20 AS

BEGIN

IF EXISTS (

SELECT FROM * tblLoaiDV WHERE sTenLoai = @tenloai ) BEGIN

SELECT kh.sMaKH sTenKH, sGioiTinh, sSDTKH , FROM tblKhachHang kh

INNER JOIN tblHoaDon hd ON kh sMaKH = . hd.sMaKH

INNER JOIN tblChi_tiet_hoa_don_dv cdv ON cdv.sMaHD hd= .sMaHD

INNER JOIN tblDichVu dv ON dv sMaDV . = cdv.sMaDV

INNER JOIN tblLoaiDV ldv ON ldv sMaLoai . = dv.sMaLDV

WHERE ldv sTenLoai @tenloai. =

GROUP BY kh.sMaKH sTenKH, sGioiTinh, , sSDTKH

END ELSEBEGIN

PRINT N'Không có loại dịch vụ này' END

END

EXEC [những khách hàng đã dùng loại dv] N' Ăn uống'

/*

6. Tạo thủ tục có tham số truyền vào là tên dịch vụ, cho biết có bao nhiêu khách hàng sử dụng dv trên

*/

CREATE PROC [tổng số khách hàng sử dụng dv] @tendv ( NVARCHAR( ))20

AS BEGIN

SELECT COUNT(kh.sMaKH) AS [tổng số KH] FROM tblKhachHang kh

WHERE kh.sMaKH IN (

SELECT sMaKH FROM tblHoaDon hd INNER JOIN tblChi_tiet_hoa_don_dv cdv ON cdv.sMaHD hd= .sMaHD

INNER JOIN tblDichVu dv ON dv sMaDV cdv.sMaDV . = WHERE dv sTenDV @tendv. =

GROUP BY sMaKH END)

EXEC [tổng số khách hàng sử dụng dv] N' Nhà hàng'

/*

7. Tạo thủ tục cho biết danh sách nhân viên đã lập hoá đơn trong ngày(năm/tháng/ngày) là

tham số truyền vào

*/CREATE OR ALTER PROC [cho biết danh sách nhân viên đã lập hoá đơn trong ngày] @ngay ( DATE)

AS

BEGIN

SELECT nv.sMaNV, sTenNV sNgaysinh, sNgayVaoLam , , sSDT, sDiaChi FROM tblNhanVien nv

INNER JOIN tblHoaDon hd ON nv.sMaNV = hd sMaNV. WHERE sNgayLap = @ngay

END

EXEC [cho biết danh sách nhân viên đã lập hoá đơn trong ngày]

'2020/10/28'

/*8. Tạo thủ tục tăng lương lên gấp rưỡi cho Nhân viên làm việc trên 5 năm.

*/CREATE PROC [tăng lương lên gấp rưỡi cho Nhân viên làm việc trên 5 năm]

ASBEGIN

UPDATE tblNhanVien SET sLuongcb *= 1.5

WHERE DATEDIFF day( , sNgayVaoLam, GETDATE()) / 365 >

5

ENDEXEC [tăng lương lên gấp rưỡi cho Nhân viên làm việc trên 5 năm]

/*--9. Tạo thủ tục lấy ra danh sách nhân viên theo giới tính và theo tuổi

- tuổi và giới tính truyền vào

*/

CREATE PROC [lấy ra danh sách nhân viên theo giới tính và tuổi](@gioitinh NVARCHAR( ), @tuoi INT)3

AS

BEGIN

SELECT FROM * tblNhanVien

WHERE sGioiTinh @gioitinh = AND DATEDIFF day( , sNgaysinh, GETDATE()) / 365 = @tuoi

END

EXEC [lấy ra danh sách nhân viên theo giới tính và tuổi] 'Nu', 24

/*--10 Tạo thủ tục tính tổng tiền thu được trong năm truyền vào

*/CREATE PROC tong_tien @nam ( INT) ASBEGIN

DECLARE @tongt FLOAT(2) = 0

SELECT @tongt += SUM(dv.sGiaNiemYet sSoLuong) * FROM tblHoaDon hd

INNER JOIN tblChi_tiet_hoa_don_dv dv ON hd.sMaHD = dv sMaHD.

WHERE YEAR( .hd sNgayLap @nam ) =

SELECT @tongt += SUM(hp.sGiaPhong DATEDIFF day* ( , sNgayThue, sNgayTra)) FROM tblHoaDon hd

INNER JOIN tblChi_tiet_hoa_don_phong hp ON hd.sMaHD = hp sMaHD.

WHERE YEAR( .hd sNgayLap @nam ) =

PRINTN'Tổng tiền thu được trong năm '+ CAST(@nam AS NVARCHAR( )) +10 N' là: '+ CAST(@tongt AS NVARCHAR(30)) ENDEXEC dbo.tong_tien 2019

/*

11. tạo thủ tục tăng phụ cấp nhân viên lập được nhiều hóa đơn nhất lên 500000

*/

CREATE PROC [tangpc]

ASBEGIN

UPDATE tblNhanVien SET sPhuCap 5000000= WHERE sMaNV IN (

SELECT sMaNV FROM tblHoaDon GROUP BY sMaNV

HAVING COUNT(sMaHD ) >= (SELECT MAX(tong) FROM(

SELECT COUNT(sMaHD) AS tong FROM tblHoaDon

GROUP BY sMaNV ) ) a

END)

EXEC [tangpc]

/*12. Viết thủ tục:

-- Tham số truyền vào: mã loại phòng

-- Thực hiện tăng giá phòng lên gấp rưỡi cho những phòng thuộc loại phòng

truyền vào

*/

CREATE PROC [tăng giá phòng lên gấp rưỡi] (@maloai NVARCHAR( ))10

ASBEGIN

UPDATE tblPhong SET sGiaP *= 1.5

WHERE @maloai = sLoaiP END

EXEC dbo.[tăng giá phòng lên gấp rưỡi] N'hangA'

/*13. Tạo thủ tục thêm bản ghi khách hàng tham số truyền vào tương ứng

*/CREATE PROC [INSERTtblKhachHang] @ten ( NVARCHAR(20) ,

@gioiTinh NVARCHAR( ),3 @cccd NVARCHAR( ),11 @sdt NVARCHAR( ))11

AS BEGIN

DECLARE @CHECK INT = 0

IF(LEN(@sdt 11 ) != ANDLEN(@sdt) != 10) BEGIN

PRINT N'Số điện thoại phải có 10 hoặc 11 chữ số' SET @CHECK 1=

END

IF(@gioitinh NOT IN ('Nam' 'Nu', )) BEGIN

PRINT N'giới tính chỉ nhận giá trị Nam hoặc Nữ' SET @CHECK 1=

END

IF(LEN(@cccd) 11!= ) BEGIN

PRINT N'Căn cước công dân phải đủ 11 chữ số' SET @CHECK 1=

END IF(@CHECK 1= )

BEGIN

PRINT N'Mời bạn nhập lại' ROLLBACK

ELSEEND

BEGIN

INSERT INTO tblKhachHang(sTenKH, sGioiTinh , sCCCD, sSDTKH)

VALUES (@ten, @gioiTinh @cccd @sdt, , ) END

END

EXEC dbo.INSERTtblKhachHang 'zzcongkunzz' 'Nam', , '01234567899' '0359872564',

/*

14. tạo thủ tục thêm hóa đơn tham số truyền vào tương ứng

*/CREATE PROC [INSERTtblHoaDon] @makh ( INT, @manv INT,

@ngaylap DATETIME) ASBEGIN

DECLARE @check INT = 0 IF NOT EXISTS(

SELECT FROM * tblNhanVien WHERE @manv sMaNV= ) BEGIN

PRINT N'Mã nhân viên nhập không đúng' SET @check 1=

END

IF NOT EXISTS(

SELECT FROM * tblKhachHang WHERE @makh sMaKH= ) BEGIN

PRINT N'Mã khách hàng nhập không đúng' SET @check 1=

END

IF (@ngaylap > GETDATE())

BEGIN

PRINT N'ngày lập hóa đơn phải trước hoặc bằng ngày hiện tại'

SET @check 1= END

IF(@CHECK 1= ) BEGIN

PRINT N'Mời bạn nhập lại' ROLLBACK

END ELSEBEGIN

INSERT INTO tblHoaDon(sMaKH, sMaNV , sNgayLap)

VALUES (@makh, @manv @ngaylap, ) END END

EXEC dbo.INSERTtblHoaDon 458, 374 ,'2021/8/14'

/*15. tạo thủ tục thêm dịch vụ với tham số truyền vào tương ứng

*/CREATE PROC [INSERTtblDichVU] @tendv ( NVARCHAR(20), @gia FLOAT(2), @maloai INT)

ASBEGIN

DECLARE @check INT = 0 IF(@gia <= ) 0

BEGIN

PRINT N'Giá phải lớn hơn 0' SET @check 1=

END IF NOT EXISTS(

SELECT FROM * tblLoaiDV WHERE @maloai = sMaLoai ) BEGIN

PRINT N'Không có loại dịch vụ nào' SET @check 1=

END IF(@CHECK 1= )

BEGIN

PRINT N'Mời bạn nhập lại' ROLLBACK

ELSEEND BEGIN

INSERT INTO tblDichVu

VALUES (@tendv, @gia, @maloai) END END

EXEC dbo.INSERTtblDichVU '4s', 1000000, 424

/*16. Thêm bản ghi mới vào bảng chi tiết dịch vụ với tham số truyền vào dạng chuỗi {{madv1, so luong},{madv2, so luong}, ...}

và mã Hóa đơn mặc định giá niêm yết là 110% giá dv

*/CREATE PROC [INSERTtbltblChi_tiet_hoa_don_dv](@mhd INT,

@s NVARCHAR(1000)) ASBEGIN

IF NOT EXISTS(

SELECT FROM * tblHoaDon WHERE @mhd sMaHD= ) BEGIN

PRINT N'Mã hóa đơn nhập không đúng'

RETURN END

DECLARE @x NVARCHAR(1000)

SET @x =Replace Replace( (@s, '{','' '}' ''), , ) DECLARE contro CURSOR FOR SELECT FROM * STRING_SPLIT(@x, )','

OPEN contro

DECLARE @madv NVARCHAR(10) FETCH NEXT FROM contro INTO @madv WHILE @@FETCH_STATUS 0=

BEGIN

DECLARE @sl INT

FETCH NEXT FROM contro INTO @sl IF NOT EXISTS(

SELECT FROM * tblDichVu WHERE CAST(@madv AS INT) = sMaDV

) BEGIN

PRINT N'Không có dịch vụ nào có mã là ' @madv+

END ELSEBEGIN

DECLARE @giany FLOAT( )2 SELECT @giany sGiaDV = * 1.1 FROM tblDichVu

WHERE @madv sMaDV= INSERT INTO

tblChi_tiet_hoa_don_dv

VALUES (@mhd, CAST(@madv AS INT), @sl, @giany)

FETCH NEXT FROMEND contro INTO @madv END

CLOSE contro DEALLOCATE contro END

EXEC dbo.INSERTtbltblChi_tiet_hoa_don_dv 6,'{{80,10},{95, 2}}'

/*17. Tạo thủ tục thống kê số lượng nhân viên của từng phòng ban

*/CREATE PROC [số lượng nhân viên của từng phòng ban]

ASBEGIN

SELECT sTenPB, COUNT(*)AS [số nhân viên] FROM tblBoPhanQuanLy ql

LEFT JOIN tblNhanVien nv ON ql sMaPB nv.sMaPB. = GROUP BY ql.sMaPB, ql.sTenPB

ENDEXEC [số lượng nhân viên của từng phòng ban]

/*

18. tạo thủ tục tính số phòng của từng loại phòng

*/

CREATE PROC [số phòng của từng loại phòng]

ASBEGIN

SELECT sLoaiP ,COUNT(sMaP) AS [số lượng] FROM tblPhong

GROUP BY sLoaiP ORDER BY COUNT(sMaP) END

EXEC [số phòng của từng loại phòng]

/*19. Tạo thủ thục thêm phòng với tham số truyền vào là loại phòng, giáp và số lượng phòng muốn thêm

*/CREATE PROC [INSERTtblPhong] @loaip ( NVARCHAR( ),10 @gia FLOAT(2), @sl INT)

ASBEGIN

DECLARE @i INT = 0

IF (@loaip != 'HangA' AND @loaip !='HangB'AND @loaip

!= 'HangC') BEGIN

PRINT N'Loại phòng chỉ nhận giá trị HangA hoặc HangB hoặc HangC'

RETURN WHILE(END@i @sl< ) BEGIN

INSERT INTO tblPhong VALUES (@loaip, @gia) SET @i += 1

ENDEND

EXEC dbo.INSERTtblPhong 'HangA', 150000, 10

/*

20. tạo PROC lấy ra khách hàng đã chi tiêu số tiền lớn hơn hoặc bằng số tiền truyền vào

*/

CREATE PROC [KH_tiềm_năng](@tt FLOAT( ))2 ASBEGIN

SELECT sTenKH sGioiTinh sSDTKH , , FROM tblHoaDon hd INNER JOIN tblKhachHang kh ON hd.sMaKH kh sMaKH= . LEFT JOIN (

SELECT sMaHD ,SUM(sGiaNiemYet * sSoLuong) AS [ttdv] FROM tblChi_tiet_hoa_don_dv cdv

GROUP BY sMaHD ) a ON a.sMaHD = hd sMaHD. LEFT JOIN (

SELECT sMaHD ,SUM(sGiaPhong * DATEDIFF day( , sNgayThue, sNgayTra)) AS [ttp] FROM

tblChi_tiet_hoa_don_phong cp GROUP BY sMaHD ) b ON b.sMaHD = hd sMaHD. GROUP BY sTenKH, sGioiTinh sSDTKH,

HAVING SUM ISNULL(( (ttdv, 0) +ISNULL( , ))) >=ttp 0 @tt END

EXEC dbo.KH_tiềm_năng 100000000

Một phần của tài liệu Báo cáo bài tập lớn môn hệ quản trị csdl Đề tài quản lý khách sạn (Trang 35 - 53)

Tải bản đầy đủ (PDF)

(77 trang)