【问题标题】:mysql stored procedure: flow controlmysql存储过程:流量控制
【发布时间】:2012-05-15 10:24:29
【问题描述】:

我正在 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 ;

【问题讨论】:

  • 您能给我们举一些例子,说明上面代码不能按预期工作的账户(即余额 1 和余额 2)的 acct1、act2、amt 和 ACCOUNTS.BALANCE 值吗?
  • 虽然我怀疑这是你在这种情况下的问题,但你真的应该使用像 DECIMAL 这样的定点数据类型来处理像钱这样的离散量,否则你可能会因为近似值而遇到不希望的舍入错误浮点数据类型的性质。您确定“可用余额”是accounts 表中给定帐户的最大余额吗?我怀疑您的意思是 ORDER BY 日期...您还应该在事务中执行这些操作以防止并发问题。
  • thanks@BobJarvis, @eggyal:你说得对,我的意思是按日期时间订购,而不是按余额订购。代码现在可以正常工作了,:D 非常感谢。
  • @okeyxyz:没问题。我已经发布了答案,以便您可以accept it

标签: mysql sql stored-procedures control-flow


【解决方案1】:

升级到答案

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2012-06-24
    相关资源
    最近更新 更多