/*宾馆管理系统-综合项目
第一部分 案例描述
案例目的
  学习并巩固oracle数据库编程技术,包括存储过程、触发器、索引、视图、序列、同义词、事务、游标等,培养学生对数据库设计和程序的能力。
案例难度
  ★★★★
案例覆盖技能点
1、  存储过程
2、  触发器
3、  索引
4、  视图
5、  序列、同义词
6、  事务
7、  游标
8、  函数
推荐案例完成时间
   2天
适用课程和对象
  Oracle数据库设计
第二部分  需求和开发环境
使用技术和开发环境
  Oracle 10g
项目背景
随着我国改革开放的深入,宾馆服务业的竞争日益激烈,一个宾馆要想立于不败之地,就必须提高整体竞争能力,变革宾馆的管理模式,提高管理水平,实施信息化建设无疑是实现这一目的的必由之路和明智之举。目前,我国宾馆服务业的信息化管理进展缓慢,在激烈的竞争中,如何能把握机会,保持自己的优势,立于不败之地呢?这就需要提供最好的服务,提供最完善的设施和最先进的技术。一个成功的宾馆,其经营者不仅要提高服务水平和服务质量,从而提高客房占有率和回头率,还要有好的工作效率,并控制成本。在信息时代,更重要的是还必须要有一个完善的信息管理系统,以方便客人和更好地管理宾馆。
信息管理系统就是我们常说的MIS(Management Information System),在强调管理,强调信息的现代社会中它变得越来越普及。传统的登记表的做法极大的影响了工作流程效率和数据的正确性、完整性、安全性,已经逐渐落后于时代。利用软件管理系统代替手工的宾馆管理,将会大大提高工作效率。
案例需求
宾馆的主要活动首先可分为四个部分,即预订管理、入住管理、消费管理和退房结算管理。
 
预订管理主要包括登记客人的预订信息,查询预订信息,同时还需要注意预订信息不能出现冲突现象,例如两个客人都预订了同一天的同一个房间,这是不允许的;此外,在快到预订时确定的客人预抵时间时,接待人员要打电话证明客人是否能按时入住,如果不能,就会把预订单作废,或者称为失效;

除了按流程划分的这四个部分之外,还有两个部分:客房管理和用户管理。;这两部分信息需要在客人入住以前提前设定好。

*/

—————————————————————————————————————————————————————————————————————————————

第一部分 项目描述

1.1项目目的

学习并巩固oracle数据库编程技术,包括存储过程、触发器、索引、视图、序列、同义词、事务、游标等,培养学生对数据库设计和程序的能力。第二部分 需求和开发环境

2.1使用技术和开发环境

Oracle11g

2.2项目需求

信息管理系统就是我们常说的MIS(Management Information System),在强调管理,强调信息的现代社会中它变得越来越普及。传统的登记表的做法极大的影响了工作流程效率和数据的正确性、完整性、安全性,已经逐渐落后于时代。利用软件管理系统代替手工的宾馆管理,将会大大提高工作效率。宾馆的主要活动首先可分为四个部分,即预订管理、入住管理、消费管理和退房结算管理。

2.3详细功能

预订管理主要包括登记客人的预订信息,查询预订信息,同时还需要注意预订信息不能出现冲突现象,例如两个客人都预订了同一天的同一个房间,这是不允许的;此外,在快到预订时确定的客人预抵时间时,接待人员要打电话证明客人是否能按时入住,如果不能,就会把预订单作废,或者称为失效;

除了按流程划分的这四个部分之外,还有两个部分:客房管理和用户管理。;这两部分信息需要在客人入住以前提前设定好。

2.4 E-R图

2.5数据表的设计

表1 用户表

表名

hotel_t_User (用户表)

列名

描述

数据类型

空/非空

约束条件

userid

用户编号

NUMBER(38)

非空

主键(自增)

username

用户名称

VARCHAR2(20)

非空

userpassword

密码

VARCHAR2(20)

非空

truename

真实姓名

VARCHAR2(20)

非空

表2 角色表

表名

hotel_t_Role (角色表)

列名

描述

数据类型

空/非空

约束条件

roleid

用户编号

NUMBER

非空

主键

rolename

用户名称

VARCHAR2(20)

非空

表3 权限表

表名

hotel_t_Right (权限表)

列名

描述

数据类型

空/非空

约束条件

right

用户编号

NUMBER

非空

主键

rightname

用户名称

VARCHAR2(20)

非空

表4 角色权限表

表名

hotel _t_Roleright (角色权限表)

列名

描述

数据类型

空/非空

约束条件

rrid

编号

NUMBER

非空

主键

roleid

用户编号

NUMBER

非空

外键

rightid

权限编号

NUMBER

非空

外键

表5 用户角色表

表名

hotel_t_Userrole (用户角色表)

列名

描述

数据类型

空/非空

约束条件

urid

编号

NUMBER

非空

主键

roleid

用户编号

NUMBER

非空

外键

rightid

权限编号

NUMBER

非空

外键

表6 客房类型表

表名

hotel_t_Roomtype(客房类型表)

列名

描述

数据类型

空/非空

约束条件

typeid

类型编号

NUMBER

非空

主键

typename

类型名称

VARCHAR2(20)

非空

mardedprice

标价

NUMBER(12,2)

scale

折扣比例

NUMBER(5,4)

lowestprice

最低折扣价

NUMBER(12,2)

表7 客房信息表

表名

