diff --git "a/\351\200\232\350\277\207\345\255\230\345\202\250\350\277\207\347\250\213\345\256\236\347\216\260\350\275\254\350\264\246\343\200\2021" "b/\351\200\232\350\277\207\345\255\230\345\202\250\350\277\207\347\250\213\345\256\236\347\216\260\350\275\254\350\264\246\343\200\2021" new file mode 100644 index 0000000000000000000000000000000000000000..6f75de9b62a94b3da530e26663e6f827d7b21455 --- /dev/null +++ "b/\351\200\232\350\277\207\345\255\230\345\202\250\350\277\207\347\250\213\345\256\236\347\216\260\350\275\254\350\264\246\343\200\2021" @@ -0,0 +1,108 @@ +DELIMITER // + +CREATE PROCEDURE transfer_money( + IN p_from_card CHAR(19), -- 转出卡号 + IN p_to_card CHAR(19), -- 转入卡号 + IN p_amount DECIMAL(18,2), -- 转账金额 + OUT p_result BOOLEAN, -- 操作结果 + OUT p_message VARCHAR(255) -- 结果消息 +) +proc_label: BEGIN + DECLARE v_from_balance DECIMAL(18,2); -- 转出账户余额 + DECLARE v_from_customerid INT; -- 转出账户客户ID + DECLARE v_to_customerid INT; -- 转入账户客户ID + DECLARE v_from_currency CHAR(3); -- 转出账户货币类型 + DECLARE v_to_currency CHAR(3); -- 转入账户货币类型 + DECLARE v_to_new_balance DECIMAL(18,2); -- 转入账户新余额 + + -- 初始化输出参数 + SET p_result = FALSE; + SET p_message = ''; + + -- 检查转账金额是否有效 + IF p_amount <= 0 THEN + SET p_message = '转账金额必须大于零'; + LEAVE proc_label; + END IF; + + -- 检查转出账户是否存在且未挂失 + SELECT balance, customerid, curid INTO v_from_balance, v_from_customerid, v_from_currency + FROM cardInfo + WHERE cardid = p_from_card AND isreportloss = '否'; + + IF v_from_balance IS NULL THEN + SET p_message = '转出账户不存在或已挂失'; + LEAVE proc_label; + END IF; + + -- 检查转入账户是否存在且未挂失 + SELECT customerid, curid INTO v_to_customerid, v_to_currency + FROM cardInfo + WHERE cardid = p_to_card AND isreportloss = '否'; + + IF v_to_customerid IS NULL THEN + SET p_message = '转入账户不存在或已挂失'; + LEAVE proc_label; + END IF; + + -- 检查转出账户余额是否足够 + IF v_from_balance < p_amount THEN + SET p_message = '转出账户余额不足'; + LEAVE proc_label; + END IF; + + -- 检查货币类型是否一致 + IF v_from_currency <> v_to_currency THEN + SET p_message = '不同货币类型账户之间不能直接转账'; + LEAVE proc_label; + END IF; + + -- 开始事务 + START TRANSACTION; + + -- 更新转出账户余额 + UPDATE cardInfo + SET balance = balance - p_amount + WHERE cardid = p_from_card; + + -- 检查更新是否成功 + IF ROW_COUNT() = 0 THEN + ROLLBACK; + SET p_message = '更新转出账户失败'; + LEAVE proc_label; + END IF; + + -- 更新转入账户余额 + UPDATE cardInfo + SET balance = balance + p_amount + WHERE cardid = p_to_card; + + -- 检查更新是否成功 + IF ROW_COUNT() = 0 THEN + ROLLBACK; + SET p_message = '更新转入账户失败'; + LEAVE proc_label; + END IF; + + -- 获取转入账户新余额 + SELECT balance INTO v_to_new_balance FROM cardInfo WHERE cardid = p_to_card; + + -- 记录转出交易 + INSERT INTO tradeInfo(tradeDate, tradeType, cardID, tradeMoney, remark) + VALUES (NOW(), '转账', p_from_card, p_amount, + CONCAT('转账到账户:', p_to_card, ',新余额:', (v_from_balance - p_amount))); + + -- 记录转入交易 + INSERT INTO tradeInfo(tradeDate, tradeType, cardID, tradeMoney, remark) + VALUES (NOW(), '转账', p_to_card, p_amount, + CONCAT('从账户:', p_from_card, '转入,新余额:', v_to_new_balance)); + + -- 提交事务 + COMMIT; + + -- 设置成功结果 + SET p_result = TRUE; + SET p_message = '转账成功'; +END // + +DELIMITER ; \ No newline at end of file