Oracle利用过程procedure块实现银行转账

--

create table account(

   id varchar(32) not null,

   name varchar(30),

   money numeric(10,2),

   constraint a_pk primary key(id)

);

--历史表

select * from history;

drop table history;

create table history(

   id varchar(32) not null

   aid varchar(32),

   dt varchar(19),

   money numeric(10,2),

   ty varchar(10),

   constraint h_pk primary key(id),

   constraint h_fk foreign key(aid) references account(id)



);











--写入用户

insert into account values(sys_guid(),'Jack',100);

insert into account values(sys_guid(),'Rose',50);

select * from account;

commit;

--BDD483DA232943A2BD7AFDEAA1D13015  Jack  100

--59D6EFC956DB447CB4F9A8BB6B188CCE  Rose  50

--创建过程



create or replace procedure trans(p1_id in varchar2,

                                  p2_id in varchar2,

                                  p_money in numeric)



as

  --声明一个变量

  v_count integer;

  --保存金额信息

  v_money account.money%type;

begin

    --限制p_money大于0

    if p_money<=0 then

        raise_application_error(-20000,'转账金额不能为0');

    end if;

    --先检查有没有转出的人

    select count(1) into v_count from account where id=p1_id;

    if v_count=0 then

        raise_application_error(-20000,'转出账号不正确');

    end if;

    --转入的账号

     select count(1) into v_count from account where id=p2_id;

     if v_count=0 then

        raise_application_error(-20000,'转入账号不正确');

    end if;

    --再检查金额情况

    select money into v_money from account where id=p1_id;

    --判断

    if p_money>v_money then

      raise_application_error(-20000,'转账金额不够');

    end if;

    dbms_output.put_line('开始转账');

    --开始转账

    --先减money

    update account set money=money-p_money where id=p1_id;

    --加钱

    update account set money=money+p_money where id=p2_id;

    --记录hist表

    --转出

    Insert Into History(Id,Aid,Dt,Money,Ty) 

        Values(Sys_Guid(),P1_Id,To_Char(Sysdate,'yyyy-mm-dd hh24:mi:ss'),

        0-p_Money,'转出');

    --再记录转入

    Insert Into History(Id,Aid,Dt,Money,Ty) 

        Values(Sys_Guid(),P2_Id,To_Char(Sysdate,'yyyy-mm-dd hh24:mi:ss'),

        P_Money,'转入');

    dbms_output.put_line('ok');

end;

select * from account;

Select * From History;



set serveroutput on;

Begin

  trans('BDD483DA232943A2BD7AFDEAA1D13015','59D6EFC956DB447CB4F9A8BB6B188CCE',100);

end;



commit

你可能感兴趣的:(procedure)