hotel_t_Room(客房信息表)

列名

描述

数据类型

空/非空

约束条件

roomid

序号

VARCHAR2(10)

非空

主键

typeid

类型编号

NUMBER

非空

外键

layer

楼层

VARCHAR2(20)

bendnumber

床位数

NUMBER

state

状态

NUMBER

非空

表8 预订信息表

表名

 hotel_t_Predestine(预订信息表)

列名

描述

数据类型

空/非空

约束条件

predid

预订单号

CHAR(16)

非空

主键

roomid

房号

VARCHAR2(10)

非空

whenpred

预定时间

DATE

非空

whopred

预订人

VARCHAR2(10)

非空

phone

联系方式

VARCHAR2(10)

非空

arrivetime

预抵时间

DATE

非空

leavetime

预离时间

DATE

非空

trueprice

房价

NUMBER(12,2)

state

状态

NUMBER

非空

表9 历史预订信息表

表名

 hotel_t_ Predestinehistory(历史预订信息表)

列名

描述

数据类型

空/非空

约束条件

predid

预订单号

CHAR(16)

非空

主键

roomid

房号

VARCHAR2(10)

非空

whenpred

预定时间

DATE

非空

whopred

预订人

VARCHAR2(10)

非空

phone

联系方式

VARCHAR2(10)

非空

arrivetime

预抵时间

DATE

非空

leavetime

预离时间

DATE

非空

trueprice

房价

NUMBER(12,2)

state

状态

NUMBER

非空

表10 入住信息表

表名

hotel_t_Lodge(入住信息表)

列名

描述

数据类型

空/非空

约束条件

lodgeid

入住单号

CHAR(16)

非空

主键

roomid

房号

VARCHAR2(10)

非空

外键

guestname

客人姓名

VARCHAR2(20)

非空

guestsex

性别

CHAR(1)

非空

cardtype

证件类别

VARCHAR2(20)

cardnumber

证件号码

VARCHAR2(30)

birthday

出生日期

DATE

guestaddress

地址

VARCHAR2(50)

phone

联系方式

VARCHAR2(20)

arrivetime

入住时间

DATE

非空

leavetime

预离或退房时间

DATE

非空

trueprice

房价

NUMBER(12,2)

非空

payinadvance

押金

NUMBER(12,2)

predid

预订单号

CHAR(16)

serverman

接待人员

VARCHAR2(20)

表11 历史入住信息表

表名

hotel_t_ Lodgehistory(历史入住信息表)

列名

描述

数据类型

空/非空

约束条件

lodgeid

入住单号

CHAR(16)

非空

主键

roomid

房号

VARCHAR2(10)

非空

外键

guestname

客人姓名

VARCHAR2(20)

非空

guestsex

性别

CHAR(1)

非空

cardtype

证件类别

VARCHAR2(20)

cardnumber

证件号码

VARCHAR2(30)

birthday

出生日期

DATE

guestaddress

地址

VARCHAR2(50)

phone

联系方式

VARCHAR2(20)

arrivetime

入住时间

DATE

非空

leavetime

预离或退房时间

DATE

非空

trueprice

房价

NUMBER(12,2)

非空

payinadvance

押金

NUMBER(12,2)

predid

预订单号

CHAR(16)

serverman

接待人员

VARCHAR2(20)

表12 消费信息表

表名

hotel_t_Consume(消费信息表)

列名

描述

数据类型

空/非空

约束条件

consid

消费编号

NUMBER

非空

主键

consname

消费项目

VARCHAR2(20)

非空

consmoney

消费金额

NUMBER(12,2)

非空

constime

消费时间

DATE

lodgeid

入住单号

CHAR(16)

非空

外键

2.6数据库约束的设计

功能:roleid参考hotel_t_Role表的roleid字段,外键约束

实现:roleidnumber not null references hotel_t_Role(roleid)

功能:rightid参考hotel_t_Right表的rightid字段,外键约束

实现:rightidnumber not null references hotel_t_Right(rightid)

功能:roleid参考hotel_t_Role表的roleid字段,外键约束

实现:roleidnumber not null references hotel_t_Role(roleid),

功能:rightid参考hotel_t_Right表的rightid字段,外键约束

实现:rightidnumber not null references hotel_t_Right(rightid)

功能:typeid参考hotel_t_Roomtype表的typeid字段,外键约束

实现:typeidNUMBER references hotel_t_Roomtype(typeid),

功能:检查约束0表示空闲,1表示入住,2表示预留,默认为0

实现:stateNUMBER default 0 check(state in (0,1,2)) not null

功能:取值范围为0、1和2,0表示有效,1表示入住,2表示失效,默认为0

实现:stateNUMBER default 0 check(state in (0,1,2)) not null

功能:roomid参考hotel_t_Room表的Roomid字段,外键约束

实现:roomidVARCHAR2(10) not null references hotel_t_Room(Roomid)

功能:检查约束,性别为非空,“男”或“女”

实现:guestsexCHAR(1) default 0 check(guestsex in (0,1)) not null,

功能:lodgeid参考hotel_t_Lodge表的lodgeid字段,外键约束

实现:lodgeidCHAR(16) not null references hotel_t_Lodge(lodgeid)

2.7数据库序列的设计

功能:创建seq_hotel_t_User序列,在插入时实现添加序号的功能

实现:createsequence seq_hotel_t_User;

功能:创建seq_hotel_t_Role序列,在插入时实现添加序号的功能

