Vikot106's Blog.

项目:特惠影票销售系统PL/SQL数据库设计

字数统计: 6.7k阅读时长: 35 min
2021/04/27 Share

Oracle数据库期末作品。

需求分析

功能阐述

  1. 系统主要分为两类用户,他们相应的操作:
  • 管理员:创建、修改、删除表数据,执行存储过程。

  • 会员:查票、查优惠、查积分、买票与退票。

  1. 主要功能:购买优惠电影票,并可获得会员积分与使用会员积分。

用例图

shot1

功能模块设计

shot2

影讯管理模块

  1. 新片录入:该模块用于添加新的影片信息。
  2. 修改资料:该模块用于修改已添加的影片信息。
  3. 删除影片:该模块用于删除现有影片。
  4. 查询数据:该模块用于查询影片信息。

会员管理模块

  1. 录入新会员:该模块用于添加新会员。
  2. 会员充值:该模块用于会员充值。
  3. 会员查询:该模块用于查询会员信息。
  4. 会员注销:该模块用于删除现有会员。
  5. 会员信息修改:该模块用于修改会员信息。

售票管理模块

  1. 会员购票:该模块用于添加购买特惠影票购买信息。
  2. 会员取票:该模块用于判断会员是否已取票。
  3. 盈利统计:该模块用于统计盈利数值。
  4. 销售统计:该模块用于统计销售量。

退票管理模块

  1. 会员退票:该模块用于添加退票信息。
  2. 退票统计:该模块用于统计退票数量。
  3. 返还金额统计:该模块用于统计退还金额。

折扣管理模块

  1. 添加优惠信息:该模块用于添加优惠信息。
  2. 删除优惠信息:该模块用于删除优惠信息。
  3. 修改优惠信息:该模块用于修改优惠信息。
  4. 会员积分统计:该模块用于统计会员积分。
  5. 积分抵扣:该模块用于统计积分抵扣金额。
  6. 优惠力度:该模块用于计算优惠力度。

数据库设计

数据库概念结构设计

本图涉及四个实体,分别是管理员、会员、电影和特惠影票,通过其之间的联系,E-R图设计如图:

shot3

由实体联系分析得到数据库的关系模型:

  • 影讯信息(影片ID、片名、上映时间、片长、售价、总票数、余票数)
  • 会员信息(会员ID、会员名、会员手机、会员积分、会员余额、入会时间)
  • 售票信息(订单号、会员ID、影片ID、购买时间、场次、影厅、座位、售价、实收、取票Flag)
  • 退票信息(退单号、会员ID、影片ID、订单号、退票时间、退还金额、退还积分)
  • 折扣信息(折扣ID、影片ID、折扣价、获得积分、折扣开始时间、折扣停止时间)

数据库逻辑结构设计

movie_table(影讯表)

表4-1
列名 数据类型 是否为空 说明
movie_id NUMBER(20) 影片编号 主键
movie_name VARCHAR2(100) 影片名称
movie_date DATE 上映时间
movie_time NUMBER(20) 影片时长
movie_price NUMBER(20) 影票原价
movie_count NUMBER(20) 总票数
movie_remain NUMBER(20) 余票数

member_table(会员信息表)

表4-2
列名 数据类型 是否为空 说明
member_id NUMBER(20) 会员编号 主键
member_name VARCHAR2(50) 会员名
member_phone VARCHAR2(20) 联系方式
member_point NUMBER(20) 会员积分
member_balance NUMBER(20) 会员余额
member_date DATE 注册时间

sale_table(售票信息表)

表4-3
列名 数据类型 是否为空 说明
sale_id NUMBER(20) 售票编号 主键
member_id NUMBER(20) 会员编号 外键
movie_id NUMBER(20) 影片编号 外键
sale_date DATE 售票时间
sale_session DATE 影片场次
sale_room VARCHAR2(50) 影厅
sale_seat VARCHAR2(20) 座位
sale_price NUMBER(20) 售价
sale_get NUMBER(20) 实收价
sale_flag CHAR(1) 是否取票

back_table(退票信息表)

表4-4
列名 数据类型 是否为空 说明
back_id NUMBER(20) 退票编号 主键
member_id NUMBER(20) 会员编号 外键
movie_id NUMBER(20) 影片编号 外键
sale_id NUMBER(20) 售票编号 外键
back_date DATE 退票时间
back_count NUMBER(20) 退回金额
back_point NUMBER(20) 退回积分

discount_table(折扣表)

表4-5
列名 数据类型 是否为空 说明
discount_id NUMBER(20) 折扣编号 主键
movie_id NUMBER(20) 影片编号 外键
discount_count NUMBER(20) 折扣价格
discount_point NUMBER(20) 赠送积分数量
discount_start DATE 开始时间
discount_end DATE 结束时间

用户权限以及授权功能

1. 创建表空间

表空间movie_system_tbs:

1
2
3
create tablespace movie_system_tbs
datafile 'D:\app\space\lhr_MS_tbs.dbf'
size 50m;

2. 普通用户的创建和授权

创建管理员用户c##hlr1802设置默认表空间并授权:

1
2
3
4
create user c##lhr1802 identified by lhr1802
default tablespace movie_system_tbs;

grant create session,dba to c##lhr1802;

创建普通用户c##hlr1802_user设置默认表空间并授权:

1
2
3
4
create user c##lhr1802_user identified by lhr1802
default tablespace movie_system_tbs;

