mysql存储过程:流控制

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),

我正在MYSQL数据库上练习这个存储过程,以便在帐户之间进行支付。它接受两个帐户(acct1、acct2)的输入、要支付的金额(amt)并输出确认消息(pmessage)

它应该只在以下情况下付款:(如果(balance1>=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 ;
(升级到答案)

您按
余额
降序排列
账户
表,因此您假设“可用余额”是该表中给定账户的最大余额。您希望改为按日期排序,并选择最近的记录

还请注意我在上述评论中提出的其他观点,包括:

  • 货币应该使用定点数据类型(例如
    十进制
    ),而不是浮点类型;及

  • 您应该在事务中执行这些操作以防止并发问题


  • 你能给我们举一些例子说明账户1、账户2、金额和账户的值吗?这些账户的余额值(即余额1和余额2)与上述代码不符?虽然我怀疑这是你在这种情况下的问题,对于离散量(如货币),您确实应该使用定点数据类型,如
    DECIMAL
    ,否则,由于浮点数据类型的近似性质,您可能会遇到不需要的舍入错误。您确定“可用余额”是
    科目表中给定科目的最大余额吗?我猜你是想在日期前订购。。。您还应该在事务中执行这些操作,以防止并发问题。thanks@BobJarvis,@eggyal:你说得对,我的意思是按日期时间订购,而不是按余额。代码现在可以正常工作了,:D非常感谢。@okeyxyz:没问题。我已经发布了一个答案,以便您可以。