采用纯SQL语句实现银行管理系统的业务逻辑,基于MySQL5.6
先建立相关数据表
用户表:
1 SET FOREIGN_KEY_CHECKS=0; 2 3 -- ---------------------------- 4 -- Table structure for t_user 5 -- ---------------------------- 6 DROP TABLE IF EXISTS `t_user`; 7 CREATE TABLE `t_user` ( 8 `user_id` int(11) NOT NULL AUTO_INCREMENT, 9 `user_name` varchar(32) COLLATE utf8_bin NOT NULL, 10 `user_uuid` varchar(18) COLLATE utf8_bin NOT NULL, 11 `user_tel` varchar(11) COLLATE utf8_bin NOT NULL, 12 PRIMARY KEY (`user_id`) 13 ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
银行卡表:
t_bank.sql
1 SET FOREIGN_KEY_CHECKS=0; 2 3 -- ---------------------------- 4 -- Table structure for t_bank 5 -- ---------------------------- 6 DROP TABLE IF EXISTS `t_bank`; 7 CREATE TABLE `t_bank` ( 8 `bank_id` varchar(19) COLLATE utf8_bin NOT NULL, 9 `bank_pass` varchar(255) COLLATE utf8_bin NOT NULL, 10 `user_id` int(11) NOT NULL, 11 `bank_status` int(1) NOT NULL DEFAULT '0', 12 `regular_money` double(20,2) DEFAULT NULL, 13 `current_money` double(20,2) DEFAULT NULL, 14 `create_date` datetime NOT NULL, 15 PRIMARY KEY (`bank_id`), 16 KEY `u_id` (`user_id`) 17 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
交易记录表:
1 SET FOREIGN_KEY_CHECKS=0; 2 3 -- ---------------------------- 4 -- Table structure for t_deal 5 -- ---------------------------- 6 DROP TABLE IF EXISTS `t_deal`; 7 CREATE TABLE `t_deal` ( 8 `deal_id` int(11) NOT NULL AUTO_INCREMENT, 9 `in_bank_id` varchar(19) COLLATE utf8_bin DEFAULT NULL, 10 `out_bank_id` varchar(19) COLLATE utf8_bin DEFAULT NULL, 11 `money` double(20,2) NOT NULL, 12 `deal_date` datetime NOT NULL, 13 `deal_type` int(1) NOT NULL, 14 PRIMARY KEY (`deal_id`), 15 KEY `in_bank_id` (`in_bank_id`), 16 KEY `out_bank_id` (`out_bank_id`) 17 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
通过存储过程实现创建随机卡号(前八位固定后七位自增最后一位随机校验位,例:1010 3576 0000 0011)
1 DROP PROCEDURE my1; 2 3 create PROCEDURE my1() 4 BEGIN 5 DECLARE head varchar(19) DEFAULT '1010 3576 '; 6 DECLARE num int DEFAULT 1; 7 DECLARE len int; 8 DECLARE val int; 9 DECLARE str VARCHAR(19); 10 DECLARE str2 VARCHAR(19); 11 DECLARE str3 VARCHAR(19); 12 DECLARE str4 VARCHAR(19); 13 select IFNULL(bank_id,'1010 3576 0000 0010')into str from t_bank; 14 SELECT SUBSTRING(str FROM 11 FOR 4) into str2; 15 select SUBSTRING(str FROM 16 FOR 4) INTO str3; 16 select CONCAT(str2,str3) into str4; 17 select CONVERT(str4,SIGNED)into num; 18 set num=num+1; 19 select CONVERT(num,CHAR)into str; 20 select LPAD(str,7,'0')INTO str2; 21 select CONCAT(str2,floor(rand() * 10)) into str; 22 select LEFT(str,4)into str2; 23 select RIGHT(str,4)into str3; 24 select CONCAT(head,str2,' ',str3) into str; 25 SELECT str; 26 END 27 28 CALL my1(); 29 30 DROP FUNCTION create_bankId; 31 32 create FUNCTION create_bankId() RETURNS VARCHAR(19) 33 BEGIN 34 DECLARE head varchar(19) DEFAULT '1010 3576 '; 35 DECLARE num int DEFAULT 1; 36 DECLARE len int; 37 DECLARE val int; 38 DECLARE str VARCHAR(19)default '1010 3576 0000 0000'; 39 DECLARE str2 VARCHAR(19); 40 DECLARE str3 VARCHAR(19); 41 DECLARE str4 VARCHAR(19); 42 -- 判断数据库是否有数据 43 select IFNULL(bank_id,str)into str from t_bank ORDER BY create_date DESC LIMIT 0,1; 44 -- 截取银行卡号后七位 45 SELECT SUBSTRING(str FROM 11 FOR 4) into str2; 46 select SUBSTRING(str FROM 16 FOR 3) INTO str3; 47 select CONCAT(str2,str3) into str4; 48 -- 转为整数 49 select CONVERT(str4,SIGNED)into num; 50 set num=num+1; 51 -- 将自增号转为字符串 52 select CONVERT(num,CHAR)into str; 53 -- 用0补齐七位 54 select LPAD(str,7,'0')INTO str2; 55 -- 拼接随机数 56 select CONCAT(str2,floor(rand() * 10)) into str; 57 -- 追加空格 58 select LEFT(str,4)into str2; 59 select RIGHT(str,4)into str3; 60 -- 拼接银行卡号 61 select CONCAT(head,str2,' ',str3) into str; 62 RETURN str; 63 END
开户实现
1 DROP PROCEDURE kaihu; 2 3 CREATE PROCEDURE kaihu ( 4 IN uname VARCHAR (32), 5 IN uuid VARCHAR (18), 6 IN tel VARCHAR (11), 7 IN bk_pass VARCHAR (50) 8 ) 9 BEGIN 10 11 DECLARE userId INT; 12 13 14 DECLARE len INT; 15 16 SELECT 17 COUNT(1) INTO len 18 FROM 19 t_user 20 WHERE 21 user_uuid = uuid; 22 23 -- 判断该用户是否开过户 24 IF len = 0 THEN 25 -- 未开户添加用户信息 26 INSERT INTO t_user( 27 user_name, 28 user_uuid, 29 user_tel 30 ) 31 VALUES 32 (uname, uuid, tel); 33 34 35 END IF; 36 -- 获取用户id 37 38 SELECT 39 user_id into userId 40 FROM 41 t_user 42 WHERE 43 user_uuid = uuid; 44 45 -- 为用户开户 46 INSERT INTO t_bank( 47 bank_id, 48 bank_pass, 49 user_id, 50 current_money, 51 create_date 52 ) 53 VALUES 54 ( 55 create_bankId(), 56 bk_pass, 57 userId, 58 100, 59 NOW() 60 ); 61 END 62 63 64 65 CALL kaihu ( 66 '李四', 67 '222222222222222222', 68 '22222222', 69 '123456' 70 );
用户修改密码
1 -- 修改密码 2 create PROCEDURE update_pass(in uuid VARCHAR(18),in id VARCHAR(19),in pass VARCHAR(20)) 3 BEGIN 4 DECLARE u_id INT; 5 select IFNULL(user_id,0)into u_id from t_user where user_uuid=uuid; 6 IF u_id>0 THEN 7 UPDATE `t_bank` 8 SET 9 `bank_pass` = pass 10 WHERE 11 `bank_id` = id 12 AND 13 user_id=u_id; 14 end if; 15 END
存取款
1 drop PROCEDURE save; 2 -- 存钱 3 create PROCEDURE save(in bankId VARCHAR(19),in pass VARCHAR(20),in type INT,in money DOUBLE) 4 BEGIN 5 DECLARE result int; 6 DECLARE money1 double; 7 -- 判断该用户是否存在和密码是否正确 8 select COUNT(1) into result from t_bank where bank_id=bankId and bank_pass=pass; 9 IF result=1 THEN 10 11 IF type=0 THEN -- 活期存款 12 SELECT IFNULL(current_money,0)into money1 from t_bank where (`bank_id`=bankId); 13 UPDATE `t_bank` SET `current_money`=money1+money WHERE (`bank_id`=bankId); 14 15 ELSEIF type=1 THEN -- 定期存款 16 SELECT IFNULL(regular_money,0) into money1 from t_bank where (`bank_id`=bankId); 17 UPDATE `t_bank` SET `regular_money`=money1+money WHERE (`bank_id`=bankId); 18 end if; 19 end if; 20 END 21 22 call save('1010 3576 0000 0026','123456',0,30); 23 24 drop PROCEDURE take; 25 -- 取钱 26 create PROCEDURE take(in bankId VARCHAR(19),in pass VARCHAR(20),in money DOUBLE) 27 begin 28 DECLARE result int; 29 DECLARE money1 double; 30 -- 判断该用户是否存在和密码是否正确 31 select COUNT(1) into result from t_bank where bank_id=bankId and bank_pass=pass; 32 IF result=1 THEN 33 SELECT IFNULL(current_money,0)into money1 from t_bank where (`bank_id`=bankId); 34 if money1-money>1 THEN 35 UPDATE `t_bank` SET `current_money`=money1-money WHERE (`bank_id`=bankId); 36 end if; 37 end if; 38 END 39 40 call take('1010 3576 0000 0012','123456',30);
交易记录监听
1 drop TRIGGER deal; 2 3 -- 取钱 1 存钱 2 转账 3 4 -- 存取款交易记录 5 create TRIGGER deal after UPDATE on t_bank for each ROW 6 BEGIN 7 IF old.current_money>new.current_money THEN -- 取钱 8 INSERT INTO `t_deal` ( 9 `in_bank_id`, 10 `out_bank_id`, 11 `money`, 12 `deal_date`, 13 `deal_type` 14 ) 15 VALUES 16 ( 17 null, 18 new.bank_id, 19 old.current_money-new.current_money, 20 NOW(), 21 1 22 ); 23 elseif old.current_money<new.current_money then -- 存钱 24 INSERT INTO `t_deal` ( 25 `in_bank_id`, 26 `out_bank_id`, 27 `money`, 28 `deal_date`, 29 `deal_type` 30 ) 31 VALUES 32 ( 33 new.bank_id, 34 null, 35 new.current_money-old.current_money, 36 NOW(), 37 2 38 ); 39 end if; 40 END
为用户提供相应查询
1 CREATE VIEW vw_userInfo AS SELECT 2 user_name 用户名, 3 user_uuid 身份证号码, 4 user_tel 电话 5 FROM 6 t_user; 7 8 SELECT 9 * 10 FROM 11 vw_userInfo 12 WHERE 13 身份证号码 = '111111111111111111'; 14 15 CREATE VIEW vw_cardInfo AS SELECT 16 b.bank_id 银行卡号, 17 b.bank_pass 银行卡密码, 18 b.regular_money 定期余额, 19 b.current_money 活期余额, 20 b.create_date 开户时间, 21 u.user_name 开户人, 22 u.user_uuid 身份证号 23 FROM 24 t_bank b, 25 t_user u 26 WHERE 27 u.user_id = b.user_id; 28 29 SELECT 30 * 31 FROM 32 vw_cardInfo 33 WHERE 34 银行卡号 = '1010 3576 0000 0012'; 35 36 -- 获取银行卡账户名称 37 create FUNCTION getName(id VARCHAR(19))RETURNS VARCHAR(32) 38 BEGIN 39 DECLARE u_name VARCHAR(32); 40 select u.user_name into u_name from t_user u,t_bank b where u.user_id = b.user_id and b.bank_id=id; 41 RETURN u_name; 42 END 43 44 DROP view vw_tradeInfo; 45 46 CREATE VIEW vw_tradeInfo AS SELECT 47 d.deal_id 交易编号, 48 d.in_bank_id 转入账号, 49 IF(ISNULL(d.in_bank_id)=0,getName(d.in_bank_id),'') 转入账户人, 50 d.out_bank_id 转出账号, 51 IF(ISNULL(d.out_bank_id)=0,getName(d.out_bank_id),'') 转出账户人, 52 d.money 交易金额, 53 d.deal_date 交易时间, 54 if(d.deal_type=1,'取钱',if(d.deal_type=2,'存钱','转账'))交易类型 55 FROM 56 t_deal d; 57 58 SELECT * from vw_tradeInfo WHERE (转出账户人='张三' or 转入账户人='张三');