MySQL存储过程——一一检查是不是满足某些条件;如果不满足,则退出程序并返回特定消息

Posted

技术标签:

【中文标题】MySQL存储过程——一一检查是不是满足某些条件;如果不满足,则退出程序并返回特定消息【英文标题】:MySQL Stored Procedure - Checking if certain conditions are met one by one; if one is not met, exit procedure and return a specific messageMySQL存储过程——一一检查是否满足某些条件;如果不满足,则退出程序并返回特定消息 【发布时间】:2020-04-25 00:54:37 【问题描述】:

我正在尝试制作一个 mysql 存储过程来处理图书购买并将记录插入到其他表中关于购买。但是,这些插入只有在满足三个条件时才会发生:客户在系统中,书籍在系统中,并且数量足够。 我想单独检查每个条件,如果它通过第一个条件,它会移动到下一个条件,但如果没有,我希望它结束​​过程并返回一个值,等等每个条件。如果它通过所有三个条件,则可能会发生插入。这是我的编码方式:

DELIMITER //

CREATE PROCEDURE process_purchase(
    IN book_key INT,
    IN customer_key INT,
    IN quantity INT
)
BEGIN
    DECLARE book_inventory_key_var INT;
    DECLARE purchase_key_var INT;

    SELECT book_inventory_key
    INTO book_inventory_key_var
    FROM book_inventory
    WHERE book_key = book_key.book_inventory_key;

    SELECT purchase_key
    INTO purchase_key_var
    FROM purchases
    WHERE customer_key = customer_key.purchases;

    IF customer_key != customer_key.customers THEN
        SELECT '-1';
    ELSEIF book_key != book_key.books THEN
        SELECT '-2';
    ELSEIF quantity < quantity_on_stock(book_key) THEN
        SELECT '-3';
    ELSE
        INSERT INTO purchases VALUES (customer_key, CURDATE());
        INSERT INTO purchase_items (book_inventory_key, purchase_key, quantity) VALUES (book_inventory_key_var, purchase_key_var, quantity);
        SELECT '1';
    END IF;

END//

DELIMITER ;

我将 customer 和 book 键与它们在其他表中的值进行比较,并将数量与我之前创建的 quantity_on_stock 存储函数进行比较。我使用 IF-ELSEIF 链逐个遍历每个条件,如果所有条件都通过,则插入发生。如果不是,它不会进入下一个条件,并且会返回 SELECT 消息,对吗?该程序运行没有错误,但我不确定这是否是正确的方法,或者是否有更好的方法来解决这个问题。

【问题讨论】:

【参考方案1】:

顺序检查受竞争条件的影响。打破这种范式是从基于过程的方法转向基于 SQL 的方法的关键。使用 的数据库特性而不是程序代码来获得一致性。

purchase_items 应该对book_keycustomer_key 表有外键约束。如果插入生成 FK 异常,则根据错误应用其中之一。 DECLARE HANDLER 将帮助捕获这些错误。

数量:

 INSERT INTO purchase_items (book_inventory_key, purchase_key, quantity)
 SELECT book_key, purchase_key, quantity
 FROM books WHERE book_key = book.id AND book.available >= quantity

如果没有ROW_COUNT,则表示数量不足。

您还需要减少同一 SQL 事务中可用的书籍数量。

如果您不必在存储过程中执行此操作,请不要这样做。这里的许多构造在应用程序代码中更容易。如果这是一个作业,存储过程需要获得额外的分数,通过它,并且永远不会再次编写存储过程。

【讨论】:

以上是关于MySQL存储过程——一一检查是不是满足某些条件;如果不满足,则退出程序并返回特定消息的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中执行存储过程后是不是发生任何自动提交?

mysql之存储过程和函数

在尝试在 MySQL 中创建存储过程之前,如何检查它是不是存在?

MYSQL检查所有行并满足条件

如何从一个表中查找多个列满足不同条件的记录?

检查是不是满足所有条件的查询