Vikot106's Blog.

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

字数统计: 6.7k阅读时长: 35 min
2021/04/27 52 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. 需求分析
  2. 2. 功能模块设计
  3. 3. 数据库设计
  4. 4. 设计总结