mysql存储过程:流控制
我正在MYSQL数据库上练习这个存储过程,以便在帐户之间进行支付。它接受两个帐户(acct1、acct2)的输入、要支付的金额(amt)并输出确认消息(pmessage) 它应该只在以下情况下付款:(如果(balance1>=amt)那么…),但不知何故,当我输入任何大于可用余额的金额时,它仍然继续付款。我不明白。请帮忙 代码如下:mysql存储过程:流控制,mysql,sql,stored-procedures,control-flow,Mysql,Sql,Stored Procedures,Control Flow,我正在MYSQL数据库上练习这个存储过程,以便在帐户之间进行支付。它接受两个帐户(acct1、acct2)的输入、要支付的金额(amt)并输出确认消息(pmessage) 它应该只在以下情况下付款:(如果(balance1>=amt)那么…),但不知何故,当我输入任何大于可用余额的金额时,它仍然继续付款。我不明白。请帮忙 代码如下: DELIMITER // CREATE PROCEDURE `make_payment`(IN `acct1` int(4), IN `acct2` int(4),
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 ;
(升级到答案)
您按余额
降序排列账户
表,因此您假设“可用余额”是该表中给定账户的最大余额。您希望改为按日期排序,并选择最近的记录
还请注意我在上述评论中提出的其他观点,包括:
十进制
),而不是浮点类型;及你能给我们举一些例子说明账户1、账户2、金额和账户的值吗?这些账户的余额值(即余额1和余额2)与上述代码不符?虽然我怀疑这是你在这种情况下的问题,对于离散量(如货币),您确实应该使用定点数据类型,如
DECIMAL
,否则,由于浮点数据类型的近似性质,您可能会遇到不需要的舍入错误。您确定“可用余额”是科目表中给定科目的最大余额吗?我猜你是想在日期前订购。。。您还应该在事务中执行这些操作,以防止并发问题。thanks@BobJarvis,@eggyal:你说得对,我的意思是按日期时间订购,而不是按余额。代码现在可以正常工作了,:D非常感谢。@okeyxyz:没问题。我已经发布了一个答案,以便您可以。