实现:createsequence seq_hotel_t_Role;

功能:创建seq_hotel_t_Right序列,在插入时实现添加序号的功能

实现:createsequence seq_hotel_t_Right;

功能:创建seq_hotel_t_Roleright序列,在插入时实现添加序号的功能

实现:createsequence seq_hotel_t_Roleright;

功能:创建seq_hotel_t_Userrole序列,在插入时实现添加序号的功能

实现:createsequence seq_hotel_t_Userrole;

功能:创建seq_hotel_t_Userrole序列,在插入时实现添加序号的功能

实现:createsequence seq_hotel_t_Roomtype;

功能:创建seq_hotel_t_Consume序列,在插入时实现添加序号的功能

实现:createsequence seq_hotel_t_Consume;

2.8数据库索引的设计

功能:在入住历史表上,基于客人姓名和入住时间创建简单非聚集组合索引

实现:

create index guestname_arrivetime_index

on hotel_t_lodge(guestname,arrivetime);

2.9数据库视图的设计

功能:基于客房表和客房类型表创建视图

实现:

CREATE VIEW v_room AS

SELECThotel_t_Roomtype.typeid,typename,mardedprice,scale,lowestprice,

roomid,layer,bednumber,state

FROM  hotel_t_Roomtype,hotel_t_Room

WHERE hotel_t_Roomtype.typeid = hotel_t_Room.typeid;

select * from v_room;

功能:查询预订信息的视图,以提高查询结果的可读性

实现:

create or replace view v_Predestine as

select * from hotel_t_Predestine where state in(0);

功能:查询预订历史信息的视图

实现:

create or replace view v_Predestine as

select * from hotel_t_Predestine where state in(1,2);

功能:查看在店客人的视图

实现:

create view lodgenow_view as

select *

from hotel_t_lodge

where to_char(sysdate,'yyyy-mm-dd') <to_char(leavetime,'yyyy-mm-dd');

功能:查看客人入住历史的视图

实现:

create view lodgeever_view as

select *

from hotel_t_lodge

where to_char(sysdate,'yyyy-mm-dd') >=to_char(leavetime,'yyyy-mm-dd');

2.11数据库触发器的设计

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:

create or replace trigger tir_hotel_t_User

before  insert orupdate  on hotel_t_User for each row

begin

selectseq_hotel_t_User.nextval

into:new.userid from dual;

end;

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:

create or replace trigger tir_hotel_Role --创建触发器

before  insert orupdate  on hotel_t_Role for each row

begin

selectseq_hotel_t_Role.nextval

into:new.roleid  from dual;

end;

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:

create or replace trigger tir_hotel_Right --创建触发器

before  insert orupdate  on hotel_t_Right for each row

begin

selectseq_hotel_t_Right.nextval

into:new.Rightid  from dual;

end;

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:

create or replace trigger tir_hotel_Roleright --创建触发器

before  insert orupdate  on hotel_t_Roleright for each row

begin

selectseq_hotel_t_Roleright.nextval

into:new.rrid  from dual;

end;

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:

create or replace trigger tir_hotel_Userrole --创建触发器

before  insert or update  on hotel_t_Userrole for each row

begin

selectseq_hotel_t_Userrole.nextval

into:new.urid  from dual;

end;

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:

create or replace trigger tir_hotel_Roomtype --创建触发器

before  insert orupdate  on hotel_t_Roomtype for each row

begin

selectseq_hotel_t_Roomtype.nextval

into:new.typeid  from dual;

end;

功能:在插入数据前,先给每一行附上序号,以免发生null错误。

实现:

create or replace trigger tir_hotel_Consume --创建触发器

before  insert orupdate  on hotel_t_Consume for each row

begin

selectseq_hotel_t_Consume.nextval

into:new.consid  from dual;

end;

功能:实现插入、修改预订信息时保证预订房价不得低于房价最低价

实现:

create or replace trigger tri_predestine_3_2

before insert or update of Trueprice on hotel_t_Predestine

for each row

declare

mintrueprice   hotel_t_Predestine.Trueprice%type;

begin

selectmin(trueprice) into mintrueprice from hotel_t_Predestine;

if :new.trueprice< mintrueprice then

raise_application_error(-20001,'预订房价低于房价最低价');

end if;

end;

功能:实现预定时或修改预定时查找要预定的房间在预定的时间段有没有与其他的预定有冲突

实现:

create or replace trigger predestine_room_tri

before insert or update on hotel_t_predestine for each row

declare

p_roomcount number;

begin

select count(*) intop_roomcount

fromHOTEL_T_PREDESTINE

where roomid =:new.roomid and (arrivetime<:new.arrivetime or leavetime>:new.leavetime);

if p_roomcount>0then

raise_application_error(-20002,'该房间已经预定');

end if;

end;

功能:创建插入入住信息的触发器

实现:

create or replace trigger lodge_insert_tri

before insert or update on HOTEL_T_LODGE for each row

declare

r_stateHOTEL_T_ROOM.State%type;

l_roomidHOTEL_T_LODGE.roomid%type;

begin

dbms_output.put_line(:new.roomid);

l_roomid :=:new.roomid;

select state intor_state

from HOTEL_T_ROOM

where roomid =l_roomid;

if r_state=0 then

raise_application_error(-20003,'可以插入入住信息');

else

raise_application_error(-20004,'不可以插入入住信息');

end if;

end;

功能:创建办理续住手续的触发器

实现:

create or replace trigger continue_lodge_tri