grant create connect,resource to c##lhr1802_user;

3. 表的创建

3.1 创建影讯表(movie_table)
1
2
3
4
5
6
7
8
9
10
create table movie_table
(
movie_id number(20) PRIMARY KEY,
movie_name varchar2(100),
movie_date date,
movie_time number(20),
movie_price number(20),
movie_count number(20),
movie_remain number(20)
);
3.2 创建会员表(member_table)
1
2
3
4
5
6
7
8
9
create table member_table
(
member_id number(20) PRIMARY KEY,
member_name varchar2(50),
member_phone varchar2(20),
member_point number(20),
member_balance number(20),
member_date date
);
3.3 创建售票表(sale_table)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table sale_table
(
sale_id number(20) PRIMARY KEY,
member_id,CONSTRAINT fk_s2memid FOREIGN KEY (member_id)
REFERENCES member_table(member_id),
movie_id,CONSTRAINT fk_s2movid FOREIGN KEY (movie_id)
REFERENCES movie_table(movie_id),
sale_date date,
sale_session date,
sale_room varchar2(50),
sale_seat varchar2(20),
sale_price number(20),
sale_get number(20),
sale_flag char(1)
);
3.4 创建退票表(back_table)
1
2
3
4
5
6
7
8
9
10
11
12
13
create table back_table
(
back_id number(20) PRIMARY KEY,
member_id,CONSTRAINT fk_b2memid FOREIGN KEY (member_id)
REFERENCES member_table(member_id),
movie_id,CONSTRAINT fk_b2movid FOREIGN KEY (movie_id)
REFERENCES movie_table(movie_id),
sale_id,CONSTRAINT fk_b2salid FOREIGN KEY (sale_id)
REFERENCES sale_table(sale_id),
back_date date,
back_count number(20),
back_point number(20)
);
3.5 创建折扣表(discount_table)
1
2
3
4
5
6
7
8
9
10
create table discount_table
(
discount_id number(20) PRIMARY KEY,
movie_id,CONSTRAINT fk_d2movid FOREIGN KEY (movie_id)
REFERENCES movie_table(movie_id),
discount_count number(20),
discount_point number(20),
discount_start date,
discount_end date
);

4.表信息的录入

4.1 movie_table表
1
2
insert into movie_table values('0001','电影A',to_date('2021-3-12 13:10:00','YYYY-MM-DD HH24:MI:SS'),'120','60','100','98');
insert into movie_table values('0002','电影B',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),'120','90','90','89');
4.2 member_table表
1
2
insert into member_table values('0001','李杭瑞','13300225588','196','90',to_date('2021-01-29 17:20:00','YYYY-MM-DD HH24:MI:SS'));
insert into member_table values('0002','邱先生','18244785236','83','60',to_date('2021-05-03 17:20:00','YYYY-MM-DD HH24:MI:SS'));
4.3 sale_table表
1
2
3
4
5
6
7
8
9
10
insert into sale_table values('0001','0001','0001',to_date('2021-4-10 13:10:00','YYYY-MM-DD HH24:MI:SS'),
to_date('2021-4-12 13:10:00','YYYY-MM-DD HH24:MI:SS'),'普通影厅1','L坐','60','30','Y');
insert into sale_table values('0002','0002','0001',to_date('2021-4-10 13:15:00','YYYY-MM-DD HH24:MI:SS'),
to_date('2021-4-12 13:10:00','YYYY-MM-DD HH24:MI:SS'),'普通影厅1','L坐','60','30','Y');
insert into sale_table values('0003','0001','0002',to_date('2021-4-11 15:30:00','YYYY-MM-DD HH24:MI:SS'),
to_date('2021-4-12 21:00:00','YYYY-MM-DD HH24:MI:SS'),'激光影厅1','R坐','90','45','N');
insert into sale_table values('0004','0001','0002',to_date('2021-4-11 17:30:00','YYYY-MM-DD HH24:MI:SS'),
to_date('2021-4-12 21:00:00','YYYY-MM-DD HH24:MI:SS'),'激光影厅1','L坐','90','80','N');
insert into sale_table values('0005','0002','0002',to_date('2021-4-11 17:35:00','YYYY-MM-DD HH24:MI:SS'),
to_date('2021-4-12 21:00:00','YYYY-MM-DD HH24:MI:SS'),'激光影厅1','R坐','90','70','N');
4.4 back_table表
1
2
insert into back_table values('0001','0001','0002','0004',to_date('2021-4-14 19:10:00','YYYY-MM-DD HH24:MI:SS'),'80','8');
insert into back_table values('0002','0002','0001','0002',to_date('2021-4-15 19:10:00','YYYY-MM-DD HH24:MI:SS'),'60','6');
4.5 discount_table表
1
2
3
4
insert into discount_table values('0001','0001','30','3',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),
to_date('2021-5-10 12:10:10','YYYY-MM-DD HH24:MI:SS'));
insert into discount_table values('0002','0002','65','6',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),
to_date('2021-5-10 12:10:10','YYYY-MM-DD HH24:MI:SS'));

5. 创建视图

