zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Nokia N8手机上开发Qt应用程序第一步:配置手机,使其支持Qt应用程序的运行
    Visual Studio 2010 "工具">"选项"中的VC++目录编辑功能已被否决
    删除用户 ORA04098
    把Excel转换成DataTable
    可编辑的DIV
    RDLC 错误号.
    leetcode| Add Digits
    leetcode| Integer to English Words
    leetcode|Counting Bits
    锁表了。。。
  • 原文地址:https://www.cnblogs.com/xiaweifeng/p/3676609.html
Copyright © 2011-2022 走看看