before update on hotel_t_lodge for each row

declare

l_leavetimehotel_t_lodge.leavetime%type;

begin

l_leavetime :=:new.leavetime;

if l_leavetime <=:old.leavetime then

raise_application_error(-20005,'办理续住手续错误');

rollback;

else

raise_application_error(-20006,'办理续住手续正确');

commit;

end if;

end;

2.12数据库存储过程的设计

功能:编写一个存储过程,用来用户登录时验证用户,存储过程验证用户登陆信息

实现:

declare

cc number;

begin

select count(*) intocc from HOTEL_T_USER where userid =&userid and username='&userpassword';

if cc>0 then

dbms_output.put_line('登陆成功');

else

dbms_output.put_line('登陆失败');

end if;

exception

when no_data_foundthen

dbms_output.put_line('登陆失败');

end;

功能:创建一个存储过程,当快要到客人预订的预抵时间时(默认提前两个

小时),将房间状态设为预留,可以提醒接待人员与客人联系确认是否

入住。该存储过程的调用应该是每隔一段时间就调用一次,人为来操作

肯定是不现实的,在数据库中可以通过作业来实现

实现:

create or replace procedure remind_proc

is

p_roomid  hotel_t_predestine.roomid%type;

p_arrivetimehotel_t_predestine.arrivetime%type;

begin

selectroomid,arrivetime-2/24 into p_roomid,p_arrivetime

fromhotel_t_predestine;

ifp_arrivetime=sysdate then

updatehotel_t_room set state = 2 where roomid = p_roomid;

end if;

end;

declare

job_num number;

begin

dbms_job.submit(job_num,'remind_proc;',sysdate,'Sysdate+1/1440');

commit;

end;

功能:创建使预订单失效的存储过程

实现:

create or replace procedure predestine_state_proc(

p_predid varchar2

)

is

begin

updatehotel_t_predestine set state = 2 where

predid = p_predid;

end;

功能:创建结算存储过程(该存储过程首先根据客人的退房时间计算住宿的天数,然后用入住单上的房价乘以入住天数后得到住宿的房费;再分别计算出客人的其他消费合计,两项相加得到应收帐款,用应收帐款减去客人入住时交的押金,得到客人需要补交的金额,最后把这些信息输出。)

实现:

create or replace procedure accounts_proc(

a_roomid varchar2,a_guestname varchar2

)

is

lodgedaypricenumber(12,2);

c_consmoney number(12,2);

shouldmoneynumber(12,2);

paymoneynumber(12,2);

l_payinadvancenumber(12,2);

begin

select(leavetime-arrivetime)*trueprice into lodgedayprice

from hotel_t_lodge

where roomid =to_number(a_roomid) and guestname = a_guestname;

select consmoneyinto c_consmoney

from hotel_t_consumehtc,hotel_t_lodge htl

where htc.lodgeid =htl.lodgeid and

roomid = a_roomidand guestname = a_guestname;

shouldmoney :=c_consmoney + lodgedayprice;

select payinadvanceinto l_payinadvance

from hotel_t_lodge;

paymoney:=shouldmoney - l_payinadvance;

dbms_output.put_line('补交的金额为:'||paymoney);

end;

功能:创建退房存储过程(先是把当前时间修改为客人的退房时间,然后是将客

--人退掉的房间状态改为“空闲”,最后将该客人的入住信息转存到入住历史表,

--再将该信息从入住表中删除)

实现:

create or replace procedure leavetime_proc(

a_roomidvarchar2,a_guestname varchar2

)

is

r_lodgeidhotel_t_lodge.lodgeid%type;

r_roomidhotel_t_lodge.roomid%type;

r_guestnamehotel_t_lodge.guestname%type;

r_guestsexhotel_t_lodge.guestsex%type;

r_cardtypehotel_t_lodge.cardtype%type;

r_cardnumberhotel_t_lodge.cardnumber%type;

r_birthdayhotel_t_lodge.birthday%type;

r_guestaddresshotel_t_lodge.guestaddress%type;

r_phonehotel_t_lodge.phone%type;

r_arrivetimehotel_t_lodge.arrivetime%type;

r_leavetimehotel_t_lodge.leavetime%type;

r_truepricehotel_t_lodge.trueprice%type;

r_payinadvancehotel_t_lodge.payinadvance%type;

r_predidhotel_t_lodge.predid%type;

r_sercermanhotel_t_lodge.serverman%type;

begin

update hotel_t_lodgeset leavetime = sysdate where roomid = to_number(a_roomid) and guestname =a_guestname;

update HOTEL_T_ROOMset state = 0 where roomid = a_roomid;

selectlodgeid,roomid,guestname,guestsex,cardtype,cardnumber,birthday,guestaddress,phone,

arrivetime,leavetime,trueprice,payinadvance,predid,serverman intor_lodgeid,r_roomid,r_guestname,r_guestsex,

r_cardtype,r_cardnumber,r_birthday,r_guestaddress,r_phone,r_arrivetime,r_leavetime,r_trueprice,r_payinadvance,

r_predid,r_sercerman

from hotel_t_lodge htl;

insert intoHOTEL_T_LODGEHISTORYvalues(r_lodgeid,r_roomid,r_guestname,r_guestsex,r_cardtype,r_cardnumber,

r_birthday,r_guestaddress,r_phone,r_arrivetime,r_leavetime,r_trueprice,r_payinadvance,r_predid,

r_sercerman);

