Script tạo database và các bảng ❖ Tạo Database Alter session set "_oracle_script" = true; create user QLDONHANG identified by 123; grant create session to QLDONHANG; grant create table
Trang 1Báo Cáo 2
Nhóm 06: XÂY DỰNG HỆ TH ỐNG CSDL QUẢN LÝ ĐƠN
4.1 Mô hình dữ ệu quan hệ li
4.1.1 Lược đồ quan hệ
4.1.2 Script tạo database và các bảng
❖ Tạo Database
Alter session set "_oracle_script" = true;
create user QLDONHANG identified by 123;
grant create session to QLDONHANG;
grant create table to QLDONHANG;
grant create trigger to QLDONHANG;
grant create procedure to QLDONHANG;
Alter user QLDONHANG quota 10M on users ;
❖ Tạo các bảng dữ liệu
o Bảng Bánh
CREATE TABLE BANH
(
Trang 2MaBanh CHAR (10) NOT NULL,
TenBanh VARCHAR (50) NOT NULL,
DonGia INT NOT NULL,
MaNCC CHAR (10) NOT NULL,
PRIMARY KEY (MaBanh),
FOREIGN KEY (MaNCC) REFERENCES NHACUNGCAP(MaNCC) );
o Bảng Nhà cung cấp
CREATE TABLE NHACUNGCAP
(
MaNCC CHAR (10) NOT NULL,
TenNCC VARCHAR (30),
DiaChi VARCHAR (50) NOT NULL,
SDT VARCHAR (10) NOT NULL,
PRIMARY KEY (MaNCC)
);
o Bảng Đơn hàng
CREATE TABLE DONHANG
(
MaDH CHAR (10) NOT NULL,
NgayDatHang DATE NOT NULL,
TongGiaTri INT NOT NULL,
TrangThai VARCHAR (30) NOT NULL,
MaKH CHAR (10) NOT NULL,
MaNV CHAR (10) NOT NULL,
PRIMARY KEY (MaDH),
FOREIGN KEY (MaKH) REFERENCES KHACHHANG (MaKH), FOREIGN KEY (MaNV) REFERENCES NHANVIEN (MaNV) );
Trang 3o Bảng Chi tiết Đơn hàng
CREATE TABLE CTDONHANG
(
MaDH CHAR (10) NOT NULL,
MaBanh CHAR (10) NOT NULL,
SoLuong INT NOT NULL,
ThanhTien INT NOT NULL,
TrangThai VARCHAR (30) NOT NULL,
PRIMARY KEY (MaDH, MaBanh),
FOREIGN KEY (MaBanh) REFERENCES BANH(MaBanh), FOREIGN KEY (MaDH) REFERENCES DONHANG(MaDH) );
o Bảng Hóa đơn
CREATE TABLE HOADON
(
MaHD CHAR (10) NOT NULL,
NgayLap DATE NOT NULL,
TrangThai VARCHAR (20) NOT NULL,
ThanhTien INT NOT NULL,
MaDH CHAR (10) NOT NULL,
PRIMARY KEY (MaHD),
FOREIGN KEY (MaDH) REFERENCES DONHANG(MaDH) );
o Bảng Phiếu giao hàng
CREATE TABLE PHGIAOHANG
(
MaPH CHAR (10) NOT NULL,
NgayGiao DATE NOT NULL,
Trang 4DiaChi VARCHAR (50) NOT NULL,
TrangThai VARCHAR (30) NOT NULL,
TenKH VARCHAR (30) NOT NULL,
SDT VARCHAR (10) NOT NULL,
MaDH CHAR (10) NOT NULL,
PRIMARY KEY (MaPH),
FOREIGN KEY (MaDH) REFERENCES DONHANG(MaDH)
);
o Bảng Nhân viên
CREATE TABLE NHANVIEN
(
MaNV CHAR (10) NOT NULL,
TenNV VARCHAR (30) NOT NULL,
DiaChi VARCHAR (50) NOT NULL,
SDT VARCHAR (10) NOT NULL,
NgaySinh DATE NOT NULL,
PRIMARY KEY (MaNV)
);
o Bảng Bảng Khách hàng
CREATE TABLE KHACHHANG
(
MaKH CHAR (10) NOT NULL,
TenKH VARCHAR (30),
DiaChi VARCHAR (50) NOT NULL,
SDT VARCHAR (10) NOT NULL,
PRIMARY KEY (MaKH)
);
4.1.3 Script insert dữ ệu mẫu cho các bảng danh mụ li c/ phân loại
Trang 5❖ Thêm dữ ệu cho các bảng danh mục phân loại li
o Bảng Nhà cung cấp
INSERT INTO nhacungcap (mancc, tenncc, diachi, sdt)
VALUES ('N01', 'Cong ty Banh HN', '133 Nguyen Van Chi Binh Thach TP.HCM', '0976779813');
INSERT INTO nhacungcap (mancc, tenncc, diachi, sdt)
VALUES ('N02', 'Cong ty Kim Cuong TPHCM', '123 Nguyen Chi Phuong Quan 8 TP.HCM', '0123456789');
INSERT INTO nhacungcap (mancc, tenncc, diachi, sdt)
VALUES ('N03', 'Cong ty Paris Baguette VN', '884 Su Van Hanh Quan 10 TP.HCM', '0345759865');
INSERT INTO nhacungcap (mancc, tenncc, diachi, sdt)
VALUES ('N04', 'Cong ty Hong Phat TPHCM', '23 Le Van Luong Go Vap TP.HCM', '0365758946');
o Bảng Bánh
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B01', 'Crossaint truyen thong', 33000, 'N01');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B02','crossaint vị ca phe',27000,'N02');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B03','crossaint hanh nhan',27000,'N03');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B04','crossaint dau',26000,'N04');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B05','crossaint pho mai',28000,'N03');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B06','crossaint cha bong',19000,'N02');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B07','crossaint bo toi',19000,'N01');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
Trang 6VALUES ('B08','crossaint trung muoi',29000,'N04');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B09','crossaint kem dua',29000,'N02');
INSERT INTO banh (mabanh, tenbanh, dongia, mancc)
VALUES ('B10','crossaint kem lai',30000,'N01');
o Bảng Khách hàng
INSERT INTO khachhang (makh, tenkh, diachi, sdt)
VALUES ('KH01', 'Nguyen Tran Kim Phuc', '202 Huynh Van Banh Phu Nhuan TP.HCM', '0123456789');
INSERT INTO khachhang (makh, tenkh, diachi, sdt)
VALUES ('KH02', 'Le Vu Song Toan', '212 Tran Hung Dao Quan 5 TP.HCM', '0987654321');
INSERT INTO khachhang (makh, tenkh, diachi, sdt)
VALUES ('KH03', 'Nguyen Tran Kim Ly', '22 Hoang Sa Binh Thach TP.HCM', '0256789456');
INSERT INTO khachhang (makh, tenkh, diachi, sdt)
VALUES ('KH04', 'Pham Ngoc Son', '218 Le Van Luong Binh Tan TP.HCM', '0972887564');
INSERT INTO khachhang (makh, tenkh, diachi, sdt)
VALUES ('KH05', 'Hoang Van Viet', '786 Hai Ba Trung Quan 11 TP.HCM', '0855762223');
o Bảng Nhân viên
INSERT INTO nhanvien (manv, tennv, diachi, sdt, ngaysinh)
VALUES ('NV01', 'Nguyen Viet Hoang', '188 Su Van Hanh Quan 10 TP.HCM', '123456789', TO_DATE ('1999-12-20', 'yyyy-mm-dd'));
INSERT INTO nhanvien (manv, tennv, diachi, sdt, ngaysinh)
VALUES ('NV02', 'Le Thi Hong Anh', '215 Tran Hung Dao Quan 5 TP.HCM', '0345678983', TO_DATE ('1995-08-27', 'yyyy-mm-dd'));
4.1.4 Script insert dữ ệu mẫu cho các bảng giao dịch/ li nghiệp vụ
❖ Thêm dữ ệu cho các bảng giao dịch/ nghiệp vụ li
Trang 7o Bảng Đơn hàng
INSERT INTO donhang (madh, ngaydathang, tonggiatri,
trangthai, makh, manv)
VALUES ('DH01', TO_DATE ('2024- -20', 'yyyy- 02 mm -dd'),
95000, 'da xac nhan', 'KH01', 'NV01');
INSERT INTO donhang (madh, ngaydathang, tonggiatri,
trangthai, makh, manv)
VALUES ('DH02', TO_DATE ('2024- -21', 'yyyy- 02 mm -dd'),
28000, 'da xac nhan', 'KH03', 'NV01');
INSERT INTO donhang (madh, ngaydathang, tonggiatri,
trangthai, makh, manv)
VALUES ('DH03', TO_DATE ('2024- -22', 'yyyy- 02 mm -dd'),
19000, 'cho xac nhan', 'KH05', 'NV02');
INSERT INTO donhang (madh, ngaydathang, tonggiatri, trangthai, makh, manv)
VALUES ('DH04', TO_DATE('2024- -22', 'yyyy- 02 mm -dd'), 0, 'cho xac nhan', 'KH02', 'NV02');
o Bảng Hóa đơn
INSERT INTO hoadon (mahd, ngaylap, trangthai, thanhtien,
madh)
VALUES ('HD01', TO_DATE ('2024- -20', 'yyyy- 02 mm -dd'), 'da thanh toan', 5222, 'DH01');
INSERT INTO hoadon (mahd, ngaylap, trangthai, thanhtien,
madh)
VALUES ('HD02', TO_DATE ('2024- -21', 'yyyy- 02 mm -dd'), 'da thanh toan', 456, 'DH02');
INSERT INTO hoadon (mahd, ngaylap, trangthai, thanhtien,
madh)
Trang 8VALUES ('HD03', TO_DATE ('2024- -22', 'yyyy- 02 mm -dd'), 'chua thanh toan', 123, 'DH03');
o Bảng Chi tiết Đơn hàng
INSERT INTO CTDonHang (MaDH, MaBanh, SoLuong,
ThanhTien)
VALUES ('DH01', 'B01', 2, 66000);
INSERT INTO CTDonHang (MaDH, MaBanh, SoLuong,
ThanhTien)
VALUES ('DH01', 'B09', 1, 29000);
INSERT INTO CTDonHang (MaDH, MaBanh, SoLuong,
ThanhTien,)
VALUES ('DH02', 'B05', 1, 28000);
INSERT INTO CTDonHang (MaDH, MaBanh, SoLuong,
ThanhTien,)
VALUES ('DH03', 'B06', 3, 19000);
INSERT INTO CTDonHang (MaDH, MaBanh, SoLuong, ThanhTien)
VALUES ('DH04', 'B01', 3, 0);
o Bảng Phiếu giao hàng
INSERT INTO phgiaohang (maph, ngaygiao, diachi, trangthai,
tenkh, sdt, madh)
VALUES ('PH01', TO_DATE ('2024- -20', 'yyyy- 02 mm -dd'), '22 Hoang Sa Binh Thach TP.HCM', 'da giao','Nguyen Tran Kim Ly', '0256789456', 'DH01');
INSERT INTO phgiaohang (maph, ngaygiao, diachi, trangthai,
tenkh, sdt, madh)
Trang 9VALUES ('PH02', TO_DATE ('2024- -21', 'yyyy- 02 mm -dd'), '202 Huynh Van Banh Phu Nhuan TP.HCM', 'da giao', 'Nguyen Tran Kim Phuc', '0123456789', 'DH02');
INSERT INTO phgiaohang (maph, ngaygiao, diachi, trangthai,
tenkh, sdt, madh)
VALUES ('PH03', TO_DATE ('2024- -22', 'yyyy- 02 mm -dd'), '786 Hai Ba Trung Quan 11 TP.HCM', 'chua giao', 'Hoang Van Viet', '0855762223', 'DH03');
4.2 Procedure và function
4.2.1 Các thủ tục CRUD cho 1 bảng Danh mục/ Phân loại
Trang 114.2.2 Các thủ tục liên quan đến nghiệp vụ
create table ddh_rec as select * from donhang
CREATE OR REPLACE PROCEDURE update_tongtien_ddh
AS
BEGIN
FOR ddh_rec IN (SELECT madh FROM donhang) LOOP
Cập nhật tongtien
UPDATE donhang
SET tonggiatri = (
Lấy tổng thanhtien cho mỗi chi tiết đơn đặt hàng
SELECT SUM(thanhtien)
FROM ctdonhang
WHERE madh = ddh_rec.madh
)
WHERE madh = ddh_rec.madh;
END LOOP;
END;
lệnh thực thi thủ tục
exec update_tongtien_ddh;
ểm tra ki
select * from donhang;
◼ Proceduce cập nhật thành tiền
CREATE OR REPLACE PROCEDURE update_thanhtien_ctdonhang
AS
BEGIN
FOR ctdonhang_rec IN (SELECT mabanh FROM banh) LOOP
Cập nhật tongtien
Trang 12UPDATE ctdonhang
SET thanhtien = soluong * (SELECT dongia FROM banh WHERE mabanh = ctdonhang_rec.mabanh)
WHERE mabanh = ctdonhang_rec.mabanh;
end loop;
END;
-lệnh thực thi
exec update_thanhtien_ctdonhang;
lệnh kiểm tra
select * from ctdonhang
4.2.3 Các thủ tục kết xuất báo cáo định kỳ
CREATE OR REPLACE PROCEDURE tong_hop_don_hang_ban_trong_ngay (
p_ngay_ban DATE
)
AS
BEGIN
Lấy danh sách đơn hàng bán trong ngày
DECLARE
CURSOR cur_don_hang IS
SELECT * FROM DONHANG WHERE ngaydathang = p_ngay_ban; BEGIN
Khởi tạo biến tổng doanh thu và số ợng đơn hànglư
DECLARE
v_tong_doanh_thu NUMBER := 0;
v_so_luong_don_hang NUMBER := 0;
BEGIN
Lặp qua từng đơn hàng
FOR rec IN cur_don_hang LOOP
Cập nhật tổng doanh thu
v_tong_doanh_thu := v_tong_doanh_thu + rec.TongGiaTri;
Cập nhật số ợng đơn hàng lư
v_so_luong_don_hang := v_so_luong_don_hang + 1;
END LOOP;
In thông tin tổng hợp
DBMS_OUTPUT.PUT_LINE('Ngày bán: ' || p_ngay_ban);
DBMS_OUTPUT.PUT_LINE('Tổng doanh thu: ' || v_tong_doanh_thu); DBMS_OUTPUT.PUT_LINE('Số ợng đơn hàng: ' || v_so_luong_don_hang);lư END;
Đóng con trỏ
CLOSE cur_don_hang;
END;
Trang 13END tong_hop_don_hang_ban_trong_ngay;
4.3 Trigger
4.3.1 Các Trigger ràng buộc toàn vẹn
trigger không trùng mã bánh
create or replace trigger trg_banh_inup
before insert on banh for each row
declare
v_ma_banh banh.mabanh%type;
v_count int:=0;
begin
v_ma_banh:=:new.mabanh;
select count(*) into v_count
from banh
where mabanh = v_ma_banh;
if v_count > 0 then
raise_application_error(-20010,'mã bánh ?ã t?n t?i'); else
dbms_output.put_line('v_ma_banh= '||v_ma_banh); end if;
end;
create or replace trigger trg_tenbanh_inup
before insert on banh for each row
declare
v_ten_banh banh.tenbanh%type;
v_count int:=0;
begin
v_ten_banh:=:new.tenbanh;
select count(*) into v_count
from banh
where tenbanh = v_ten_banh;
if v_count > 0 then
raise_application_error(-20010,'tên bánh ?ã t?n t?i'); else
dbms_output.put_line('v_ten_banh= '||v_ten_banh); end if;
Trang 14end;
4.3.2 "Các Trigger bảo vệ dữ liệu
4.3.2.1 - không cho phép cập nhậ bảng trong khoảng thờ t i gian quy định trong ngày
CREATE OR REPLACE TRIGGER trg_prevent_updates
BEFORE insert or update ON banh FOR EACH ROW
DECLARE
current_hour NUMBER;
BEGIN
SELECT TO_NUMBER(to_char(systimestamp, 'HH24')) INTO current_hour FROM dual;
IF current_hour <= 8 OR current_hour > 20 THEN
raise_application_error(-20001, 'không insert hay cập nhật ngoài giờ '); END IF;
END;
4.3.2.2 - Lưu History
4.4 Bảng danh sách theo mẫu
Nhiệm vụ
Tham chiếu
1 Procedure
them_banh_moi
thêm m t ộ
dữ ệu li bánh mới
tham chiếu trong bảng 'BANH'
2 Procedure
select_banh
xuất dữ liệu của bánh
tham chiếu trong bảng 'BANH'
3 Procedure delecte_banh xóa dữ ệu li
bánh
tham chiếu trong bảng 'BANH'
4 Procedure
update_banh
update dữ liệu cho bánh đã có sẵn
tham chiếu trong bảng 'BANH'
5 Trigger
trg_banh_inup
trigger tránh trùng
mã bánh
tham chiếu trong bảng 'Banh'
6 Trigger
trg_tenbanh_inup
trigger tránh trùng tên bánh
tham chiếu trong bảng 'BANH'
7 Trigger
trg_prevent_updates
trigger không cho phép cập nhật bảng bánh
tham chiếu trong bảng 'BANH'
Trang 158
Procedure update_thanhtien_ctdonhang
update thành tiền cho số lượng bánh
đã mua ở đơn hàng
tham chiếu bảng 'CTDONHANG'
9
Procedure update_tongtien_ddh
update tính tổng tiền bánh có trong đơn hàng
tham chiếu bảng 'DONHANG'
10
Procedure tong_hop_don_hang_ban_trong_ngay
Tính tổng đơn hàng
bán được trong ngày hôm đó
tham chiếu bảng 'DONHANG'
11 Cursor Tao_DonHang Tạo đơn hàng m ới tham chiếu bảng 'DONHANG'