首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 工作总结
  • 工作计划
  • 心得体会
  • 竞聘演讲
  • 会议发言
  • 爱国演讲
  • 就职演说
  • 开业开幕
  • 思想学习
  • 征文演讲
  • 经验材料
  • 述职报告
  • 调研报告
  • 工作汇报
  • 年终总结
  • 申报材料
  • 学习体会
  • 企划方案
  • 活动方案
  • 技巧经验
  • 模板范例
  • 思想宣传
  • 经济工作
  • 工作报告
  • 组织人事
  • 反腐倡廉
  • 慰问贺电
  • 先进事迹
  • 思想汇报
  • 入党申请书
  • 党会发言
  • 先进性教育
  • 入团申请书
  • 个人简历
  • 演讲稿
  • 调查报告
  • 实习报告
  • 和谐社会
  • 观后感
  • 读后感
  • 作文范文
  • 自我鉴定
  • 讲话稿
  • 自查报告
  • 东北大学数据库应用程序设计实践报告

    时间:2020-09-14 11:43:29 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:程序设计 东北大学 实践

     课程编号:

     B080 10 0 9 004

     数据库应用程序设计实践报告

      姓 名

     学 号

     班 级

     指 导 教 师

     开 设 学 期

     20 0 16 6- -2 2 01 17 7 第一学 期

     开 设 时 间

     第 1 3 周 - -— — 第 第 5 15 周

     报 告 日 期

     201 6 /12 / 16

     评 定 成 绩

     评 定 人

     评 定 日 期

     东北大学软件学院

     1. 问题定义 银行代收费系统给电力公司开发得一套缴费系统,方便用户通过网银支付电费. 主要得用例图:

     图 1 银行代收费系统用例图 根据用例图得出主要得业务需求:

     (1)抄表

     系统管理员把抄表记录录入系统,抄表记录包括当前电表数、抄表日期、抄表人等信息,根据抄表记录,系统自动计算每个计费设备当月得应收电费。每个计费设备有唯一

     编号。

     (2)查询

     用户随时查询欠费金额。一个用户名下可能多个计费设备,查询欠费时,将所有计费设备欠费总与输出。需要考虑设备得余额问题。如果余额大于欠费,则欠费为 0,更新余额,修改 receivable 中 flag 标志。

     (3)缴费

     在当月电费清单生成完毕后,用户可进行电费缴纳,缴纳金额可就是任意金额.系统将缴费金额存入设备余额中,再次查询则欠费应该减少。

     (4)冲正

      用户在缴费过程中如果给其她用户缴费了,在当日 0 点前可以冲正,即把钱收回,放入余额,向 payfee 表中添加一个负数金额、相同银行流水号得记录.并且修改设备余额,此时查询欠费应该有改变。

     (5)对帐

      每个银行每日凌晨给电力公司得代缴费系统发送对账信息,代缴费系统记录对账结果,对账明细,对账异常信息进行存储。错误信息为 100银行没有此记录。101企业没有此流水号、102 银行企业金额不等。

     2. . 数据库设计 (1)ER 图设计: 自己设计得 ER图:

     经过老师修正统一得 ER 图:

     客户teladdress name设备deviceid拥有费用(应收)产生费用(实缴)缴纳银行缴给idnameflag

     idyearmonth paydate

     bankserial type

      paymoney

      idcodeidtype

      balance

     抄表记录产生idyearmonth snum

     basicfee

     银行记录银行对账总表银行对账异常表id

      payfee

      bankserial

      checkdate

     banktotalcountbanktotalmoneyourtotalcount ourtotalmoney id

     exceptiontype

     ourmoney id

      checkdate

      bankserial

     bankmoney (2)建表语句

     -- Create table create table Bank (

      id

      number(4),

      name varchar2(20),

      code char(2)

     ) ; —- Create/Recreate primary, unique and foreign key constraints

     alter table Bank

      add constraint PK_BANK_ID primary key (ID); alter table BANK

      add constraint PK_BANK_CODE unique (CODE); -- Create table create table client (

      id

     number(4),

      name

     varchar2(20),

      address varchar2(80),

      tel

      varchar2(20)

     )

     ; —- Create/Recreate primary, unique and foreign key constraints

     alter table client

      add constraint PK_CLIENT_ID primary key (ID); -— Create table create table device (

      deviceid number(4),

      clientid number(4),

      type

      char(2),

      balance

     number(7,2)

     )

     ; -- Create/Recreate primary, unique and foreign key constraints

     alter table device

      add constraint PK_DEVICE_DEVICEID primary key (DEVICEID); alter table device

      add constraint FK_DEVICE_CLIENTID foreign key (CLIENTID)

      references client (ID); —- Create table create table electricity (

      id

     number(4),

      deviceid

     number(4),

      yearmonth char(6),

      snum

     number(10)

     ) ; -- Create/Recreate primary, unique and foreign key constraints

     alter table electricity

      add constraint PK_ELECTRICITY_ID primary key (ID); alter table electricity

      add constraint FK_ELECTRICITY_DEVICEID foreign key (DEVICEID)

      references device (DEVICEID); —- Create table create table RECEIVABLES (

      id

     number(4),

      yearmonth char(6),

      deviceid

     number(4),

      basicfee

     number(7,2),

      flag

     char(1)

     )

     ; -— Create/Recreate primary, unique and foreign key constraints

     alter table RECEIVABLES

      add constraint PK_RECEIVABLES_ID primary key (ID); alter table RECEIVABLES

      add constraint FK_RECEIVABLES_DEVICEID foreign key (DEVICEID)

      references device (DEVICEID); —- Create table create table PAYFEE (

      id

      number(4),

      deviceid

      number(4),

      paymoney

      number(7,2),

      paydate

     date,

      bankcode

      char(2),

      type

      char(4),

      bankserial varchar2(20) ) ; -- Create/Recreate primary, unique and foreign key constraints

     alter table PAYFEE

      add constraint PK_PAYFEE_ID primary key (ID); alter table PAYFEE

      add constraint FK_PAYFEE_DEVICEID foreign key (DEVICEID)

     references device (DEVICEID); alter table PAYFEE

      add constraint FK_PAYFEE_BANKCODE foreign key (BANKCODE)

      references BANK (CODE); -- Create table create table BANKRECORD (

      id

      number(4),

      payfee

      number(7,2),

      bankcode

      char(2),

      bankserial varchar2(20) ) ; -- Create/Recreate primary, unique and foreign key constraints

     alter table BANKRECORD

      add constraint PK_BANKRECORD_ID primary key (ID); alter table BANKRECORD

      add constraint FK_BANKRECORD_BANKCODE foreign key (BANKCODE)

      references BANK (CODE); —— Create table create table CHECKRESULT (

      id

      number(4),

      checkdate

     date,

      bankcode

      char(2),

      banktotalcount number(4),

      banktotalmoney number(10,2),

      ourtotalcount

     number(4),

      ourtotalmoney

     number(10,2)

     )

     ; —— Create/Recreate primary, unique and foreign key constraints

     alter table cHECKRESULT

      add constraint PK_CHECKRESULT_ID primary key (ID); alter table CHECKRESULT

      add constraint FK_CHECKRESULT_BANKCODE foreign key (BANKCODE)

      references BANK (CODE); -— Create table create table check_exception (

      id

     number(4),

      checkdate

      date,

      bankcode

     char(2),

      bankserial

     varchar2(20),

      bankmoney

      number(7,2),

      ourmoney

     number(7,2),

      exceptiontype char(3)

     )

     ; —- Create/Recreate primary, unique and foreign key constraints

     alter table check_exception

      add constraint PK_CHECKEXCEPTION_ID primary key (ID); alter table CHECK_EXCEPTION

      add constraint FK_CHECKEXCEPTION_BANKCODE foreign key (BANKCOD

     E)

      references BANK (CODE); 3. . 数据库端得系统实现

     条 1、十条 s ql 语句 ( (1)

     )

     查询出所有欠费用户. (为了使测试方便, 修改添加了一些数据,见附录)

     select a、clientid,c、name,a、deviceid,b、yearmonth from device a join receivables b on a、deviceid=b、deviceid join client c on a、clientid=c、id where b、flag=0

      order by 1,3,4

     ( (2)

     )过 查询出拥有超过 2 个设备得用户 SELECT clientid,name FROM (SELECT clientid, COUNT(*)

     CT FROM device GROUP BY clientid)

     join client on client、id=clientid WHERE CT > 2

     ( (3)

     )

     统计电力企业 某个月 得总应收费用,实收费用 select month,sum(paymoney) from( select to_char(paydate,"yyyymm') as Month,paymoney from payfee p

     where to_char(paydate,’yyyymm’)=’201608" ) group by month

     -—实收费用

     select yearmonth ,sum(basicfee) as receivableMoney from receivables group by yearmonth having yearmonth=’201608' -—应收费用

     ( (4)

     )

     查询出所有欠费超过半年得用户 with s as( select b、deviceid ,count(b、deviceid) from

     receivables b where flag=0 group by b、deviceid having count(b、deviceid)〉1 --我将题目修改成超过一个月

     )

     select device、clientid,device、deviceid from

     device join s on

     device、deviceid=s、deviceid order by 1,2

      ( (5)

     )

     查询任意用户得欠费总额 select clientid,sum(b、basicfee)

     from device a join receivables b on a、deviceid=b、deviceid where clientid=1

     group by clientid ,flag having flag=0

     ( (6)

     )得 查询出某个月用电量最高得 3 名用户 with s as ( select sum(b、snum)

     as sum_num, a、clientid from device a inner join electricity b on a、deviceid = b、deviceid where b、yearmonth = ’201608’ -- 月份条件

     group by a、clientid )

     select s0、* from( select s、clientid, s、sum_num from s order by s、sum_num desc)s0 where rownum <= 3

      ( (7)

     )

     查询出电力企业某个月哪天得缴费人数最多 select day,num from

     (

      select count(id) as num ,to_char(paydate,’yyyymmdd") as day

      from payfee

      where to_char(paydate,’yyyymm")="201608’

      group by to_char(paydate,’yyyymmdd’)

      order by count(bankserial)

     desc ) where rownum<2;——查询 8 月份付款人数最多得一天

     ( (8)

     )

     按设备类型使用人数从高到低排序查询列出设备类型, 使用人数。

     select device、type,count(*) as num from device group by device、type order by count(*) desc

      ( (9)

     )

     统计每个月各银行缴费人次,从高到低排序。

     select to_char(paydate,"yyyymm’)

     yearmonth,bank、name, count(payfee、id) num

     from bank join payfee on bank、code = payfee、bankcode

     group by to_char(paydate,’yyyymm'),bank、name

     order by yearmonth,num desc;

      —— 增加了一条记录,修改了两条记录

     ( (10)

     )

     查询出电力企业所有新增用户(使用设备不足半年). select client、id,device、deviceid from client join device on client、id = device、clientid join electricity on device、deviceid = electricity、deviceid group by client、id,device、deviceid having count(yearmonth)<6;

     -—如果某个设备得抄表记录数小于 6,则其使用不足半年

      附录:

     添加修改得数据: 1、在device 表下,加入数据如图:

     2、在 receivables表中,加入四个设备两个月得应收记录如图:

     3.在 payfee 里加入1201 设备 201609 得付款记录

      4、向electricity中插入数据,如下图,比较用户.

     5.将payfee 中得部分记录得 bankcode 更改,订单日期也进行更改 6.增加记录到 bank 表中。

      2 、事物存储过程 (1)

     查询 码 代码 1: (按设备号进行查询,在代码 2 中被调用) create or replace procedure queryfee1(deviceno in number, smoney out number )

     is

      basicfee number(7,2);

      yearmonth receivables、yearmonth%type;

      dtype device、type%type;

     days number;

     days2 number;

      d_balance number;

      rid number;

      chargedate date;

      cursor temp_cursor is

     select r、basicfee,r、yearmonth,d、type,r、id

     from

     device d, receivables r

     where

     d、deviceid = r、deviceid

     and r、flag = 0

     and d、deviceid=deviceno; begin

      smoney:=0;

      open temp_cursor;

      loop

      fetch temp_cursor into basicfee,yearmonth,dtype,rid;

      exit when temp_cursor%notfound;

      smoney:=smoney+basicfee;

      smoney:=smoney+basicfee*0、08;

      if dtype = ’01" then

     smoney:= smoney + basicfee*0、1;

     else

      smoney:=smoney + basicfee*0、15;

      end if;

     select round(sysdate - add_months(to_date(yearmonth,'yyyymm'),1))

      into days

     from dual;

     select TO_CHAR(SYSDATE,’DDD')

     into days2 from dual;

     if days 〉0 then

     if dtype='01" then —-居民

     违约金 跨年与不跨年违约金比例相同

     smoney:=smoney+basicfee*0、001*days;

     else

      if days<days2 then —— 其她, 不跨年

     smoney:=smoney+basicfee*0、002*days;

      else

     ——其她,跨年

      smoney:=smoney+basicfee*0、002*(days—days2)+basicfee*0、003*(days2);

     end if;

      end if;

      end if;

     end loop;

      select balance into d_balance from device where deviceid=deviceno;

     if(smoney<=d_balance and smoney!=0) then —-如果设备余额大于欠费

     余额更新、欠费置 0

      select trunc(sysdate) into chargedate from dual; ——截取到日

      insert into devicerecord values(deviceno,smoney,rid,chargedate); --把设备扣费记录保存保存

      update device set balance=balance-smoney where deviceid=deviceno;

     update receivables set flag=2 where id=rid;

     smoney:=0;

      elsif(smoney!=0)

     then --设备余额不够缴费

      smoney:=smoney-d_balance;

      end if; end queryfee1; 代码2 2: (按用户号获得设备号,将设备号传入代码 1 )

     得存储过程中)

     create or replace procedure QueryFee(clientno in client、id%type, smoney out number)

     is

      deviceno number;

     d_smoney number;

      cursor temp_cursor is

     select d、deviceid

     from client c, device d

     where c、id = d、clientid

     and c、id = clientno; begin

      smoney:=0;

      open temp_cursor;

      loop

      fetch temp_cursor into deviceno;

      exit when temp_cursor%notfound;

      queryfee1(deviceno,d_smoney);

      smoney:=smoney+d_smoney;

     end loop; end QueryFee;

     测试截图:

     设备 6 得应收费用表:

     查询设备 6 得欠费金额:

     主要创新点:

     1.我将修改标志位flag 与扣费得过程写在了此存储过程中.查询时如果设备余额大于欠费数,则用余额对设备进行缴费,更新 flag=2(第二天凌晨所有得flag=2更改为 1)就是为

     了标志就是今天得扣费修改过程,方便冲正。

     2.我新设置了一个表,bankrecord 用来记录扣费记录,方便冲正得时候将设备金额变回来。

     3、在计算跨年费用时,我使用了 select TO_CHAR(SYSDATE,"DDD") into days2 from dual; 首先判断当前时间就是一年中得第几天,再根据老师得代码,设备欠费天数 days 作比较. 如果 days>days2 ,说明存在跨年得欠费,否则不存在。

     2. 缴费 代码:(添加记录到payf ee 表中,并更改设备余额)

     create or replace procedure payfee1(deviceno in number,paymoney in number,results out varchar )

     is

     paydate date; begin

      if paymoney>0 then

     select trunc(sysdate)

     into paydate from dual; —-截取到日

      insert into payfee values(paysequence、nextval,deviceno,paymoney,paydate,19,2001,bankserial、nextval);

     update device set balance=balance+paymoney where deviceid=deviceno;

      results:="成功’;

     else

      results:="缴费失败,缴费金额不能少于 0’;

      end if; end payfee1; 测试截图

     缴费之后得 payfee表:(增加了一条付费记录)

      再次查询欠费金额:(欠费金额为 0)

     缴费之后得设备表:(余额由 3 变成58、8)

     设备 6 应收费用表:(flag=2用来标志就是今天刚刚缴费得,方便冲正。)

      主要创新点: 按照设备号进行缴费,向 payfee 中添加记录。

     使用序列来控制流水号,与id。

     3. 冲正 代码 create or replace procedure Reverse ( re_bankserial in payfee、bankserial%type,results out varchar) is

      deviceno number;

      re_money number; —-冲正钱数

     d_balance number; —-设备余额

     d_smoney number; -—设备扣费前得余额

     re_bankcode char(2);

      re_date date;

      paydate date;

     cursor temp_cursor is

     select p、deviceid,p、paymoney,p、bankcode,p、paydate

     from

     payfee p

     where p、bankserial=re_bankserial and p、bankserial in (

     select bankserial

      from payfee

     group by bankserial

      having count(*)=1); --没被冲正过得记录

     begin

      open temp_cursor;

     fetch temp_cursor into deviceno,re_money,re_bankcode,paydate;

     select trunc(sysdate)

     into re_date from dual; —-截取到日

      if temp_cursor%NOTFOUND

     --判断有无数据

      then results :='失败,没有找到此流水号";

     elsif paydate!=re_date then

     results:=’失败,不就是本日记录。’;

     else

      insert into payfee values(paysequence、nextval,deviceno,0-re_money,re_date,re_bankcode,2000,re_bankserial);

     select balance into d_balance from device where deviceid=deviceno; —-取出设备得余额

      if(d_balance>re_money)

     then —-设备余额大于充值钱数

     说明充值得钱数不够,flag 不变

     update device

     set balance=balance—re_money where deviceid=deviceno;

     results :=’成功";

      else —-设备余额小于充值钱数,说明充值之后够了,并且扣费成功了

     update receivables set flag = 0 where deviceid=deviceno and flag=2;

     select distinct money into d_smoney from devicerecord where deviceid=deviceno and chargedate=paydate;

     update device set balance=balance+d_smoney-re_money where deviceid=deviceno;

      results :=’成功’;

     end if;

     end if; end Reverse ; 测试截图 将刚刚为 6 得缴费冲正.

     此时得 payfee 表:(增加了一条冲正记录)

     应收费用表:(flag 标志为变成 0)

      设备表:(回到缴费前 3 元状态)

     查询设备 6 得欠费情况:(回到缴费前得状态,仍然欠费 141、2)

     主要创新点:

     实验得主要思路就是主要确定有一致得缴费记录,并且流水号记录只有一次,说明没有

     冲正过,然后进行冲正。

     冲正过程中,读取设备此时余额与缴费金额(或者说就是冲正金额)作对比,根据“设备初始金额+缴费金额-扣费金额=设备此时余额”,如果设备此时余额<缴费金额,这说明执行了扣费过程,需要进行 receivable 中标志位得更改,也需要修改device表中得设备余额,这时候用到了扣费记录表(自己建得)找到扣费金额。那么 设备此时得余额+扣费金额-缴费金额=设备初始金额 、 如果设备此时余额>缴费金额 ,这说明缴费之后依然欠费,没有进行扣费.这时候只需要向 payfee 中添加记录,并修改设备金额; 4. 对总账 代码 create or replace procedure checkmoney(check_bankcode in char,total_count

     in

     number, total_money in

     number,check_date

     in

     varchar,results out varchar) is

      bankcode1 varchar(2);

      paydate1 date;

      total_money1 number;

      total_count1 number;

      re_count number;

      cursor temp_cursor is

     select bankcode,paydate,sum(paymoney),count(*)

     from

     payfee

      group by bankcode,paydate

     having bankcode=check_bankcode and to_char(paydate,’yyyymmdd’)=check_date; begin

     select count(*) into

     re_count

     from

     payfee

      where bankcode=check_bankcode and to_char(paydate,’yyyymmdd")=check_date and paymoney〈0;

     open temp_cursor;

     fetch temp_cursor into bankcode1,paydate1,total_money1,total_count1;

     total_count1:=total_count1-re_count*2;

     if total_count1=total_count and total_money1=total_money then

     results:="对账成功’;

     else

     results:=’对账失败,执行对账明细.’;

     check_detail (check_date);

     end if; end checkmoney; 测试截图 对账成功(:

      Payfee 表中数据:

     对账失败,调用对账明细:

     主要创新点:

     主要思路就是用游标把 payfee 表中符合银行代码、日期得记录保存

     起来,然后提取出来进行比较。失败则调用对明细账模块,将错误信息存储. 5.对明细帐 代码: create or replace procedure check_detail(check_date in char) is

     Bbankcode varchar(2);

     Bpayfee number;

     Bbankserial varchar(20);

     Pbankserial varchar(20);

     Ppayfee number;

     Ppaydate date;

     cursor temp_cursor is

     select b、bankcode,b、payfee ,b、bankserial,p、bankserial,p、paymoney

     from bankrecord b full outer join payfee p on p、bankserial=b、bankserial

      where p、bankserial not in

     (select bankserial -—找到冲正得记录 与 被冲正得记录

     from

     payfee

      where type=2000) and to_char(p、paydate,'yyyymmdd")=check_date or to_char(p、paydate,"yyyymmdd") is null; begin

      select trunc(sysdate)

     into Ppaydate from dual; --截取到日

     open temp_cursor;

      loop

      fetch temp_cursor into BBankcode,Bpayfee,Bbankserial,Pbankserial,Ppayfee;

      exit when temp_cursor%notfound;

      if(Bbankserial is null) then

      insert into check_exception values(checkid、nextval,ppaydate,Bbankcode,Pbankserial,Bpayfee,Ppayfee,100);

      elsif(Pbankserial is null) then

     insert into check_exception values(checkid、nextval,Ppaydate,Bbankcode,Bbankserial,Bpayfee,Ppayfee,101);

     elsif(Bpayfee!=Ppayfee)

     then

      insert into check_exception values(checkid、nextval,Ppaydate,Bbankcode,Bbankserial,Bpayfee,Ppayfee,102);

     end if;

      end loop; end check_detail; 测试截图:

     对账失败时

      Checkexception 表中数据:100-银行无此流水号

     101-企业无此流水号

     102-银行与企业记录得钱数不等

     主要创新点: 主要思路就是将 payfee表与银行记录表进行全连接,然后进行筛选。

     因为一开始我在构建游标时使用了 where paydate=check_date 筛选条件,忽略了全连接之后企业没有此流水号记录,paydate 为空得情况,导致了企业方无此流水号这种错误记录不会出现。所以将条件改为 to_char(p、paydate,'yyyymmdd")=check_date or to_char(p、paydate,"yyyymmdd")

     is null;

     4. 程序实现 调用存储过程代码: package database; import java、sql、CallableStatement; import java、sql、Connection; import java、sql、DriverManager; import java、sql、SQLException; import java、sql、Types; import java、text、ParseException; import java、text、SimpleDateFormat; import java、util、Date;

     import java、util、Scanner; public class procedure {

     {noitpecxEesraP sworht )sgra ][gnirtS(niam diov citats cilbupﻩ ;”revirDelcarO、cbdj、elcaro” = revird gnirtSﻩﻩ

     ;"EX:95194:tsohlacol:niht:elcaro:cbdj" = lru gnirtSﻩ

     //连接字符串,49159 对应得就是我得 oracle在我得电脑上使用得端口,XE 就是服务名

     ;”rh" = resu gnirtSﻩﻩ

     String password = "hr";

     ﻩ try {

     ﻩﻩ Class、forName(driver); ﻩsap ,resu ,lru(noitcennoCteg、reganaMrevirD = noitcennoc noitcennoCﻩsword);

     System、out、println(”连接成功");

      ;eurt = nigol naeloobﻩﻩ ﻩ

     ;)ni、metsyS(rennacS wen = rennacs rennacSﻩﻩ;eciohc tniﻩ ﻩ

     ;sc tnemetatSelballaCﻩ ﻩﻩ String bankSerial = null;

     ﻩ

     String result;

     ﻩ

     String bankCode;

      ﻩ String date1 = null;

     ;muNlatot tniﻩ ﻩ

     int totalMoney;

     ﻩﻩ String date; ﻩ ;onecived tniﻩ

     ;yenoMyap tniﻩﻩ ﻩﻩ while(login)

     {

     ;)”询查、1"(nltnirp、tuo、metsySﻩﻩ ﻩﻩﻩ System、out、println("2、缴费");

     ﻩ

      System、out、println("3、冲正");

      ;)”帐总对、4"(nltnirp、tuo、metsySﻩ ﻩﻩ

     ;)”账细明对、5”(nltnirp、tuo、metsySﻩ ﻩﻩﻩ System、out、println(”0、退出");

     ﻩ

     ﻩ System、out、println(”请输入选项:");

     ;)(tnItxen、rennacs = eciohcﻩﻩ

      { )eciohc( hctiwsﻩﻩ ﻩ:1 esacﻩ ﻩﻩﻩ

     ;)":号户客入输请"(nltnirp、tuo、metsySﻩ

     ﻩ

     ;)(tnItxen、rennacs = onremotsuc tniﻩﻩ

     ﻩ;)”)?,?(EEFYREUQ llac"(llaCeraperp、noitcennoc = scﻩ

     ﻩ

      cs、setInt(1, customerno);

     ﻩﻩ

      cs、registerOutParameter(2, Types、NUMERIC);

     cs、execute();

      ;)2(tnIteg、sc = yenoms elbuodﻩﻩﻩﻩﻩ;)yenoms(nltnirp、tuo、metsySﻩﻩﻩﻩ;kaerbﻩ

     ﻩ

     case 2:

     ﻩﻩﻩ

     cs = connection、prepareCall("call payfee1(?,?,?)");

      ;)":号备设入输请"(nltnirp、tuo、metsySﻩﻩ ﻩ

     ;)(tnItxen、rennacs = onecivedﻩ

      ﻩ

     ;)”:额金费缴入输请"(nltnirp、tuo、metsySﻩ

     ﻩ

     ;)(tnItxen、rennacs = yenoMyapﻩﻩ ﻩ

     ﻩ

     cs、setInt(1, deviceno);

     cs、setInt(2, payMoney);

      ﻩ

     ﻩ cs、registerOutParameter(3, Types、VARCHAR);

      ﻩ cs、execute();

     ﻩﻩ

     ;)3(gnirtSteg、sc = tluserﻩﻩ ﻩ

     ﻩﻩ System、out、println(result);

      ﻩ

      break;

      ﻩ

     case 3:

     ﻩ

     ;)":号水流行银入输请"(nltnirp、tuo、metsySﻩ ﻩﻩﻩ

     bankSerial = scanner、next();

     ﻩ

     ;)")?,?(esrever llac"(llaCeraperp、noitcennoc = scﻩ

      ﻩ

     cs、setString(1, bankSerial);

     ﻩ

     ﻩ

     ;)RAHCRAV、sepyT ,2(retemaraPtuOretsiger、scﻩ

     ﻩﻩﻩ cs、execute();

      ﻩ result = cs、getString(2);

      ﻩﻩ

     System、out、println(result);

     ﻩﻩﻩ

     ;kaerbﻩ

     ﻩﻩ case 4:

     ﻩ

     System、out、println("请输入银行代号:”);

      ﻩﻩ

     bankCode = scanner、next();

      ﻩﻩ

     ;)”:数笔总入输请"(nltnirp、tuo、metsySﻩ ﻩ

     ﻩ

     totalNum = scanner、nextInt();

     ﻩ

     System、out、println("请输入总金额:”);

     ﻩ ﻩ;)(tnItxen、rennacs = yenoMlatotﻩ

      ﻩ

     ;)”:期日入输请"(nltnirp、tuo、metsySﻩ

     ﻩﻩ

     date1 =scanner、next();

     ﻩﻩ

      java、util、Date d = new SimpleDateFormat("yyyy-MM-dd")、parse(date1);

      ﻩ;)")?,?,?,?,?(yenomkcehc llac"(llaCeraperp、noitcennoc = scﻩ ﻩ

     ﻩ

     ;)laireSknab ,1(gnirtStes、scﻩ ﻩ

     ;)muNlatot ,2(tnItes、scﻩ

     ﻩ

     ;)yenoMlatot ,3(tnItes、scﻩﻩ

      ﻩ

     ﻩﻩ cs、setDate(4, new java、sql、Date(d、getTime()));

     ﻩ

      ;)RAHCRAV、sepyT ,5(retemaraPtuOretsiger、scﻩﻩ ﻩﻩ

     ;)(etucexe、scﻩﻩ

     ﻩﻩﻩ result = cs、getString(5);

     ﻩ

     ;)tluser(nltnirp、tuo、metsySﻩ ﻩ

     ﻩﻩ break;

      ﻩ

     :0 esacﻩ ﻩﻩﻩ

     login = false;

     ﻩ

     ﻩ

     System、out、println("拜拜!!!"); ﻩﻩﻩ;kaerbﻩ

     ﻩ

     default:

     ﻩ

     ﻩﻩ System、out、println(”输入有误!请重新输入:");

      ﻩ

     ;kaerbﻩﻩ }ﻩﻩﻩﻩ ﻩ

     } ﻩ } { )e noitpecxEdnuoFtoNssalC(hctacﻩﻩ ﻩ

     ;)"常异接连"(nltnirp、tuo、metsySﻩ

     } catch(SQLException e) {

     ﻩ

     ;)(ecarTkcatStnirp、eﻩ ﻩ }

     } } 5. . 遇到得问题及其解决方案 1) 查询对账明细时,对账明细表中没有错误类型为 100 得记录,即企业有流水号、银行没有流水号得情况。

     错误原因:因为一开始我在构建游标时使用了where paydate=check_date筛选条件,忽略了全连接之后企业没有此流水号记录,paydate 为空得情况,导致了企业方无此流水号这种错误记录不会出现. 解决方案:将条件改为 to_char(p、paydate,’yyyymmdd’)=check_date or to_char(p、paydate,"yyyymmdd")

     is null; 程序可以正确运行。

     2) 同一缴费记录冲正可以多次进行。

     错误原因:未考虑仅可冲正一次得限制。

     解决方案:在从payfee 表中读取数据得时候,对流水号有两次(说明已冲正)得进行剔除。

     3)

     在 java 程序实现得时候,出现错误:

      解决方法:错误得原因就是我在使用数据库得时候,登陆账户使用得就是系统权限。所以我将数据库内容改成了normol权限。

     6. . 创新点 1) 冲正过程中,对设备余额进行修改,让其返回初始状态。我将修改标志位 flag 与扣费得过程写在了此存储过程中。查询时如果设备余额大于欠费数,则用余额对设备进行缴费,更新flag=2(第二天凌晨所有得flag=2更改为 1)就是为了标志就是今天得扣费修改过程,方便冲正.我新设置了一个表,bankrecord 用来记录扣费记录,方便冲正得时候将设备金额变回来。

     2) 查询过程中,我把查询分成了两个存储过程,一个就是按设备号进行查询,一个就是按客户号进行查询,然后客户号查询时调用设备查询过程。查询过程中就进行了扣费过程,如果余额大于欠费,则进行扣费,并修改标志位. 3) 冲正过程中,根据“设备初始金额+缴费金额-扣费金额=设备此时余额",读取设备此时余额与缴费金额(或者说就是冲正金额)作对比:如果设备此时余额<缴费金额,这说明执行了扣费过程,需要进行 receivable 中标志位得更改,也需要修改device 表中得设备余额,这时候用到了扣费记录表(自己建得)找到扣费金额。那么 设备此时得余额+扣费金额-缴费金额=设备初始金额;如果设备此时余额〉缴费金额 ,这说明缴费之后依然欠费,没有进行扣费.这时候只需要向payfee 中添加记录,并修改设备金额; 4) 在计算跨年费用时,我使用了 select TO_CHAR(SYSDATE,"DDD’)

     into days2 from dual;首先判断当前时间就是一年中得第几天,再根据老师得代码,设备欠费天数days 作比较。如果 days>days2 ,说明存在跨年得欠费,否则不存在. 7. 总结

     1) 通过这次实验,充分学习了数据库得相关知识,从业务分析来画出 ER 图,设计表结构,练习了 sql 语句以及事物存储过程 plsql 语言,并且学会了如何从java 调用数据库存

     储过程.总之,从这次实验中学到了很多知识,非常感谢老师。

     2) 测试就是非常必要得工具,在完成代码后一定要进行充分您得测试来发现就是否有错误存在。我在实验过程中本来以为代码已经完善了,但就是经过充分得测试,总可能发现一个又一个得问题需要自己去解决。

     3) 代码就是基于现实生活得,我本来在实验存储过程2中设置了低于欠费不可以缴费。但就是实际生活中,电力公司一定就是无条件接受所有缴费得.所以得代码得编写一定要基于实践、基于现实。

     4) 作业得分步提交能够极大得提高同学们得学习效率与时间,不会出现将实验堆积到最后一起写得拖沓情况。希望实验都可以按照这种方式来进行验收。有多少耕耘就有多少收获,这次得实验我本着认真、认真再认真得态度,熬了很多个夜晚,甚至吃饭得时候都在想代码。最终也能够高质量得完成代码与实验,希望自己以后能够认真对待每一个实验,为自己负责. 5) 每次验收得时候自己总会非常紧张,希望自己在以后得学习生活中,能够战胜自己,敢于面对,克服自己得障碍。

     参考文献 例:

     [1] 萨师煊,王珊、数据库系统概论(第三版)[M]、北京:

     高等教育出版社,2002,122—150、 [2] 侯捷、Java 编程思想[M]、北京:机械工业出版社,2002,22—35、 教师评语或 评价表格:

     评价内容

     具

     体

     要

     求

     分值

     得分

     平时表现

     实践课过程中,无缺勤、迟到、早退现象,学习态度积极. . 按时提交3 3 次阶段成果物, , 且完成正确。

     30

     实践验收

     按实践要求合理设计并定义出数据库结构, , 认真记录实验数据, , 原理及实验结果分析准确, , 归纳总结充分。程序结构清晰正确, SQ L与 PL / SQ L程序代码书写规范,简洁。验收过程中能够正确回答问题。在解决问题得过程中有自己独到得见解, , 并能够有 所创新。

     40 0

     报告质量

     实践报告格式规范, , 报告内容充实、正确,报告叙述逻辑严密, , 可准确反映出实践过程中出现得问题与解决方案, ,以及独立分析问题与解决问题得能力。

     3 3 0

     总

     分

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识