delete fromhotel_t_Consume where lodgeid = r_lodgeid;

delete fromhotel_t_lodge where lodgeid = r_lodgeid;

commit;

end;

附录代码:

--1.用户管理--------------------------------------------------------------------------------------------------------

--(1)建立相关的数据表及其约束,由于数据量都不大不需要建立所有
-- hotel_t_User(用户表)
Create table hotel_t_User(
    userid number primary key not null,--自增
    username varchar2(20) not null,
    userpassword varchar2(20) not null,
    truename varchar2(20) not null
);
select * from hotel_t_user;

create sequence seq_hotel_t_User;--序列

create or replace trigger tir_hotel_t_User --触发器
before  insert or update  on hotel_t_User for each row
begin
  select seq_hotel_t_User.nextval
         into :new.userid from dual;
end;
---------------
insert into hotel_t_User(username,userpassword,truename)
       values('Sky','147258','王聪');
insert into hotel_t_User(username,userpassword,truename)
       values('eee','145236','王小聪');
select * from hotel_t_user;

--(2)  编写一个存储过程,用来用户登录时验证用户
------存储过程验证用户登陆信息
select count(*) from hotel_t_User where userid =&userid and username ='&userpassword';

declare
  cc number;
begin
  select count(1) into cc from hotel_t_User where userid =&userid and username ='&userpassword';
  if cc>0 then
    dbms_output.put_line('登陆成功');
  else
    dbms_output.put_line('登陆失败');
  end if;
exception
  when no_data_found then
    dbms_output.put_line('登陆失败');
end;

--2.  客户基本信息管理:-----------------------------------------------------------------------------------------------

--(1)  建立相关的数据表及其约束,由于数据量都不大不需要建立所有
--客房基本信息管理
create table hotel_t_Roomtype(
        typeid NUMBER primary key not null, --自增
        typename VARCHAR2(20)  not null,  
        mardedprice NUMBER(12,2),  
        scale NUMBER(5,4),
        lowestprice NUMBER(12,2)
)
create sequence seq_hotel_t_Roomtype;
create or replace trigger tir_hotel_Roomtype
before  insert or update  on hotel_t_Roomtype for each row
begin
  select seq_hotel_t_Roomtype.nextval
         into :new.typeid  from dual;
end;

--(2)  基于客房表和客房类型表创建视图
CREATE VIEW v_room AS
SELECT hotel_t_Roomtype.typeid,typename,mardedprice,scale,lowestprice,
       roomid,layer,bednumber,state
FROM   hotel_t_Roomtype,hotel_t_Room
WHERE  hotel_t_Roomtype.typeid = hotel_t_Room.typeid;

select * from v_room;

--3.  预定管理-----------------------------------------------------------------------------------------------------------

--(1) 创建表及其相关约束
create table hotel_t_Predestine(--(预订信息表)
predid CHAR(16) primary key not null,--  非空  主键
roomid VARCHAR2(10) not null,--  非空  
whenpred DATE not null,--  非空  
whopred VARCHAR2(20) not null,--  非空  
phone VARCHAR2(20) not null,--  非空  
arrivetime DATE not null,--  非空  
leavetime DATE not null,--  非空  
trueprice NUMBER(12,2) not null,    
state NUMBER default 0 check(state in (0,1,2)) not null--  取值范围为0、1和2,0表示有效,1表示入住,2表示失效,默认为0*/
);

--表名  hotel_t_Predestine(预订信息表)
--列名 描述  数据类型 (精度范围)  空/非空  约束条件
--predid  预订单号  CHAR(16)  非空  主键
--roomid  房号  VARCHAR2(10)  非空  
--whenpred  预订时间  DATE  非空  
--whopred  预订人  VARCHAR2(20)  非空  
--phone  联系方式  VARCHAR2(20)  非空  
--arrivetime  预抵时间  DATE  非空  
--leavetime  预离时间  DATE  非空  
--trueprice  房价  NUMBER(12,2)    
--state  状态  NUMBER  非空  取值范围为0、1和2,0表示有效,1表示入住,2表示失效,默认为0*/

insert into hotel_t_Predestine values (0000000000000000,11,sysdate,'wa1','18111111111',sysdate+10,sysdate+34,100,0);
insert into hotel_t_Predestine values (0000000000000001,12,sysdate,'wa2','15555555555',sysdate+10,sysdate+34,100,1);
insert into hotel_t_Predestine values (0000000000000002,13,sysdate,'wa2','16666666666',sysdate+10,sysdate+34,100,2);
select * from hotel_t_Predestine;

--(2)  创建触发器:实现插入、修改预订信息时保证预订房价不得低于房价最低价
create or replace trigger tri_predestine_3_2
before insert or update of Trueprice on hotel_t_Predestine
for each row
declare
    mintrueprice   hotel_t_Predestine.Trueprice%type;
begin
  select min(trueprice) into mintrueprice from hotel_t_Predestine;
  if :new.trueprice < mintrueprice then
    raise_application_error(-20001,'预订房价低于房价最低价');
  end if;
end;
--(3)  创建触发器:实现预定时或修改预定时查找要预定的房间在预定的时间段有没有与其他的预定有冲突
select * from hotel_t_Predestine where roomid = &roomid;
select * from hotel_t_Predestine where roomid = &roomid;
select * from hotel_t_Predestine where roomid = &roomid;

create or replace trigger predestine_room_tri
before insert or update on hotel_t_predestine for each row
declare
 p_roomcount number;