5.1 查询电影余票
1
2
3
4
5
6
create view remain_condition
(片名,票价,折扣价,余票数,总票数)
as
select m.movie_name,m.movie_price,d.discount_count,m.movie_remain,m.movie_count
from movie_table m,discount_table d
where m.movie_id=d.movie_id;
5.2 查询各个影片销量
1
2
3
4
5
6
create view sale_condition
(销量,片名,票价,折扣价,总票数)
as
select m.movie_count-m.movie_remain,m.movie_name,m.movie_price,d.discount_count,m.movie_count
from movie_table m,discount_table d
where m.movie_id=d.movie_id;
5.3 查询各个影片折扣力度
1
2
3
4
5
6
create view discount_condition
(片名,票价,折扣价,折扣力度,余票数,开始时间,结束时间)
as
select m.movie_name,m.movie_price,d.discount_count,d.discount_count / m.movie_price,m.movie_remain,d.discount_start,discount_end
from movie_table m,discount_table d
where m.movie_id=d.movie_id;
5.4 查询各个影片收入
1
2
3
4
5
6
7
create view income_condition
(片名,票价,折扣价,售票数,收入)
as
select m.movie_name,m.movie_price,d.discount_count,m.movie_count-m.movie_remain,sum(s.sale_get)
from movie_table m,discount_table d,sale_table s
where m.movie_id=d.movie_id and m.movie_id=s.movie_id
group by m.movie_name,m.movie_price,d.discount_count,m.movie_count-m.movie_remain;
5.5 查询各个影片退款情况
1
2
3
4
5
6
7
create view refund_condition
(片名,票价,折扣价,售票数,退回)
as
select m.movie_name,m.movie_price,d.discount_count,m.movie_count-m.movie_remain,sum(b.back_count)
from movie_table m,discount_table d,back_table b
where m.movie_id=d.movie_id and m.movie_id=b.movie_id
group by m.movie_name,m.movie_price,d.discount_count,m.movie_count-m.movie_remain;
5.6 统计会员积分与可抵扣的金额
1
2
3
4
5
6
create view point_condition
(会员ID,会员名,积分,可抵扣金额)
as
select m.member_id,m.member_name,m.member_point,FLOOR(m.member_point / 10)*10
from member_table m
group by m.member_id,m.member_name,m.member_point;
5.7 查询会员观影排行
1
2
3
4
5
6
7
create view rank_condition
(会员ID,会员名,观影场次)
as
select distinct m.member_id,m.member_name,COUNT(s.member_id)
from member_table m,sale_table s
where m.member_id=s.member_id and s.sale_flag='Y'
group by m.member_id,m.member_name;
5.8 查询售票表中已取走的票
1
2
3
4
5
6
create view take_condition
(订单号,片名,场次,售票时间,实收款)
as
select s.sale_id,m.movie_name,s.sale_session,s.sale_date,s.sale_get
from movie_table m,sale_table s
where m.movie_id=s.movie_id and s.sale_flag='Y';
5.9 查询售票表中未取走的票
1
2
3
4
5
6
create view untake_condition
(订单号,片名,场次,售票时间,实收款)
as
select s.sale_id,m.movie_name,s.sale_session,s.sale_date,s.sale_get
from movie_table m,sale_table s
where m.movie_id=s.movie_id and s.sale_flag='N';

6. 创建索引

6.1 按照电影信息创建余票降序索引
1
create index remain_price on movie_table(movie_remain DESC);
6.2 按照折扣价格创建升序索引
1
create index discount_price on discount_table(discount_count ASC);
6.3 按照购票积分创建升序索引
1
create index give_point on discount_table(discount_point ASC);
6.4 按照会员积分创建降序索引
1
create index member_point on member_table(member_point DESC);

7. 创建触发器

7.1 插入修改或删除影讯后统计当前电影数量
1
2
3
4
5
6
7
8
9
10
11
12
13
create or replace trigger add_movie
after insert or update or delete on movie_table
declare
v_count number;
begin
select count(*) into v_count from movie_table;
dbms_output.put_line('当前上映电影数量为:'||v_count);
end add_movie;
/

insert into movie_table values('0003','电影C',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),
'120','90','90','89');
delete from movie_table where movie_id=0003;
7.2 修改会员表后显示修改前与修改后信息的差别,插入和删除会员时显示删除的会员卡号和会员名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create or replace trigger modify_member
after update or delete on member_table
for each row
begin
if inserting then
dbms_output.put_line('会员卡号:'||:new.member_id||' '||'会员名:'||:new.member_name);
elsif updating then
dbms_output.put_line('会员卡号:'||:new.member_id||' '||'旧会员名:'||:old.member_name||' '||'新会员名:'||:new.member_name||' '
||'旧手机号:'||:old.member_phone||' '||'新手机号:'||:new.member_phone||' '||'修改前积分:'||:old.member_point||' '||'修改后积分:'||:new.member_point||' '
||'修改前余额:'||:old.member_balance||' '||'修改后余额:'||:new.member_balance);
else
dbms_output.put_line('会员卡号:'||:old.member_id||' '||'会员名:'||:old.member_name);
end if;
end modify_member;
/

update member_table set member_balance='200' where member_id=0001;
update member_table set member_balance='90' where member_id=0001;

