From a911ec0c9b29092dd5f3fe12c84dcc120610221b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A6=B9=E4=BD=B3?= <13981807+liu-yujia2024@user.noreply.gitee.com> Date: Thu, 19 Jun 2025 07:37:41 +0000 Subject: [PATCH] =?UTF-8?q?add=20=E9=80=9A=E8=BF=87=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E5=AE=9E=E7=8E=B0=E8=BD=AC=E8=B4=A6=E3=80=82?= =?UTF-8?q?1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘禹佳 <13981807+liu-yujia2024@user.noreply.gitee.com> --- ...\260\350\275\254\350\264\246\343\200\2021" | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 "\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" 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 0000000..6f75de9 --- /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 -- Gitee