begin
 select count(*) into p_roomcount
  from HOTEL_T_PREDESTINE
  where roomid = :new.roomid and (arrivetime<:new.arrivetime or leavetime>:new.leavetime);
 if p_roomcount>0 then
    raise_application_error(-20002,'该房间已经预定');
  end if;
end;

--(4)  创建一个查询预订信息的视图,以提高查询结果的可读性
create or replace view v_Predestine as
select * from hotel_t_Predestine where state in(0);

--(5)  创建一个查询预订历史信息的视图
create or replace view v_Predestine as
select * from hotel_t_Predestine where state in(1,2);

--(6)  创建一个存储过程,当快要到客人预订的预抵时间时(默认提前两个小时),
--       将房间状态设为预留,可以提醒接待人员与客人联系确认是否入住。该存储
--       过程的调用应该是每隔一段时间就调用一次,人为来操作肯定是不现实的,
--       在数据库中可以通过作业来实现
create or replace procedure remind_proc
is
  p_roomid  hotel_t_predestine.roomid%type;
  p_arrivetime hotel_t_predestine.arrivetime%type;
begin
  select roomid,arrivetime-2/24 into p_roomid,p_arrivetime
  from hotel_t_predestine;
  if p_arrivetime=sysdate then
    update hotel_t_room set state = 2 where roomid = p_roomid;
  end if;
end;
declare
       job_num number;
begin
          dbms_job.submit(job_num,'remind_proc;',sysdate,'Sysdate+1/1440');
          commit;
end;

--(7) 创建使预订单失效的存储过程
create or replace procedure predestine_state_proc(
p_predid varchar2
)
is
begin
  update hotel_t_predestine set state = 2 where
  predid = p_predid;
end;

-------------------
ALTER proc [dbo].[存储过程名]
 as
 begin
   declare 游标名字 cursor for select 列名 from 表名 where 条件--先申明游标指向查询出的结果,一列,或者多列都可以,条件自定
   declare 变量名  varchar(400)--存储取到的值
   open 游标名 --开启游标
   while @@FETCH_STATUS=0--取值
     begin
     fetch next FROM 游标名 into 变量名--这样就将游标指向下一行,得到的第一行值就传给变量了
     -------------------------------------------
     --需要执行的操作,例如修改某表中的字段
     update 表名
     set 列名=值
     where (修改表中的列)=变量名
     -------------------------------------------
 end
  close 游标名--关闭游标

deallocate  游标名--释放游标
end
-------------------
create or replace procedure pro_Predestine
is
   v_leavetime hotel_t_Predestine.leavetime%type;
begin
   select leavetime into v_leavetime from hotel_t_Predestine where
empno=v_id;
   dbms_output.put_line(v_ename||'   '||v_sal);   
end;

--4.  入住管理-------------------------------------------------------------------------------------------------------------------
--(1)  创建表及其相关约束

--hotel_t_Lodge(入住信息表)
create table hotel_t_Lodge(--(入住信息表)
--列名  描述  数据类型(精度范围)  空/非空  约束条件
lodgeid CHAR(16) primary key not null,-- 非空  主键
roomid VARCHAR2(10) not null references hotel_t_Room(Roomid),--  非空  外键
guestname VARCHAR2(20) not null,--  非空  
guestsex CHAR(1) default 0 check(guestsex in (0,1)) not null,--  非空  “男”或“女”
cardtype VARCHAR2(20),--  空  
cardnumber VARCHAR2(30),--  空  
birthday DATE,--  空  
guestaddress VARCHAR2(50),--  空  
phone VARCHAR2(20),--  空  
arrivetime DATE not null,--  非空  
leavetime DATE,--  非空  
trueprice NUMBER(12,2),--  非空  
payinadvance NUMBER(12,2) default 0,--  空  默认为0
predid CHAR(16),--  空  
serverman VARCHAR2(20)--  空
);
select  * from   hotel_t_Lodge;

--(2)  创建插入入住信息的触发器
create or replace trigger lodge_insert_tri
before insert or update on HOTEL_T_LODGE for each row
declare
  r_state HOTEL_T_ROOM.State%type;
  l_roomid HOTEL_T_LODGE.roomid%type;
begin
  dbms_output.put_line(:new.roomid);
  l_roomid := :new.roomid;
  select state into r_state
  from HOTEL_T_ROOM
  where roomid = l_roomid;
  if r_state=0 then
   raise_application_error(-20003,'可以插入入住信息');
  else
    raise_application_error(-20004,'不可以插入入住信息');
  end if;
end;

--(3)  创建办理续住手续的触发器
create or replace trigger continue_lodge_tri
before update on hotel_t_lodge for each row
declare
  l_leavetime hotel_t_lodge.leavetime%type;
begin
  l_leavetime := :new.leavetime;
  if l_leavetime <= :old.leavetime then
    raise_application_error(-20005,'办理续住手续错误');
    rollback;
  else
    raise_application_error(-20006,'办理续住手续正确');
    commit;
  end if;
end;

--(4) 创建查看在店客人的视图
create view lodgenow_view as
select *
from hotel_t_lodge
where to_char(sysdate,'yyyy-mm-dd') < to_char(leavetime,'yyyy-mm-dd');

--(5)  创建查看客人入住历史的视图
create view lodgeever_view as
select *
from hotel_t_lodge
where to_char(sysdate,'yyyy-mm-dd') >= to_char(leavetime,'yyyy-mm-dd');

