Professional Documents
Culture Documents
Ôn Tập1
Ôn Tập1
Đề 1:
Cho một phần lược đồ CSDL quan hệ quản lý đề án trong công ty gồm:
NHANVIEN(MANV, HOTEN, NGSINH, DCHI, DT)
Mô tả: Mỗi nhân viên phải có mã số (MANV) duy nhất để phân biệt với các
nhân viên khác, có họ tên
(HOTEN), ngày sinh (NGSINH), địa chỉ (DCHI) và điện thoại(DT).
DEAN(MADA, TENDA, DIADIEMDA)
Mô tả: Mỗi đề án có mã số (MADA) duy nhất để phân biệt với các đề án
khác, có tên đề án (TENDA) và
có địa điểm để thực hiện đề án (DIADIEMDA).
PHANCONG(MANV, MADA, SOBUOILV)
Mô tả: Để thực hiện đề án thì phải phân công cho từng nhân viên (MANV)
làm đề án (MADA) nào và có
số buổi làm việc (SOBUOILV) cho đề án đó.
Sinh viên thực hiện các yêu cầu sau:
Câu 1: (2.5 điểm) Thêm vào bảng NHANVIEN (Nhân viên) một cột: Số đề án đã
thực hiện (SODATH).
Viết 1 Stored Procedure có sử dụng cơ chế Cursor để cập nhật vào cột số đề
án đã thực hiện (SODATH)
với tổng số đề án mà mỗi nhân viên đã được phân công làm.
Câu 2: (2.5 điểm) Viết 1 Function với 1 tham số truyền vào là mã nhân viên
(MANV), trả về là Tổng số
đề án mà nhân viên này đã được phân công làm.
Câu 3: (2.5 điểm) Viết 1 Stored Procedure với các tham số truyền vào: mã nhân
viên (MANV), mã đề án
(MADA), số buổi làm việc (SOBUOILV). Trước khi chèn (Insert) dữ liệu
vào bảng PHANCONG phải
kiểm tra MANV có trong bảng nhân viên chưa? Phải kiểm tra MADA có
trong bảng đề án chưa? Kiểm
tra dữ liệu trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn dữ liệu.
Câu 4: (2.5 điểm) Viết 1 Trigger kiểm tra khi chèn dữ liệu vào bảng NHANVIEN
thì cần phải kiểm tra
tuổi của nhân viên, những nhân viên có tuổi từ 25 đến 50 tuổi mới được
chèn, ngược lại không cho chèn
dữ liệu và thông báo lỗi.
/*Câu 1: (2.5 điểm) Thêm vào bảng NHANVIEN (Nhân viên) một cột: Số đề án đã
thực hiện (SODATH).
Viết 1 Stored Procedure có sử dụng cơ chế Cursor để cập nhật vào cột số đề án đã
thực hiện (SODATH) với tổng số đề án mà mỗi nhân viên đã được phân công
làm.*/
/*Câu 2: (2.5 điểm) Viết 1 Function với 1 tham số truyền vào là mã nhân viên
(MANV), trả về là Tổng số đề án mà nhân viên này đã được phân công làm*/
CREATE FUNCTION F_CAU2
(
@MANV INT --truyền vào là mã nhân viên (MANV)
)
RETURNS INT
AS
BEGIN
DECLARE @TONGSODA INT
SELECT @TONGSODA=COUNT(MADA)
FROM PHANCONG
WHERE MANV=@MANV
GROUP BY MANV
RETURN @TONGSODA
END
/*Câu 3: (2.5 điểm) Viết 1 Stored Procedure với các tham số truyền vào: mã nhân
viên (MANV), mã đề án (MADA), số buổi làm việc (SOBUOILV). Trước khi
chèn (Insert) dữ liệu vào bảng PHANCONG phải kiểm tra MANV có trong bảng
nhân viên chưa? Phải kiểm tra MADA có trong bảng đề án chưa? Kiểm tra dữ liệu
trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn dữ liệu.*/
CREATE PROC SP_CAU3
(
@MANV INT,
@MADA INT,
@SOBUOILV INT
)
AS
BEGIN
IF NOT EXISTS(SELECT MANV FROM NHANVIEN WHERE MANV =
@MANV ) --dữ liệu vào bảng PHANCONG phải kiểm tra MANV có trong bảng
nhân viên chưa?
PRINT N'MA NHAN VIEN:' + CAST (@MANV AS VARCHAR(2)) +
N'KHONG CO TRONG BANG NHAN VIEN'
ELSE
END
/*Câu 4: (2.5 điểm) Viết 1 Trigger kiểm tra khi chèn dữ liệu vào bảng
NHANVIEN thì cần phải kiểm tra tuổi của nhân viên, những nhân viên có tuổi từ
25 đến 50 tuổi mới được chèn, ngược lại không cho chèn
dữ liệu và thông báo lỗi.*/
Đề 2:
Mô tả: Mỗi mặt hàng (MAMH) thuộc một chi tiết hóa đơn (MAHD), có số lượng (SL)
và đơn giá (DG).
1. Viết 1 Stored Procedure có sử dụng cơ chế cursor để tìm và in ra danh sách các
hóa đơn có tổng tiền.
2. Viết 1 Function truyền vào mã mặt hàng, trả về tổng số lượng hàng đã bán trong
ngày hiện tại.
3. Viết 1 Stored Procedure có sử dụng cơ chế cursor để cập nhật cột tổng tiền
(TONGTIEN) cho bảng hóa đơn, dựa vào số lượng (SL) và đơn giá (DG) ở bảng
chi tiết hóa đơn cho mỗi hóa đơn.
4. Viết 1 Trigger kiểm tra với mỗi hóa đơn thì ta có: TONGTIEN = SUM(SL*DG)
/*1.Viết 1 Stored Procedure có sử dụng cơ chế cursor để tìm và in ra danh sách các
hóa đơn có tổng tiền.*/
GO
CREATE PROC SP_CAU1
AS
BEGIN
DECLARE TEO CURSOR FOR SELECT MAHD, NGAYLHD, TONGTIEN
FROM HOADON
DECLARE @MAHD INT,
@NGAYLHD DATETIME,
@TONGTIEN FLOAT
OPEN TEO
FETCH NEXT FROM TEO INTO @MAHD, @NGAYLHD,
@TONGTIEN
WHILE @@FETCH_STATUS=0
BEGIN
PRINT @MAHD, @NGAYLHD, @TONGTIEN
FETCH NEXT FROM TEO INTO @MAHD, @NGAYLHD,
@TONGTIEN
END
CLOSE TEO
DEALLOCATE TEO
END
/*2.Viết 1 Function truyền vào mã mặt hàng, trả về tổng số lượng hàng đã bán
trong ngày hiện tại*/
CREATE FUNCTION F_CAU2
(
@MAHD INT
)
RETURNS INT
AS
BEGIN
DECLARE @TONGSL INT
-----------------------
SELECT @TONGSL = SUM(ct.SL)
FROM HOADON hd, CT_HOADON ct
WHERE hd.MAHD = ct.MAHD AND
hd.NGAYLHD = getdate() AND
ct.MAHD = @MAHD
------------------------------
RETURN @TONGSL
END
/*3.Viết 1 Stored Procedure có sử dụng cơ chế cursor để cập nhật cột tổng tiền
(TONGTIEN) cho bảng hóa đơn, dựa vào số lượng (SL) và đơn giá (DG) ở bảng
chi tiết hóa đơn cho mỗi hóa đơn.*/
CREATE PROC SP_CAU3
AS
BEGIN
DECLARE TEO CURSOR FOR SELECT MAHD, SUM(SL*DG) AS
TONGTIEN
FROM CT_HOADON
GROUP BY MAHD
DECLARE @MAHD INT,
@TONGTIEN FLOAT
OPEN TEO
FETCH NEXT FROM TEO INTO @MAHD, @TONGTIEN
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE HOADON
SET TONGTIEN =@TONGTIEN
WHERE MAHD=@MAHD
FETCH NEXT FROM TEO INTO @MAHD, @TONGTIEN
END
CLOSE TEO
DEALLOCATE TEO
END
Cú pháp các dạng:
Function:
Type 1: Nếu muốn UDFs trả về một kết quả (số, chuỗi, date,…) thì ta sử dụng
UDFs dạng 1
Type 2: Nếu muốn UDFs trả về tập kết quả dạng bảng thì ta sử dụng UDFs dạng 2.
Type 3: Nếu muốn UDFs trả về tập kết quả dạng bảng tạm thì ta sử dụng
UDFs dạng 3.
View:
CREATE VIEW [ < database_name > . ] [ < owner > . ] view_name [ ( column [
,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]
< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }
---------------VIEW-------------
/*Ứng với mỗi đề tài cho biết: Ten de tai, ten sinh vien tham gia, ten giao vien
huong dan,
Cursor:
----------------Bài4:CURSOR------------
--Câu1:/*Thêm 2 cột DIEMTB và XLOAI vào Table SINHVIEN:Dùng cursor cập
nhật điểm trung bình của các đề tài và xếp loại theo quy tắc:
9<=DIEMTB<=10 XLOAI: ‘Giỏi’
7<=DIEMTB<9 XLOAI: ‘Khá’
5<=DIEMTB<7 XLOAI: ‘Trung bình’
DIEMTB<5 XLOAI: ‘Không đạt’
Trong đó: Điểm trung bình của đề tài được tính theo
công thức sau
DIEMTB = (DIEMHD+Average(DIEMPB)
+Average(DIEM))/3*/
Go
ALTER TABLE SINHVIEN ADD DIEMTB FLOAT, XEPLOAI
NVARCHAR(20)
GO
---------ANONYMYOUS BOCK
BEGIN
--1.KHAI BAO CURSOR
DECLARE XOAI CURSOR FOR SELECT MADT,MASV
FROM SV_DETAI
--2.KHAI BAO BIEN
DECLARE @MADT CHAR(10),
@MASV CHAR(10)
--3. MO CURSOR
OPEN XOAI
--4.DI CHUYEN CURSOR DE LAY DU LIEU DUA VAO BIEN
FETCH NEXT FROM XOAI INTO @MADT, @MASV
--5.VÒNG LẶP WHILE ĐỂ KIỂM TRA TRANG THÁI CURSOR
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE SINHVIEN
SET DIEMTB = DBO.F231_CAU1(@MADT),
XEPLOAI = DBO.F231_CAU2(@MADT)
WHERE MASV = @MASV
--4.DI CHUYEN CURSOR DE LAY DU LIEU DUA VAO BIEN
FETCH NEXT FROM XOAI INTO @MADT, @MASV
END
--6.ĐÓNG CURSOR
CLOSE XOAI
--7.XÓA CURSOR
DEALLOCATE XOAI
END
GO
SELECT * FROM SINHVIEN
STORED PROCEDURE:
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
Trước khi chèn dữ liệu cần kiểm tra MAHH đã tồn tại trong table
--------STORED PROCEDURE
CREATE PROC PR_CAU1N1
(
@MADT CHAR(10)
)
AS
BEGIN
--LÀM MẤT HIỆU CỦA KHÓA NGOẠI
ALTER TABLE SV_DETAI NOCHECK
CONSTRAINT ALL
ALTER TABLE GVHDDT NOCHECK CONSTRAINT
ALL
ALTER TABLE GVPBDT NOCHECK CONSTRAINT
ALL
ALTER TABLE GVUVDT NOCHECK CONSTRAINT
ALL
ALTER TABLE HOIDONG_DT NOCHECK CONSTRAINT
ALL
DELETE DETAI WHERE MADT= @MADT
------LÀM KHÓA NGOẠI CÓ HIỆU LỰC TRỞ LẠI
ALTER TABLE SV_DETAI CHECK CONSTRAINT
ALL
ALTER TABLE GVHDDT CHECK CONSTRAINT ALL
ALTER TABLE GVPBDT CHECK CONSTRAINT ALL
ALTER TABLE GVUVDT CHECK CONSTRAINT ALL
ALTER TABLE HOIDONG_DT CHECK CONSTRAINT ALL
END
GO
EXECUTE PR_CAU1N1 '97002'
GO
SELECT *FROM DETAI
SELECT *FROM SV_DETAI
SELECT * FROM GVHDDT
SELECT * FROM GVPBDT
SELECT * FROM GVUVDT
SELECT * FROM HOIDONG_DT
Trigger:
/*Câu 4: Tạo Trigger thỏa mãn ràng buộc là khi đổi một mã số đề tài(MADT)
trong bảng đề tài
sẽ thay đổi các thông tin liên quan
Các bảng liên quan đến bảng đề tài gồm:
1.Bảng SV_DETAI
2.Bảng GVHDDT
3.Bảng GVPBDT
4.Bảng GVUVDT
5.Bảng HOIDONG_DT*/
GO
IF EXISTS(SELECT *FROM SYSOBJECTS WHERE NAME='T_CAU')
DROP TRIGGER T_CAU4
GO
CREATE TRIGGER T_CAU4
ON DETAI
FOR UPDATE
AS
BEGIN
DECLARE @MADT CHAR(10)
SELECT @MADT=MADT FROM updated
UPDATE SV_DETAI WHERE MADT=@MADT
UPDATE GVHDDT WHERE MADT=@MADT
UPDATE GVPBDT WHERE MADT=@MADT
UPDATE GVUVDT WHERE MADT=@MADT
UPDATE HOIDONG_DT WHERE MADT=@MADT
END
GO