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 (321.32 KB, 18 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
Phạm Nhật Duy
<b>Lớp: IE103.O23.CNVN </b>
<b>Sinh viên thực hiện: Lâm Tấn Nhật Minh 22520863 </b>
Tp. Hồ Chí Minh, 02/2024
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2"><b>---PHAN A--- </b>
<b>--Câu 1 Tham số vào là MSGV, TENGV, SODT, DIACHI, MSHH, NAMHH. Trước khi insert dữ liệu cần kiểm tra MSHH đã tồn tại trong table HOCHAM chưa, nếu chưa thì trả về giá trị 0. </b>
CREATE PROC SP_INSERTGV_MSHH
@MSGV INT, @TENGV NVARCHAR(30), @SODT VARCHAR(10), @DIACHI NVARCHAR(50), @MSHH INT, @NAMHH SMALLDATETIME AS
<b>-- INSERT KO THANH CONG </b>
EXEC SP_INSERTGV_MSHH @MSGV=00555, @TENGV=N'Nguyễn Thị C', @DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=4, @NAMHH='2010'
<b>-- INSERT THANH CONG </b>
EXEC SP_INSERTGV_MSHH 00999, N'Đỗ Phúc', '0987654321', N'Huế', 2, '2022'
<b>-- 1.2. KIEM TRA </b>
SELECT * FROM GIAOVIEN
<b>-- 1.3. KHOI PHUC DU LIEU </b>
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">DELETE FROM GIAOVIEN WHERE MSGV = 00999
<b>-- 1.4. XOA </b>
DROP PROC SP_INSERTGV_MSHH
<b>--Câu 2 Tham số vào là MSGV, TENGV, SODT, DIACHI, MSHH, NAMHH. Trước khi insert dữ liệu cần kiểm tra MSGV trong table GIAOVIEN có trùng khơng, nếu trùng thì trả về giá trị 0. </b>
CREATE PROC INSERTGV
@MSGV INT, @TENGV NVARCHAR(30), @SODT VARCHAR(10), @DIACHI NVARCHAR(50), @MSHH INT, @NAMHH SMALLDATETIME
AS BEGIN
IF EXISTS (SELECT * FROM GIAOVIEN WHERE MSGV = @MSGV) BEGIN
PRINT 'MSGV DA TON TAI' RETURN 0
<b>--INSERT KHONG THANH CONG </b>
EXEC INSERTGV @MSGV=00201, @TENGV=N'Nguyễn Thị C', @DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=4, @NAMHH='2010'
<b>--INSERT THANH CONG </b>
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">EXEC INSERTGV @MSGV=00999, @TENGV=N'Nguyễn Thị C', @DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=2, @NAMHH='2010'
<b>--2.2 KIEM TRA </b>
SELECT * FROM GIAOVIEN
<b>--2.3 KHOI PHUC DU LIEU </b>
DELETE FROM GIAOVIEN WHERE MSGV = 00999
<b>--2.4 XOA </b>
DROP PROC INSERTGV
<b>--Câu 3 Giống (1) và (2) kiểm tra xem MSGV có trùng khơng? MSHH có tồn tại chưa? Nếu MSGV trùng thì trả về 0. Nếu MSHH chưa tồn tại trả về 1, ngược lại cho insert dữ liệu. </b>
CREATE PROC INSERTGV2
@MSGV INT, @TENGV NVARCHAR(30), @SODT VARCHAR(10), @DIACHI NVARCHAR(50), @MSHH INT, @NAMHH SMALLDATETIME
AS BEGIN
IF EXISTS (SELECT * FROM GIAOVIEN WHERE MSGV = @MSGV) BEGIN
PRINT 'MSGV DA TON TAI' RETURN 0
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">INSERT INTO GIAOVIEN VALUES (@MSGV, @TENGV, @DIACHI, @SODT, @MSHH, @NAMHH)
PRINT 'THEM THANH CONG' END
<b>--3.1 THUC THI --TH1: MSGV TRÙNG </b>
EXEC INSERTGV2 @MSGV=00201, @TENGV=N'Nguyễn Thị C',
@DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=2, @NAMHH='2010'
<b>--TH2: MSHH CHƯA TỒN TẠI </b>
EXEC INSERTGV2 @MSGV=00998, @TENGV=N'Nguyễn Thị C',
@DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=4, @NAMHH='2010'
<b>--TH3: THEM THANH CONG </b>
EXEC INSERTGV2 @MSGV=00999, @TENGV=N'Nguyễn Thị C',
@DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=2, @NAMHH='2010'
<b>--3.2 KIEM TRA </b>
SELECT * FROM GIAOVIEN
<b>--3.3 KHOI PHUC DU LIEU </b>
DELETE FROM GIAOVIEN WHERE MSGV = 00999
<b>--3.4 XOA </b>
DROP PROC INSERTGV2
<b>--Câu 4 Đưa vào MSDT cũ, TENDT mới. Hãy cập nhật tên đề tài mới với mã đề tài cũ không đổi nếu không tìm thấy trả về 0, ngược lại cập nhật và trả về 1. </b>
CREATE PROC INSERT_DT
@MSDT CHAR(6), @TENDETAI NVARCHAR(30)
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">AS BEGIN
IF NOT EXISTS (SELECT * FROM DETAI WHERE @MSDT = MSDT) BEGIN
PRINT 'MSDT KHONG TON TAI' RETURN 0
END
UPDATE DETAI
SET TENDT = @TENDETAI WHERE MSDT = @MSDT RETURN 1
END
<b>--4.1 THUC THI </b>
<b>--TH1: MSDT KHONG TON TAI </b>
EXEC INSERT_DT @MSDT = 97999, @TENDETAI = 'HOC MAY'
<b>--TH2: THANH CONG </b>
EXEC INSERT_DT @MSDT = 97005, @TENDETAI = 'HOC MAY'
<b>--4.2 KIEM TRA </b>
SELECT * FROM DETAI WHERE MSDT = 97005
<b>--4.3 KHOI PHUC DU LIEU </b>
EXEC INSERT_DT @MSDT = 97005, @TENDETAI = N'Xử lý ảnh'
<b>--4.4 XOA </b>
DROP PROC INSERT_DT
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7"><b>--Câu 5 Tham số đưa vào MSSV, TENSV mới, DIACHI mới. Hãy cập nhật sinh viên trên với MSSV khơng đổi, nếu khơng tìm thấy trả về 0, ngược lại cập nhật và trả về 1. </b>
CREATE PROC INSERT_SV
@MSSV INT, @TENSV NVARCHAR(30), @DIACHI NCHAR(30) AS
DIACHI = @DIACHI WHERE MSSV = @MSSV
PRINT 'CAP NHAT THANH CONG' RETURN 1
END
<b>--5.1 THUC THI </b>
<b>--TH1 MSSV KHONG TON TAI </b>
EXEC INSERT_SV @MSSV = 13529999, @TENSV = 'NGUYENVANA', @DIACHI = 'THU DUC'
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8"><b>--5.3 KHOI PHUC DU LIEU </b>
EXEC INSERT_SV @MSSV = 13520001, @TENSV = N'Nguyễn Văn An', @DIACHI = N'THỦ ĐỨC'
<b>--5.4 XOA </b>
DROP PROC INSERT_SV
<b>---PHAN B--- </b>
<b>--Câu 1 Đưa vào TENHV trả ra: Số GV thỏa học vị, nếu không tìm thấy trả về 0. </b>
CREATE PROC SP_SOGVTHOAHOCVI @TENHV NVARCHAR(20), @SOGV INT OUTPUT
AS BEGIN
IF NOT EXISTS (SELECT * FROM HOCVI WHERE TENHV = @TENHV) BEGIN
<b>-- 1.1. THUC THI VA KIEM TRA </b>
DECLARE @SOGV INT, @TENHV NVARCHAR(20) SET @TENHV = N'Thạc sĩ'
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">EXEC SP_SOGVTHOAHOCVI @TENHV, @SOGV OUTPUT
PRINT N'Số GV có học vị ' + @TENHV + N' là: ' + CAST(@SOGV AS VARCHAR)
<b>-- 1.2. XOA </b>
DROP PROC SP_SOGVTHOAHOCVI
<b>--Câu 2 Đưa vào MSDT cho biết: Điểm trung bình của đề tài, nếu khơng tìm thấy trả về 0. </b>
CREATE PROC AVERAGE_DIEMDT
@MSDT CHAR (6), @DTB FLOAT OUTPUT AS
SELECT @DTB = ((SUM(GV_HDDT.DIEM) + SUM(GV_PBDT.DIEM)+
SUM(GV_UVDT.DIEM)) / (count(GV_HDDT.DIEM) + count(GV_PBDT.DIEM)+ count(GV_UVDT.DIEM)))
FROM DETAI, GV_HDDT, GV_PBDT, GV_UVDT
WHERE GV_HDDT.MSDT = @MSDT AND GV_PBDT.MSDT = @MSDT AND GV_UVDT.MSDT = @MSDT
RETURN 1 END
<b>--2.1 THUC THI VA KIEM TRA </b>
DECLARE @DTB FLOAT, @MSDT CHAR(6) SET @MSDT = 97005
EXEC AVERAGE_DIEMDT @MSDT, @DTB OUTPUT
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">PRINT N'Điểm trung bình của đề tài có mã số ' + @MSDT + N' là: ' + CAST(@DTB AS VARCHAR)
<b>--2.2 XOA </b>
DROP PROC AVERAGE_DIEMDT
<b>--Câu 3 Đưa vào TENGV trả ra: SDT của giáo viên đó, nếu khơng tìm thấy trả về 0. Nếu trùng tên thì có báo lỗi khơng? Tại sao? Làm sao để hiện thơng báo có bao nhiêu giáo viên trùng tên và trả về các SDT. </b>
CREATE PROC GV_SDT
@TENGV NVARCHAR(30), @SODT NVARCHAR(30) OUTPUT, @SOGVTRUNG INT OUTPUT
AS BEGIN
<b>--KIỂM TRA XEM CÓ BAO NHIÊU GIÁO VIÊN TRÙNG TÊN </b>
SELECT @SOGVTRUNG = COUNT(*) FROM GIAOVIEN
WHERE TENGV = @TENGV
IF @SOGVTRUNG = 0 BEGIN
SET @SODT = 0 RETURN 0 END
<b>--CÓ NHIỀU GIÁO VIÊN TRÙNG TÊN </b>
IF @SOGVTRUNG > 1 BEGIN
SET @SODT = N'Có nhiều sdt khớp với tên giáo viên trên' SELECT SODT
FROM GIAOVIEN
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">WHERE TENGV = @TENGV END
<b>--CHỈ CÓ 1 GIÁO VIÊN TRÙNG TÊN </b>
ELSE BEGIN
SELECT @SODT = SODT FROM GIAOVIEN
WHERE TENGV = @TENGV END
END
<b>***Với đoạn lệnh sql trên thì khi có nhiều giáo viên có trùng tên, nó sẽ đưa ra bảng gồm nhiều tên và sdt, trong dòng message sẽ in ra biến @SODT đã gán vào chuỗi ký tự thông báo là có nhiều giáo viên trùng tên. Cịn nếu chỉ có 1 tên khớp thì nó sẽ đưa ra sdt của người đó ngay. </b>
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">DELETE FROM GIAOVIEN WHERE MSGV = 00206
<b>--3.3 XOA </b>
DROP PROC GV_SDT
<b>--Câu 4 Đưa vào MSHD cho biết: Điểm trung bình các đề tài của hội đồng đó. </b>
CREATE PROC AVERAGE_DT_DIEM @MSHD INT, @DTB FLOAT OUTPUT AS
BEGIN
SELECT @DTB = ((SUM(hd.DIEM) + SUM(uv.DIEM)+ SUM(pb.DIEM)) / (count(hd.DIEM) + count(uv.DIEM)+ count(pb.DIEM)))
FROM HOIDONG , GV_HDDT HD, GV_PBDT PB,GV_UVDT UV
WHERE HOIDONG.MSGV=HD.MSGV AND HOIDONG.MSGV=UV.MSGV AND HOIDONG.MSGV=PB.MSGV AND HOIDONG.MSHD=@MSHD
DROP PROC AVERAGE_DT_DIEM
<b>--Câu 5 Đưa vào TENGV cho biết: Số đề tài hướng dẫn, số đề tài phản biện do giáo viên đó phụ trách. Nếu trùng tên thì có báo lỗi khơng hay hệ thống sẽ đếm tất cả các đề tài của những giáo viên trùng tên đó? </b>
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">ON DETAI
INSTEAD OF DELETE AS
BEGIN
DECLARE @MSDT CHAR(6)
SELECT @MSDT = MSDT FROM DELETED
-- XOA CAC BANG LIEN QUAN
DELETE SV_DETAI WHERE MSDT = @MSDT DELETE GV_HDDT WHERE MSDT = @MSDT DELETE GV_PBDT WHERE MSDT = @MSDT DELETE GV_UVDT WHERE MSDT = @MSDT DELETE HOIDONG_DT WHERE MSDT = @MSDT
-- XOA BANG DETAI
DELETE DETAI WHERE MSDT = @MSDT END
<b>-- 1.1. KIEM TRA </b>
SELECT * FROM DETAI
SELECT * FROM HOIDONG_DT
DELETE FROM DETAI WHERE MSDT = '97005'
<b>-- 1.2. KHOI PHUC DU LIEU </b>
INSERT INTO DETAI VALUES('97005',N'Xử lý ảnh') INSERT INTO SV_DETAI VALUES('13520002','97005') INSERT INTO SV_DETAI VALUES('13520006','97005') INSERT INTO GV_HDDT VALUES(00203,'97005',9)
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">INSERT INTO GV_PBDT VALUES(00201,'97005',8) INSERT INTO GV_UVDT VALUES(00205,'97005',8) INSERT INTO GV_UVDT VALUES(00202,'97005',7) INSERT INTO GV_UVDT VALUES(00204,'97005',9) INSERT INTO HOIDONG_DT VALUES(1,'97005',N'Được')
<b>-- 1.3. XOA </b>
DROP TRIGGER TRIG_XOATHONGTINDETAI
<b>--Câu 2 Tạo Trigger thỏa mãn ràng buộc là khi đổi 1 mã số giáo viên (MSGV) thì sẽ thay đổi các thơng tin liên quan. </b>
CREATE TRIGGER UPDATE_MSGV ON GIAOVIEN
AFTER UPDATE AS
BEGIN
IF UPDATE(MSGV) BEGIN
DECLARE @MSGV CHAR(6), @OLD CHAR(6) SELECT @MSGV = MSGV FROM INSERTED SELECT @OLD = MSGV FROM DELETED
UPDATE GV_HV_CN SET MSGV = @MSGV WHERE MSGV = @OLD
UPDATE GV_HDDT SET MSGV = @MSGV WHERE MSGV = @OLD
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">UPDATE GV_PBDT SET MSGV = @MSGV WHERE MSGV = @OLD
UPDATE GV_UVDT SET MSGV = @MSGV WHERE MSGV = @OLD
UPDATE HOIDONG_GV SET MSGV = @MSGV WHERE MSGV = @OLD END
<b>--2.1 KIEM TRA </b>
SELECT * FROM GIAOVIEN SELECT * FROM GV_UVDT
UPDATE GIAOVIEN SET MSGV = 00999 WHERE MSGV = 00201
<b>--2.2 XOA </b>
DROP TRIGGER UPDATE_MSGV
<b>--Câu 3 Tạo Trigger thỏa mãn ràng buộc là một hội đồng không quá 10 đề tài. Dùng “Group by” có được khơng? Giải thích. </b>
CREATE TRIGGER HD_KHONGQUA_10DT ON HOIDONG_DT
FOR INSERT AS
BEGIN
DECLARE @MSHD INT
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">SELECT @MSHD = MSHD FROM INSERTED
IF(SELECT COUNT(*) FROM HOIDONG_DT WHERE MSHD = @MSHD GROUP BY MSHD) > 10
BEGIN
PRINT 'HOI DONG NAY KHONG DUOC QUA 10 DE TAI' ROLLBACK TRANSACTION
END END
***Dùng group by được vì ta dùng hàm count để đếm số đề tài mà hội đồng đó đăng kí nên sẽ cần GROUP BY MSHD
<b>--3.1 KIEM TRA </b>
<b>---VI TALBE DETAI KHONG CO DU SO LUONG DE TAI DANG KI </b>
INSERT DETAI VALUES ('97007',N'Quản lý thư viện'), ('97008',N'Quản lý thư viện'),
('97009',N'Quản lý thư viện'), ('97010',N'Quản lý thư viện'), ('97011',N'Quản lý thư viện');
INSERT HOIDONG_DT VALUES (1,'97003',N'Được'), (1,'97004',N'Được'),
(1,'97006',N'Được'), (1,'97007',N'Được'), (1,'97008',N'Được'), (1,'97009',N'Được'), (1,'97010',N'Được'), (1,'97011',N'Được');
DELETE HOIDONG_DT WHERE MSDT IN
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">RETURN @DTB END
<b>--1.1 KIEM TRA THONG QUA CAU 2 CO SU DUNG FUNCTION TREN --1.2 XOA </b>
DROP FUNCTION TINH_DTB_DT
<b>--Câu 2 Trả về kết quả của đề tài theo MSDT nhập vào. Kết quả là DAT nếu như điểm trung bình từ 5 trở lên, và KHONGDAT nếu như điểm trung bình dưới 5. </b>
CREATE FUNCTION KETQUADT(@MSDT CHAR(6)) RETURNS VARCHAR(10)
AS BEGIN
DECLARE @DTB FLOAT
SELECT @DTB = DBO.TINH_DTB_DT(MSDT) FROM DETAI
WHERE MSDT = @MSDT IF(@DTB >= 5)
PRINT DBO.TINH_DTB_DT(@MSDT)
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18"><b>--2.2 XOA </b>
DROP FUNCTION KETQUADT
</div>