我正在MYSQL数据库上练习这个存储过程,以便在帐户之间进行付款。 它接受两个帐户(ACCT1,ACCT2)的输入,要支付的金额(AMT)并输出确认消息(pmessage)
它应该只在以下情况下付款:(IF (余额 1>=amt) 然后......),但不知何故,当我输入任何大于可用余额的金额时,它仍然会继续付款。 我不明白。 请帮忙。
代码如下:
DELIMITER //
CREATE PROCEDURE `make_payment`(IN `acct1` int(4), IN `acct2` int(4), IN `amt` float(10,2) unsigned, OUT `pmessage` varchar(100))
BEGIN
DECLARE balance1 FLOAT;
DECLARE balance2 FLOAT;
IF(acct1 !=acct2) THEN
SELECT balance INTO balance1 FROM mydb.accounts
WHERE account_no =acct1
ORDER BY balance DESC LIMIT 1;
SELECT balance INTO balance2 FROM mydb.accounts
WHERE account_no =acct2
ORDER BY balance DESC LIMIT 1;
IF (balance1 >=amt) THEN
begin
SET balance1 =balance1-amt;
SET balance2 =balance2+amt;
INSERT INTO mydb.accounts(account_no, outflow, balance)
VALUES(acct1, amt, balance1);
INSERT INTO mydb.accounts(account_no, inflow, balance)
VALUES(acct2, amt, balance2);
SET pmessage ="payment was successful";
END;
ELSE SET pmessage ="insufficient balance";
END IF;
END IF;
END //
DELIMITER ;
(升级到答案)
您按balance
降序对accounts
表进行排序,因此您假设"可用余额"是该表中给定帐户的最大余额。 您希望改为ORDER BY
日期并选择最新记录。
另请注意我上面评论中提出的其他观点,包括:
-
您应该使用定点数据类型(如
DECIMAL
)作为货币,而不是浮点类型;和 -
您应该在事务中执行这些操作以防止并发问题。