mysql存储过程: flow control

标签 mysql sql stored-procedures control-flow

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

最佳答案

(升级到答案)

您按余额降序对accounts表进行排序,因此您假设“可用余额”是给定帐户的最大余额那张 table 。您想要ORDER BY日期并选择最新的记录。

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

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

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

关于mysql存储过程: flow control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598728/

相关文章:

sql - Oracle 11g docker SELECT 非常慢

mysql - SQL - 如何使用返回表,并在 MySQL 中添加 INNER JOIN 和 WHERE 子句?

sql-server - 存储过程会导致内存泄漏吗?

java - 建议将什么逻辑放入存储过程中?

mysql - 帮我把 SUBQUERY 变成 JOIN

php - 使用 MySql 查询和 PHP 的不同结果

c# - 根据数据库表定义自动生成代码?

sql - 这两个查询有什么区别

python - 为什么当使用 os.system() 或 subprocess.Popen() 从 Python 调用时我的 MySQL 存储过程不执行?

MySQL根据记录的总和查询一个表或在另一张表中没有记录