二、综合题某宿舍管理系统的数据库设计部分表结构如下:
1.学员信息表(student),用于保存学员个人信息,包括学号、姓名、性别、入住日期、退宿日期,入住的宿舍房间编号(引用宿舍房间信息表中的主键)等字段。
2.宿舍房间信息表(Dormitory):用于保存宿舍系统中房间的信息,包括房间编号,房间名称(同一栋的房间名称是唯一的),楼栋编号、房间月租费、房间电费单价、房间状态(1表示正常使用,2表示维修)
3.房间电费抄表(DormitoryCopy)表:用来存放各房间各月的电表读数,字段如下:
抄表编号(dormitorycopyid)(主键) int,
房间编号(dormitoryid) int (引用房间信息表的主键),
房间名称(dormitoryname) varchar2(20),
楼栋编号(buildingid) int,
抄表月份(monthly) date (这里只记录某年某月,后面的日期都用1日0时0分0秒),
抄表读数(copyNum) int (这里只记录当月抄电表时的电表读数),
抄表日期(copydate) date(实际抄表的日期)。
4.宿舍费用(DormitoryFee):用来保存每个月每个学生因住宿而产生的电费,宿舍费用表中的信息包括:编号、学号、姓名、姓别、月份、楼栋编号、房间编号、房间名称、入住日期、退宿日期、计费天数,上月电表读数、本月电表读数、当月用电度数、用电单价、电费、房租费,总费用等信息。
因业务需要,宿舍管员会在每个宿舍有学员入住时,把电表读数记录下来,并录入数据库中,作为上月份电表的底读数。宿舍管理员每个月的最后一天会用纸质的表格把各宿舍的电表的当前读数抄下来,第二天(即每个月的一号)会把上个月抄出来的电表读数录入到系统中,然后进行宿舍费用的计算。根据要求,完成下面两道题:
1.由于在抄电表的过程中,抄表的人员只记录了“楼栋编号、房间名称、抄表月份、抄表读数、抄表日期。因此,在数据录入时需要使用触发器将楼栋编号与房间名称对应的房间编号找出,并使用Sequence生成一个唯一的编号作为该抄表记录的主键值一并插入到房间电费抄表(DormitoryCopy)表中。(注意:如果抄表月份中的日期应该把月份后面全部值舍去),请你完成这个触发器,以实现该功能!
2.每个月初把各房间电表抄表录系统之后,对上一个月的学员宿舍的费用进行计算。用一个存储过程来实现这计算的过程,要求传入待计算的月份作为参数,该过程就能按计算规则进行计算,并把每位同学的宿舍费用计算的结果保存到宿舍费用表中。计算的过程必须遵循下面的业务规则:
1)每个同学都有入住日期,但不一定有退宿日期,若退宿日期为空,表示还未退宿,仍然在宿舍住着。宿舍费用(DormitoryFee)表中的计费天数是退宿日期减去入住日期的实际天数,若超过“待计算的月份(即为宿舍费用表中的月份字段)”的最大天数,则视为当月的计费天数为一整个月。
2)同一个宿舍可能会有多人入住,则电费应按该宿舍的入住学员的人天总数平均分摊.而房间费则按房间信息表中规定的费用核计。
3)总费用=电费+房租费
3.用导出命令按用户模式导出user01用户的所有数据(提交导出命令与导出的dmp及log文件)。