首页 > 解决方案 > 如何在过程中的 If 内执行多个查询?

问题描述

我正在尝试执行两个查询,将钱从一家银行“转移”到另一家银行(一家银行是一张表),但前提是新余额高于 0。sc_bank 和 sub_bank 是两个表,amountOfMoney、customerIDsc 和 customerIDsub 是过程中的参数。phpmyadmin 给了我多个 SQL sintax 错误,我做错了什么?

BEGIN
    SELECT @A:=sub_bank.value FROM sub_bank WHERE customer_id = customerIDsub;
    IF @A - amountOfMoney > 0 THEN 
        UPDATE sc_bank SET sc_bank.value = sc_bank.value + amountOfMoney WHERE sc_bank.customer_id = customerIDsc;
        UPDATE sub_bank SET sub_bank.value = sub_bank.value - amountOfMoney WHERE sub_bank.customer_id = customerIDsub;
    END IF

END;

编辑:这是 phpmyadmin 尝试执行以创建过程的函数,它似乎将 IF 放在第一次更新的 WHERE 语句中

CREATE DEFINER = `root`@`localhost` PROCEDURE `proceduro`(
    IN `amountOfMoney` DECIMAL(6, 2),
    IN `customerIDsc` INT(10),
    IN `customerIDsub` INT(10)
) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER
BEGIN
    SELECT
        @A := sub_bank.value
    FROM
        sub_bank
    WHERE
        customer_id = customerIDsub; IF @A - amountOfMoney > 0 THEN
    UPDATE
        sc_bank
    SET
        sc_bank.value = sc_bank.value + amountOfMoney
    WHERE
        sc_bank.customer_id = customerIDsc;
    UPDATE
        sub_bank
    SET
        sub_bank.value = sub_bank.value - amountOfMoney
    WHERE
        sub_bank.customer_id = customerIDsub;
END IF
END;

标签: mysqlphpmyadmin

解决方案


该任务不需要在“new balance is above 0”检查 - 它可以通过根据列 CHECK 约束轻松执行。然后简单地更新事务中的两个表 - 如果余额低于零,则发生约束冲突,事务失败并回滚。

演示小提琴

注意 - 可能由于违反约束而失败的查询是最上层的。如果您交换 UPDATE 查询,则接受者的余额将被错误地更改。在这种情况下,您必须声明相应的处理程序并在事务触发时回滚事务。

演示小提琴


推荐阅读