insert into member_table values('0003','喵喵喵','18244785236','83','160',to_date('2021-05-03 17:20:00','YYYY-MM-DD HH24:MI:SS'));
delete from member_table where member_id=0003;
7.3 修改售票表后显示修改前与修改后信息的差别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
create or replace trigger modify_sale
after update on sale_table
for each row
begin
if updating then
dbms_output.put_line('订单号:'||:new.member_id||' '||'旧影厅信息:'||:old.sale_room||' '||'新影厅信息:'||:new.sale_room||' '
||'旧座位信息:'||:old.sale_seat||' '||'新座位信息:'||:new.sale_seat||' '||'修改前售价:'||:old.sale_price||' '||'修改后售价:'||:new.sale_price||' '
||'修改前实收价:'||:old.sale_get||' '||'修改后实收价:'||:new.sale_get);
end if;
end modify_sale;
/

update sale_table set sale_get='35' where sale_id=0003;
update sale_table set sale_get='45' where sale_id=0003;
7.4 修改退票表后显示修改前与修改后信息的差别
1
2
3
4
5
6
7
8
9
10
11
12
13
create or replace trigger modify_back
after update on back_table
for each row
begin
if updating then
dbms_output.put_line('退单号:'||:new.back_id||' '||'旧实退金额:'||:old.back_count||' '||'新实退金额:'||:new.back_count||' '
||'旧扣除积分:'||:old.back_point||' '||'新扣除积分:'||:new.back_point);
end if;
end modify_back;
/

update back_table set back_count='40' where back_id=0001;
update back_table set back_count='80' where back_id=0001;
7.5 购票后显示折扣、获得积分、可抵金额、余额、余票
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
create or replace trigger buy_ticket
after insert on sale_table
for each row
declare
v_count number;
v_discount number;
v_point number;
v_balance number;
v_remain number;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
select sale_price into v_count from sale_table where sale_id=:new.sale_id;
select sale_get into v_discount from sale_table where sale_id=:new.sale_id;
select discount_point into v_point from discount_table where movie_id=:new.movie_id;
select member_balance into v_balance from member_table where member_id=:new.member_id;
select movie_remain into v_remain from movie_table where movie_id=:new.movie_id;
dbms_output.put_line('本单折扣:'||v_discount/v_count||' '||'获得积分:'||v_point||' '||'可抵用金额'||
FLOOR(v_point/10)*10||' '||'余额:'||v_balance||' '||'余票:'||v_remain);
COMMIT;
end buy_ticket;
/

insert into sale_table values('0006','0002','0002',to_date('2021-4-11 17:35:00','YYYY-MM-DD HH24:MI:SS'),to_date('2021-4-12 21:00:00','YYYY-MM-DD HH24:MI:SS'),'激光影厅1','R坐','90','70','N');
delete from sale_table where sale_id=0006;
7.6 退票后显示余额、退款额和退还积分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create or replace trigger back_ticket
after insert on back_table
for each row
declare
v_count number;
v_point number;
v_back number;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
select member_balance into v_count from member_table where member_id=:new.member_id;
select back_count into v_back from back_table where back_id=:new.back_id;
select back_point into v_point from back_table where back_id=:new.back_id;
dbms_output.put_line('帐户余额:'||v_count||' '||'退还金额:'||v_back||' '||'退还积分'||v_point);
COMMIT;
end back_ticket;
/

insert into back_table values('0003','0001','0002','0004',to_date('2021-4-14 19:10:00','YYYY-MM-DD HH24:MI:SS'),'80','8');
delete from back_table where back_id=0003;
7.7 增改折扣后显示折扣价格
1
2
3
4
5
6
7
8
9
10
create or replace trigger add_discount
after insert or update on discount_table
for each row
begin
dbms_output.put_line('折扣价格为:'||:new.discount_count);
end add_discount;
/

insert into sale_table values('0006','0002','0002',to_date('2021-4-11 17:35:00','YYYY-MM-DD HH24:MI:SS'),to_date('2021-4-12 21:00:00','YYYY-MM-DD HH24:MI:SS'),'激光影厅1','R坐','90','70','N');
delete from sale_table where sale_id=0006;

8. 创建存储过程