--(6)  在入住历史表上,基于客人姓名和入住时间创建简单非聚集组合索引
--入住历史表
create table hotel_t_lodgehistory(
    lodgeid char(16) primary key not null,
    roomid varchar2(10) not null,
    guestname varchar2(20) not null,
    guestsex char(2) check(guestsex in('男','女')) not null,
    cardtype varchar2(20),
    cardnumber varchar2(30),
    birthday date,
    guestaddress varchar2(50),
    phone varchar2(20),
    arrivetime date not null,
    leavetime date not null,
    trueprice number(12,2) not null,
    payinadvance number(12,2) default 0,
    predid char(16),
    serverman varchar2(20)
);
------------------------
create index guestname_arrivetime_index
on hotel_t_lodge(guestname,arrivetime);
----------------

--5.  消费管理-----------------------------------------------------------------------------------------------------------------------
--(1) 创建消费信息表及其约束

--hotel_t_Consume(消费信息表)
create table hotel_t_Consume(--(消费信息表)
--列名  描述  数据类型(精度范围)  空/非空  约束条件
consid NUMBER primary key not null,--  非空  主键(自增)
consname VARCHAR2(20) not null,--  非空  
consmoney NUMBER(12,2) not null,-- 非空  
constime DATE,
lodgeid CHAR(16) not null references hotel_t_Lodge(lodgeid)-- 非空  外键
);

select  * from  hotel_t_Consume;
create sequence seq_hotel_t_Consume;
create or replace trigger tir_hotel_Consume
before  insert or update  on hotel_t_Consume for each row
begin
  select seq_hotel_t_Consume.nextval
         into :new.consid  from dual;
end;

--(2) 创建查询客人消费信息的视图
create index guestname_arrivetime_index
on hotel_t_lodge(guestname,arrivetime);

--6.  退房结算管理----------------------------------------------------------------------------------------------------------------
--(1)  创建结算存储过程(该存储过程首先根据客人的退房时间计算住宿的天数,然后用入住
--        单上的房价乘以入住天数后得到住宿的房费;再分别计算出客人的其他消费合计,两
--        项相加得到应收帐款,用应收帐款减去客人入住时交的押金,得到客人需要补交的金
--        额,最后把这些信息输出。)
create or replace procedure accounts_proc(
a_roomid varchar2,a_guestname varchar2
)
is
  lodgedayprice number(12,2);
  c_consmoney number(12,2);
  shouldmoney number(12,2);
  paymoney number(12,2);
  l_payinadvance number(12,2);
 
begin
 
  select (leavetime-arrivetime)*trueprice into lodgedayprice
  from hotel_t_lodge
  where roomid = to_number(a_roomid) and guestname = a_guestname;
  select consmoney into c_consmoney
  from hotel_t_consume htc,hotel_t_lodge htl
  where htc.lodgeid = htl.lodgeid and
  roomid = a_roomid and guestname = a_guestname;
  shouldmoney := c_consmoney + lodgedayprice;
  select payinadvance into l_payinadvance
  from hotel_t_lodge;
  paymoney :=shouldmoney - l_payinadvance;
  dbms_output.put_line('补交的金额为:'||paymoney);
end;

--(2)  创建退房存储过程(先是把当前时间修改为客人的退房时间,然后是将客人退掉的房间
--       状态改为“空闲”,最后将该客人的入住信息转存到入住历史表,再将该信息从入住表中删除)
create or replace procedure leavetime_proc(
  a_roomid varchar2,a_guestname varchar2
)
is
  r_lodgeid hotel_t_lodge.lodgeid%type;
  r_roomid hotel_t_lodge.roomid%type;
  r_guestname hotel_t_lodge.guestname%type;
  r_guestsex hotel_t_lodge.guestsex%type;
  r_cardtype hotel_t_lodge.cardtype%type;
  r_cardnumber hotel_t_lodge.cardnumber%type;
  r_birthday hotel_t_lodge.birthday%type;
  r_guestaddress hotel_t_lodge.guestaddress%type;
  r_phone hotel_t_lodge.phone%type;
  r_arrivetime hotel_t_lodge.arrivetime%type;
  r_leavetime hotel_t_lodge.leavetime%type;
  r_trueprice hotel_t_lodge.trueprice%type;
  r_payinadvance hotel_t_lodge.payinadvance%type;
  r_predid hotel_t_lodge.predid%type;
  r_sercerman hotel_t_lodge.serverman%type;
begin
  update hotel_t_lodge set leavetime = sysdate where roomid = to_number(a_roomid) and guestname = a_guestname;
  update HOTEL_T_ROOM set state = 0 where roomid = a_roomid;
  select lodgeid,roomid,guestname,guestsex,cardtype,cardnumber,birthday,guestaddress,phone,
  arrivetime,leavetime,trueprice,payinadvance,predid,serverman into r_lodgeid,r_roomid,r_guestname,r_guestsex,
  r_cardtype,r_cardnumber,r_birthday,r_guestaddress,r_phone,r_arrivetime,r_leavetime,r_trueprice,r_payinadvance,
  r_predid,r_sercerman
  from hotel_t_lodge htl;
  insert into HOTEL_T_LODGEHISTORY values(r_lodgeid,r_roomid,r_guestname,r_guestsex,r_cardtype,r_cardnumber,
  r_birthday,r_guestaddress,r_phone,r_arrivetime,r_leavetime,r_trueprice,r_payinadvance,r_predid,
  r_sercerman);
  delete from hotel_t_Consume where lodgeid = r_lodgeid;
  delete from hotel_t_lodge where lodgeid = r_lodgeid;
  commit;
