MySQL Хранимая процедура - проверка выполнения определенных условий одно за другим; если оно не выполнено, выйдите из процедуры и верните указанное сообщение - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь создать хранимую процедуру 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 ;

Я сравниваю ключи клиента и книги с их значениями в других таблицах, а количество - с хранимой функцией amount_on_stock, которую я сделал ранее. Я использую цепочку IF-ELSEIF для go через каждое условие одно за другим, и, если все они пройдены, вставки происходят. Если нет, он не перейдет к следующему условию go и вернет сообщение SELECT, верно? Процедура выполняется без ошибок, но я не уверен, является ли это правильным методом или есть лучший способ сделать это.

1 Ответ

0 голосов
/ 25 апреля 2020

Последовательная проверка зависит от условий гонки. Нарушение этой парадигмы является ключом к переходу от процедурного к SQL методу. Используйте функции базы данных для получения согласованности, а не процедурный код.

purchase_items должен иметь ограничения внешнего ключа для таблиц book_key и customer_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.

Если вам не нужно делать это в ПРОЦЕДУРЕ ХРАНЕНИЯ, нет. Многие конструкции здесь проще в коде приложения. Если это задание, где для процедур хранилища требуются дополнительные отметки, их можно выполнить и никогда больше не писать хранимую процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...