8.1 会员充值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create or replace
procedure recharge(
v_id member_table.member_id%type,
v_balance member_table.member_balance%type)
as
x member_table.member_id%type;
begin
select member_id into x from member_table where member_id=v_id;
update member_table set member_balance=member_balance+v_balance
where member_id=v_id;
dbms_output.put_line('余额已增加!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('充值失败!');
end recharge;
/

exec recharge('0001','50')
exec que_member('0001')
8.2 会员购票
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
create or replace
procedure buy_ticket(
v_id sale_table.sale_id%type,
v_meid sale_table.member_id%type,
v_moid sale_table.movie_id%type,
v_date sale_table.sale_date%type,
v_session sale_table.sale_session%type,
v_room sale_table.sale_room%type,
v_seat sale_table.sale_seat%type)
as
v_price sale_table.sale_price%type;
v_get sale_table.sale_get%type;
v_dipoint discount_table.discount_point%type;
v_mepoint member_table.member_point%type;
begin
select movie_price into v_price from movie_table where movie_table.movie_id=v_moid;
select discount_count into v_get from discount_table where discount_table.movie_id=v_moid;
select discount_point into v_dipoint from discount_table where discount_table.movie_id=v_moid;
select member_point into v_mepoint from member_table where member_id=v_meid;
update member_table set member_balance=member_balance-v_get where member_id=v_meid;
update member_table set member_point=v_mepoint-FLOOR(v_mepoint / 10)*10 where member_id=v_meid;
update member_table set member_point=v_mepoint+v_dipoint where member_id=v_meid;
insert into sale_table values(v_id,v_meid,v_moid,v_date,v_session,v_room,v_seat,v_price,v_get,'N');
update movie_table set movie_remain=movie_remain-1 where movie_table.movie_id=v_moid;
dbms_output.put_line('购票成功!您消费了:'||v_get||'积分抵用:'||FLOOR(v_mepoint / 10)*10||'获得新积分:'
||v_dipoint||'您这次在特惠购票网省了'||v_price-v_get);
EXCEPTION
when others then
dbms_output.put_line('购票失败!');
end buy_ticket;
/

exec buy_ticket('0007','0001','0001',to_date('2021-4-10 13:10:00','YYYY-MM-DD HH24:MI:SS'),to_date('2021-4-12 13:10:00','YYYY-MM-DD HH24:MI:SS'),'普通影厅1','L坐')
8.3 会员退票
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
create or replace
procedure back_ticket(
v_id back_table.back_id%type,
v_moid back_table.movie_id%type,
v_meid back_table.member_id%type,
v_sid back_table.sale_id%type,
v_date back_table.back_date%type)
as
v_count back_table.back_count%type;
v_point back_table.back_point%type;
begin
select sale_get into v_count from sale_table where sale_table.sale_id=v_sid;
select sale_get into v_point from sale_table where sale_table.sale_id=v_sid;
insert into back_table values(v_id,v_meid,v_moid,v_sid,v_date,v_count,v_point);
update member_table set member_balance=member_balance+v_count where member_id=v_meid;
update member_table set member_point=member_point+v_point where member_id=v_meid;
update movie_table set movie_remain=movie_remain+1 where movie_table.movie_id=v_moid;
dbms_output.put_line('退票成功!退还了金额:'||v_count||'退还了积分:'||v_point);
EXCEPTION
when others then
dbms_output.put_line('退票失败!');
end back_ticket;
/

exec back_ticket('0001','0001','0002','0004',to_date('2021-4-14 19:10:00','YYYY-MM-DD HH24:MI:SS'))
8.4 会员取票
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create or replace
procedure check_in(
v_id sale_table.sale_id%type,
v_flag sale_table.sale_flag%type)
as
x sale_table.sale_id%type;
begin
select sale_id into x from sale_table where sale_id=v_id;
update sale_table set sale_flag=v_flag
where sale_id=v_id;
dbms_output.put_line('取票成功!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('取票失败!');
end check_in;
/

exec check_in('0001','Y')
exec check_in('0001','N')
8.5 影讯信息增加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace
procedure add_movie(
v_id movie_table.movie_id%type,
v_name movie_table.movie_name%type,
v_date movie_table.movie_date%type,
v_time movie_table.movie_time%type,
v_price movie_table.movie_price%type,
v_count movie_table.movie_count%type,
v_remain movie_table.movie_remain%type)
as
begin
insert into movie_table values(v_id,v_name,v_date,v_time,v_price,v_count,v_remain);
EXCEPTION
when Dup_val_on_index then
dbms_output.put_line('此电影已存在!');
when others then
dbms_output.put_line('exception');
end add_movie;
/

exec add_movie('0002','电影B',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),'120','90','90','89')
exec add_movie('0003','CC',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),'120','90','90','89')
8.6 影讯信息删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create or replace procedure del_movie
(v_name movie_table.movie_name%type)
as
x movie_table.movie_name%type;
begin
select movie_name into x from movie_table where movie_name=v_name;
delete from movie_table where movie_name=v_name;
dbms_output.put_line('此电影已删除!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('此电影不存在!');
end del_movie;
/

exec del_movie('BB')
exec del_movie('CC')
8.7 影讯信息修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
create or replace
procedure upd_movie(
v_id movie_table.movie_id%type,
v_name movie_table.movie_name%type,
v_date movie_table.movie_date%type,
v_time movie_table.movie_time%type,
v_price movie_table.movie_price%type,
v_count movie_table.movie_count%type,
v_remain movie_table.movie_remain%type)
as
x movie_table.movie_id%type;
begin
select movie_id into x from movie_table where movie_id=v_id;
update movie_table set movie_name=v_name,movie_date=v_date,movie_time=v_time,movie_price=v_price,
movie_count=v_count,movie_remain=v_remain
where movie_id=v_id;
dbms_output.put_line('影讯已修改!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('修改失败!此电影不存在!');
end upd_movie;
/

exec upd_movie('0001','电影A',to_date('2021-3-12 13:10:00','YYYY-MM-DD HH24:MI:SS'),'120','60','100','98')
8.8 影讯信息查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace procedure que_movie(
v_id movie_table.movie_id%type)
as
v1 movie_table.movie_id%type;
v2 movie_table.movie_name%type;
v3 movie_table.movie_date%type;
v4 movie_table.movie_time%type;
v5 movie_table.movie_price%type;
v6 movie_table.movie_count%type;
v7 movie_table.movie_remain%type;
begin
select movie_id,movie_name,movie_date,movie_time,movie_price,movie_count,movie_remain
into v1,v2,v3,v4,v5,v6,v7
from movie_table where movie_id=v_id;
dbms_output.put_line(v1||','||v2||','||v3||','||v4||','||v5||','||v6||','||v7);
exception
when NO_DATA_FOUND then
dbms_output.put_line('查询失败!此电影不存在!');
end que_movie;
/

exec que_movie(0002)
8.9 会员信息增加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create or replace
procedure add_member(
v_id member_table.member_id%type,
v_name member_table.member_name%type,
v_phone member_table.member_phone%type,
v_point member_table.member_point%type,
v_balance member_table.member_balance%type,
v_date member_table.member_date%type)
as
begin
insert into member_table values(v_id,v_name,v_phone,v_point,v_balance,v_date);
EXCEPTION
when Dup_val_on_index then
dbms_output.put_line('此会员已存在!');
when others then
dbms_output.put_line('exception');
end add_member;
/

exec add_member('0001','李杭瑞','13300225588','196','90',to_date('2021-01-29 17:20:00','YYYY-MM-DD HH24:MI:SS'))
exec add_member('0003','喵喵喵','13300225588','196','90',to_date('2021-01-29 17:20:00','YYYY-MM-DD HH24:MI:SS'))
8.10 会员信息删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create or replace procedure del_member
(v_name member_table.member_name%type)
as
x member_table.member_name%type;
begin
select member_name into x from member_table where member_name=v_name;
delete from member_table where member_name=v_name;
dbms_output.put_line('此会员已删除!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('此会员不存在!');
end del_member;
/

exec del_member('BB')
exec del_member('喵喵喵')
8.11 会员信息修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace
procedure upd_member(
v_id member_table.member_id%type,
v_name member_table.member_name%type,
v_phone member_table.member_phone%type,
v_point member_table.member_point%type,
v_balance member_table.member_balance%type,
v_date member_table.member_date%type)
as
x member_table.member_id%type;
begin
select member_id into x from member_table where member_id=v_id;
update member_table set member_name=v_name,member_phone=v_phone,member_point=v_point,member_balance=v_balance,member_date=v_date
where member_id=v_id;
dbms_output.put_line('会员已修改!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('修改失败!该会员不存在!');
end upd_member;
/

exec upd_member('0001','李杭瑞','13300225588','196','90',to_date('2021-01-29 17:20:00','YYYY-MM-DD HH24:MI:SS'))
8.12 会员信息查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create or replace procedure que_member(
v_id member_table.member_id%type)
as
v1 member_table.member_id%type;
v2 member_table.member_name%type;
v3 member_table.member_phone%type;
v4 member_table.member_point%type;
v5 member_table.member_balance%type;
v6 member_table.member_date%type;
begin
select member_id,member_name,member_phone,member_point,member_balance,member_date
into v1,v2,v3,v4,v5,v6
from member_table where member_id=v_id;
dbms_output.put_line(v1||','||v2||','||v3||','||v4||','||v5||','||v6);
exception
when NO_DATA_FOUND then
dbms_output.put_line('查询失败!此电影不存在!');
end que_member;
/

exec que_member(0002)
8.13 折扣信息增加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create or replace
procedure add_discount(
v_id discount_table.discount_id%type,
v_mid discount_table.movie_id%type,
v_count discount_table.discount_count%type,
v_point discount_table.discount_point%type,
v_start discount_table.discount_start%type,
v_end discount_table.discount_end%type)
as
begin
insert into discount_table values(v_id,v_mid,v_count,v_point,v_start,v_end);
EXCEPTION
when Dup_val_on_index then
dbms_output.put_line('此折扣信息已存在!');
when others then
dbms_output.put_line('exception');
end add_discount;
/

exec add_discount('0001','0001','30','3',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),to_date('2021-5-10 12:10:10','YYYY-MM-DD HH24:MI:SS'))
exec add_discount('0003','0001','30','3',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),to_date('2021-5-10 12:10:10','YYYY-MM-DD HH24:MI:SS'))
8.14 折扣信息删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create or replace procedure del_discount
(v_id discount_table.discount_id%type)
as
x discount_table.discount_id%type;
begin
select discount_id into x from discount_table where discount_id=v_id;
delete from discount_table where discount_id=v_id;
dbms_output.put_line('此折扣信息已删除!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('此折扣信息不存在!');
end del_discount;
/

exec del_discount('0004')
exec del_discount('0003')
8.15 折扣信息修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace
procedure upd_discount(
v_id discount_table.discount_id%type,
v_mid discount_table.movie_id%type,
v_count discount_table.discount_count%type,
v_point discount_table.discount_point%type,
v_start discount_table.discount_start%type,
v_end discount_table.discount_end%type)
as
x discount_table.discount_id%type;
begin
select discount_id into x from discount_table where discount_id=v_id;
update discount_table set movie_id=v_mid,discount_count=v_count,discount_point=v_point,discount_start=v_start,discount_end=v_end
where discount_id=v_id;
dbms_output.put_line('折扣信息已修改!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('修改失败!此电影折扣信息不存在!');
end upd_discount;
/

exec upd_discount('0001','0001','30','3',to_date('2021-3-13 15:10:00','YYYY-MM-DD HH24:MI:SS'),to_date('2021-5-10 12:10:10','YYYY-MM-DD HH24:MI:SS'))
8.16 影讯信息查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create or replace procedure que_discount(
v_id discount_table.discount_id%type)
as
v1 discount_table.discount_id%type;
v2 discount_table.movie_id%type;
v3 discount_table.discount_count%type;
v4 discount_table.discount_point%type;
v5 discount_table.discount_start%type;
v6 discount_table.discount_end%type;
begin
select discount_id,movie_id,discount_count,discount_point,discount_start,discount_end
into v1,v2,v3,v4,v5,v6
from discount_table where discount_id=v_id;
dbms_output.put_line(v1||','||v2||','||v3||','||v4||','||v5||','||v6);
exception
when NO_DATA_FOUND then
dbms_output.put_line('查询失败!此电影不存在!');
end que_discount;
/

exec que_discount(0002)
8.17 订单信息删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create or replace procedure del_sale
(v_id sale_table.sale_id%type)
as
x sale_table.sale_id%type;
begin
select sale_id into x from sale_table where sale_id=v_id;
delete from sale_table where sale_id=v_id;
dbms_output.put_line('此订单已删除!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('此订单不存在!');
end del_sale;
/

exec del_sale('0007')
exec del_sale('0006')
8.18 订单信息修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
create or replace
procedure upd_sale(
v_id sale_table.sale_id%type,
v_meid sale_table.member_id%type,
v_moid sale_table.movie_id%type,
v_date sale_table.sale_date%type,
v_session sale_table.sale_session%type,
v_room sale_table.sale_room%type,
v_seat sale_table.sale_seat%type,
v_price sale_table.sale_price%type,
v_get sale_table.sale_get%type,
v_flag sale_table.sale_flag%type)
as
x sale_table.sale_id%type;
begin
select sale_id into x from sale_table where sale_id=v_id;
update sale_table set member_id=v_meid,movie_id=v_moid,sale_date=v_date,sale_session=v_session,
sale_room=v_room,sale_seat=v_seat,sale_price=v_price,sale_get=v_get,sale_flag=v_flag
where sale_id=v_id;
dbms_output.put_line('订单已修改!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('修改失败!此订单不存在!');
end upd_sale;
/

exec upd_sale('0001','0001','0001',to_date('2021-4-10 13:10:00','YYYY-MM-DD HH24:MI:SS'),to_date('2021-4-12 13:10:00','YYYY-MM-DD HH24:MI:SS'),'普通影厅1','L坐','60','30','Y')
8.19 订单信息查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
create or replace procedure que_sale(
v_id sale_table.sale_id%type)
as
v1 sale_table.sale_id%type;
v2 sale_table.member_id%type;
v3 sale_table.movie_id%type;
v4 sale_table.sale_date%type;
v5 sale_table.sale_session%type;
v6 sale_table.sale_room%type;
v7 sale_table.sale_seat%type;
v8 sale_table.sale_price%type;
v9 sale_table.sale_get%type;
v10 sale_table.sale_flag%type;
begin
select sale_id,member_id,movie_id,sale_date,sale_session,sale_room,sale_seat,sale_price,sale_get,
sale_flag
into v1,v2,v3,v4,v5,v6,v7,v8,v9,v10
from sale_table where sale_id=v_id;
dbms_output.put_line(v1||','||v2||','||v3||','||v4||','||v5||','||v6||','||v7||','||v8||','||v9||','
||v10);
exception
when NO_DATA_FOUND then
dbms_output.put_line('查询失败!此订单不存在!');
end que_sale;
/

exec que_sale(0002)
8.20 退单信息删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create or replace procedure del_back
(v_id back_table.back_id%type)
as
x back_table.back_id%type;
begin
select back_id into x from back_table where back_id=v_id;
delete from back_table where back_id=v_id;
dbms_output.put_line('此退单信息已删除!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('此退单信息不存在!');
end del_back;
/

exec del_back('0004')
exec del_back('0003')
8.21 退单信息修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
create or replace
procedure upd_back(
v_id back_table.back_id%type,
v_meid back_table.member_id%type,
v_moid back_table.movie_id%type,
v_sid back_table.sale_id%type,
v_date back_table.back_date%type,
v_count back_table.back_count%type,
v_point back_table.back_point%type)
as
x back_table.back_id%type;
begin
select back_id into x from back_table where back_id=v_id;
update back_table set member_id=v_meid,movie_id=v_moid,sale_id=v_sid,back_date=v_date,
back_count=v_count,back_point=v_point
where back_id=v_id;
dbms_output.put_line('退单信息已修改!');
exception
when NO_DATA_FOUND then
dbms_output.put_line('修改失败!此退单信息不存在!');
end upd_back;
/

exec upd_back('0001','0001','0002','0004',to_date('2021-4-14 19:10:00','YYYY-MM-DD HH24:MI:SS'),'80','8')
8.22 退单信息查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace procedure que_back(
v_id back_table.back_id%type)
as
v1 back_table.back_id%type;
v2 back_table.member_id%type;
v3 back_table.movie_id%type;
v4 back_table.sale_id%type;
v5 back_table.back_date%type;
v6 back_table.back_count%type;
v7 back_table.back_point%type;
begin
select back_id,member_id,movie_id,sale_id,back_date,back_count,back_point
into v1,v2,v3,v4,v5,v6,v7
from back_table where back_id=v_id;
dbms_output.put_line(v1||','||v2||','||v3||','||v4||','||v5||','||v6||','||v7);
exception
when NO_DATA_FOUND then
dbms_output.put_line('查询失败!此退单信息不存在!');
end que_back;
/

exec que_back(0002)

9. 导出

1
exp system/123456@orcl file=D:\app\lhr.dmp owner=<c##lhr1802>log=D:\app\lhr.log

设计总结

在这次的实验中,我主要以积分优惠影票销售系统的设计为主,在上面的设计文档中,不仅涉及了表和字段,还涉及到了索引、视图、触发器、存储过程等内容。其中为了提高操作的效率,我主要利用存储过程来完成对表的操作,这使数据库的性能得到了优化。我利用了多种思路来设计这个系统,也利用各种的方法对表进行管理。

在实验过程中,系统功能主要是特惠电影票销售所需要的各种功能来实现的,在改系统的设计上让我们懂得了如何去寻找我们所要的设计的内容,增加了我个人的思维能力,进一步完善了我对oracle数据库的了解,也实现了对数据库的设计,最终成功完成我们自己想要的设计。

CATALOG
  1. 1. 需求分析
    1. 1.1. 功能阐述
    2. 1.2. 用例图
  2. 2. 功能模块设计
    1. 2.1. 影讯管理模块
    2. 2.2. 会员管理模块
    3. 2.3. 售票管理模块
    4. 2.4. 退票管理模块
    5. 2.5. 折扣管理模块
  3. 3. 数据库设计
    1. 3.1. 数据库概念结构设计
    2. 3.2. 数据库逻辑结构设计
      1. 3.2.1. movie_table(影讯表)
      2. 3.2.2. member_table(会员信息表)
      3. 3.2.3. sale_table(售票信息表)
      4. 3.2.4. back_table(退票信息表)
      5. 3.2.5. discount_table(折扣表)
    3. 3.3. 用户权限以及授权功能
      1. 3.3.1. 1. 创建表空间
      2. 3.3.2. 2. 普通用户的创建和授权
      3. 3.3.3. 3. 表的创建
        1. 3.3.3.1. 3.1 创建影讯表(movie_table)
        2. 3.3.3.2. 3.2 创建会员表(member_table)
        3. 3.3.3.3. 3.3 创建售票表(sale_table)
        4. 3.3.3.4. 3.4 创建退票表(back_table)
        5. 3.3.3.5. 3.5 创建折扣表(discount_table)
      4. 3.3.4. 4.表信息的录入
        1. 3.3.4.1. 4.1 movie_table表
        2. 3.3.4.2. 4.2 member_table表
        3. 3.3.4.3. 4.3 sale_table表
        4. 3.3.4.4. 4.4 back_table表
        5. 3.3.4.5. 4.5 discount_table表
      5. 3.3.5. 5. 创建视图
        1. 3.3.5.1. 5.1 查询电影余票
        2. 3.3.5.2. 5.2 查询各个影片销量
        3. 3.3.5.3. 5.3 查询各个影片折扣力度
        4. 3.3.5.4. 5.4 查询各个影片收入
        5. 3.3.5.5. 5.5 查询各个影片退款情况
        6. 3.3.5.6. 5.6 统计会员积分与可抵扣的金额
        7. 3.3.5.7. 5.7 查询会员观影排行
        8. 3.3.5.8. 5.8 查询售票表中已取走的票
        9. 3.3.5.9. 5.9 查询售票表中未取走的票
      6. 3.3.6. 6. 创建索引
        1. 3.3.6.1. 6.1 按照电影信息创建余票降序索引
        2. 3.3.6.2. 6.2 按照折扣价格创建升序索引
        3. 3.3.6.3. 6.3 按照购票积分创建升序索引
        4. 3.3.6.4. 6.4 按照会员积分创建降序索引
      7. 3.3.7. 7. 创建触发器
        1. 3.3.7.1. 7.1 插入修改或删除影讯后统计当前电影数量
        2. 3.3.7.2. 7.2 修改会员表后显示修改前与修改后信息的差别,插入和删除会员时显示删除的会员卡号和会员名
        3. 3.3.7.3. 7.3 修改售票表后显示修改前与修改后信息的差别
        4. 3.3.7.4. 7.4 修改退票表后显示修改前与修改后信息的差别
        5. 3.3.7.5. 7.5 购票后显示折扣、获得积分、可抵金额、余额、余票
        6. 3.3.7.6. 7.6 退票后显示余额、退款额和退还积分
        7. 3.3.7.7. 7.7 增改折扣后显示折扣价格
      8. 3.3.8. 8. 创建存储过程
        1. 3.3.8.1. 8.1 会员充值
        2. 3.3.8.2. 8.2 会员购票
        3. 3.3.8.3. 8.3 会员退票
        4. 3.3.8.4. 8.4 会员取票
        5. 3.3.8.5. 8.5 影讯信息增加
        6. 3.3.8.6. 8.6 影讯信息删除
        7. 3.3.8.7. 8.7 影讯信息修改
        8. 3.3.8.8. 8.8 影讯信息查询
        9. 3.3.8.9. 8.9 会员信息增加
        10. 3.3.8.10. 8.10 会员信息删除
        11. 3.3.8.11. 8.11 会员信息修改
        12. 3.3.8.12. 8.12 会员信息查询
        13. 3.3.8.13. 8.13 折扣信息增加
        14. 3.3.8.14. 8.14 折扣信息删除
        15. 3.3.8.15. 8.15 折扣信息修改
        16. 3.3.8.16. 8.16 影讯信息查询
        17. 3.3.8.17. 8.17 订单信息删除
        18. 3.3.8.18. 8.18 订单信息修改
        19. 3.3.8.19. 8.19 订单信息查询
        20. 3.3.8.20. 8.20 退单信息删除
        21. 3.3.8.21. 8.21 退单信息修改
        22. 3.3.8.22. 8.22 退单信息查询
      9. 3.3.9. 9. 导出
  4. 4. 设计总结