end;

【雪野实训记录】Oracle宾馆管理系统-L2综合项目案例相关推荐

  1. oracle安装实训心得,oracle数据库实训心得.docx

    oracle数据库实训心得 Oracle实训 总结 系别:信管院班级:姓名:浦江峰学号: 日期:XX年12月21日 实训总结: 由于感到oracle实训担子很重,而自己的学识.能力和阅历与其任职都有一 ...

  2. 大四软件工程实训 总结 | TMS 物流管理系统 | 我们各自担任了产品经理、项目经理、IT总监、后端、前端和测试

    文章目录 一.实训介绍 1.1 实训目的 1.2 角色职责分配 产品经理 项目经理 IT 总监 后端程序员 前端程序员 测试人员 1.3 实训过程 二.实训记录 Day 1 需求文档 Day 2 项目 ...

  3. 《C语言程序设计》实训报告——学生成绩管理系统

    <C语言程序设计>实训报告--学生成绩管理系统 一.课程设计题目 <学生成绩管理系统> 二.课程设计要求 综合利用顺序.选择.循环等各种程序结构,使用自定义函数和二维数组,完成 ...

  4. 2020七月实训GUI学生信息管理系统

    2020七月实训GUI学生信息管理系统进一步完善 遍历所有的用户信息与通过ID查询用户信息 一.遍历用户信息 2.具体操作步骤如下: 3.进行java对数据库的操作 (关键部分): 3.对该项目的结果 ...

  5. 实训总结(图书管理系统java)

    实训总结(图书管理系统java) 1设计任务 完成用户登录验证,图书品类的增.删.查.改并保存到数据库中,打印购买图书订单,并将购买图书订单信息数据保存到数据库中. 2总体设计 序号 类名 说明 1 ...

  6. 轻大数据结构与算法实训在线餐馆预订管理系统

    使用c++语言,用了两天实现所有功能,等写完报告后,整理一下遇到的问题和解决办法. 一共620行代码 任务书要求使用中文作为key,建立散列表,但是使用c++很难把中文转unicode编码,我找到的代 ...

  7. 关于计算机网络实训室的申请书,计算机网络技术综合实训室建设方案.doc

    计算机网络技术综合实训室建设方案 计算机网络技术综合实训室建设方案 一.计算机网络技术综合实训室涉及的专业及学生数 计算机网络技术综合实训室主要用于电子信息系计算机网络技术及其他相关专业学生进行IP地 ...

  8. Python一个月实训记录

    文章目录 Python一个月实训 0701 0702 0703 0706 0707 0708 0709 0710 0713 1.爬虫介绍 1.1 大数据时代 1.2 什么爬虫? 1.3 爬虫如何爬取网 ...

  9. 【C语言期末实训】学生学籍管理系统

    目录:一,设计要求1,总体要求:2,具体功能:二,设计框架三,程序代码1,声明函数和头文件2,声明结构体3,声明全局变量4,主体启动函数5,主菜单函数6,创建学生档案函数7,编辑学生档案函数8,查询学 ...

最新文章

  1. mysql @value := 用法
  2. python怎么检查数据库实例能否链接_python pymysql链接数据库查询结果转为Dataframe实例...
  3. Gartner 2015新兴技术发展周期简评:大数据实用化、机器学习崛起
  4. 【Linux】一步一步学Linux——sum命令(234)
  5. CVS Branch 和 Merge 在 Eclipse 中的使用
  6. HDU - 1255 覆盖的面积(线段树+扫描线)
  7. linux间服务器间文件传输,Linux命令scp服务器间文件传输教程
  8. js hover图片放大不遮挡_CSS3+JS 实现放大镜
  9. 自然语言处理 -- NLP作业 1 :训练词向量
  10. JBoss JBPM 实践系列(一)--- 安装配置(Tomcat 6.0 + MySQL 5.1)
  11. 【TWVRP】基于matlab A_star算法求解带时间窗和任务软时间窗多车场多车型车辆路径问题【含Matlab源码 1561期】
  12. JavaScript高级程序设计 第4版
  13. uniapp的分享到朋友圈和朋友(APP)
  14. <aop:aspectj-autoproxy />作用
  15. Wildcard Matching 1
  16. QWebEngineView如何忽略SSL证书错误
  17. 软考是什么-有什么用-怎么报名-考试内容
  18. 作为父亲,给儿子留下些什么? | 黄华书房
  19. 你对YOLOV3损失函数真的理解正确了吗?
  20. matlab流量预测模型,基于MATLAB工具箱的BP神经网络年径流量预测模型研究——以塔城地区乌拉斯台河为例...

热门文章

  1. 【Win7磁盘碎片整理功能在哪】
  2. Java语言学习第一周周报
  3. 东南大学计算机考研学硕,东南大学学硕考研经验
  4. 读完你就知道对话式人工智能的数据采集如何解决啦!
  5. 微信小程序获取二维码接口整理,.Net Core后台获取小程序二维码
  6. 引流软件靠谱吗,当下引流软件那么多要怎样选择好用的软件呢?
  7. sketchup转stl_Sketchup最好用的减面优化和格式转换插件!
  8. ubuntu gedit找不到命令
  9. java8 Stream语法详解
  10. 联想笔记本怎么开启vt模式?