----模拟银行的常规业务
----开户
----存取钱,转账
-----查询历史交易
----挂失
----修改密码
----催款业务
----统计利润率
-----出现错误,编辑
---------------------------------------------------------员工的考核
----表一:用户基本信息表
create table userInfo
(
uuid number(6),
uname varchar2(20),
uaddress varchar2(50),
ucis varchar2(18),---身份证
utel varchar2(11),
primary key(uuid)
)
select * from userInfo
---表二:账户信息表
create table countTnfo
(
cardid varchar2(20),---账户id,账号
pwd varchar2(20),
money number(10),---余额
opendate date,---开户日期
saveType varchar2(20),---账户类型,定期还是货期
moneyType varchar2(20),---哪的账户
ucid varchar2(18),---外键
primary key(cardid)
)
drop table countTnfo
select * from countTnfo
----表三:历史交易记录表
create table transInfo(
tid number(6),---流水编号
cardid varchar2(20),
ttype varchar2(10),---交易类型,转账,存款,跨行
tdate date,
tmoney number(10),
primary key(tid)
)
--------------------------------------------------------------------------1........完成开户
-----第一:创建函数,这个函数的作用产生一个账号
----1.用函数产生一个随机考号,其中约束条件是前八位固定,后八位随机,6100 1212 **** *****
create or replace function make_vardid
return varchar2
is
v_rand_num varchar2(20);
begin
select substr(to_char(dbms_random.value),2,4) ||' '||
substr(to_char(dbms_random.value),6,4) into v_rand_num
from dual;---产生随机数
v_rand_num:='6100 1212' ||' '||v_rand_num;
return v_rand_num;
end;
select make_vardid from dual---测试随机数
------第二:开户业务,开户的时候用到上面这个账号了(同时操作两个表,用户开户的时候要填写用户信息表和开户信息表)
create or replace procedure proc_open
(v_name varchar2, v_address varchar2,v_cid varchar2,v_tel varchar2,v_pwd varchar2,v_money number,v_savet varchar2,v_moneyt varchar2)
is
v_cardid varchar(20);
begin
v_cardid:=make_vardid;--函数调用
savepoint bg;---两个表同时插入(两个表用到事务)
-----sql是我自己创建的序列,sql.nextval表示产生下一个主键号
insert into userinfo values(sql.nextval,
v_name,v_address,v_cid,v_tel);
insert into countTnfo values(v_cardid,v_pwd,v_money,
sysdate,v_savet,v_moneyt,v_cid);
dbms_output.put_line('开户成功------');
commit;
exception
when others then
dbms_output.put_line('开户失败------');
rollback to bg;
end;
-----测试开户
begin
proc_open('小白','北京','111122223333444455',
'11011011011','888888',10,'定期','RMB');
end;
select * from userinfo;
select * from countTnfo
----------------------------------------------------------2...................完成存取款过程
----写一个存储过程模拟存取款,op表示操作(存还是取),交易信息表可以创建一个触发器
create or replace procedure take_save_pro
(v_cardId varchar2,v_pwd varchar2,v_money number, v_op varchar2)
is
v_pwd2 varchar2(10); ---用来保存在数据库中查到的密码
begin
select pwd into v_pwd2 from countTnfo where cardId=v_cardId;---得到密码
savepoint bg;---如果密码正确,如果选择了存款就加钱,如果选择取款就减钱
if v_pwd2 = v_pwd then
if v_op='存款' then
update countTnfo set money=money+v_money where cardId=v_cardId;
else
update countTnfo set money=money-v_money where cardId=v_cardId;
end if;
insert into transInfo values(seq_tid.nextval, v_cardId,v_op,sysdate,v_money);
dbms_output.put_line('交易成功------');
commit;
else
dbms_output.put_line('密码错误------');
end if;
exception
when others then
dbms_output.put_line('交易失败------');
rollback to bg;
end;
---测试存款和取款
select * from countTnfo---注意这里用到了上面的账号
select * from transInfo
delete from transInfo;
begin
take_save_pro('6100 1212 0949 3030','888888',100,'存款');
end;
---------------------------------------------3.模拟转账
----转账(参数:两个账户,自己的密码,转账金额)
create or replace procedure zhuan_proc
(v_cid1 varchar2,v_cid2 varchar2
,v_pwd varchar2 ,v_money number)
is
v_pwd2 varchar2(10);
begin
select pwd into v_pwd2 from
countTnfo where cardId=v_cid1;
savepoint bg;
if v_pwd=v_pwd2 then
update countTnfo set money=money-v_money
where cardId=v_cid1;
update countTnfo set money=money+v_money
where cardId=v_cid2;
insert into transInfo values(seq_tid.nextval,
v_cid1,'取款',sysdate,v_money);
insert into transInfo values(seq_tid.nextval,
v_cid2,'存款',sysdate,v_money);
dbms_output.put_line('转账成功------');
commit;
else
dbms_output.put_line('密码错误------');
end if;
exception
when others then
dbms_output.put_line('转账失败------');
rollback to bg;
end;
-----------------------------------------------
---测试转账业务
begin
zhuan_proc('6100 1212 0949 3030',
'6100 1212 4788 3274','888888',2);
end;