[mysql存储过程:流控制

问题描述 投票:0回答:1

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

应该只在以下情况下付款:(IF(balance1> = amt)THEN ...),但是以某种方式,当我输入任何大于可用余额的金额时,它仍会继续付款。我不明白。请帮助。

这里是代码:

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 ;
mysql sql stored-procedures control-flow
1个回答
1
投票

升级为答案

您正在按accounts降序排列balance表,因此,假设“可用余额”是该表中给定帐户的最大余额。您想改为ORDER BY日期并选择最新记录。

请注意我在上面的评论中提到的其他几点,包括:

  1. 您应该对货币使用定点数据类型(例如DECIMAL),而不是浮点类型;和

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

© www.soinside.com 2019 - 2024. All rights reserved.