【问题标题】:Exception at ELSEIF in My SQL Stored ProcedureMy SQL 存储过程中的 ELSEIF 异常
【发布时间】:2020-07-21 20:39:39
【问题描述】:

我在 My SQL 中编写了如下存储过程:


DELIMITER //

CREATE PROCEDURE SP_Add_Expense
(
    p_Expense_ID            int /* = null */,
    p_Project_ID            int, 
    p_Category_ID       int,
    p_Sub_Category_ID   int,
    p_SupplierID            int,
    p_ExpenseDate       datetime,
    p_Notes             text/* =null */,
    p_Quantity          int,
    p_Price             decimal(18,2),
    p_CreatedBy         int

)
BEGIN
IF((select count(*) from Expense where Category_ID = p_Category_ID AND Sub_Category_ID = p_Sub_Category_ID 
    AND SupplierID = p_SupplierID AND p_Expense_ID IS NULL) > 0)
THEN

    THROW 50005, N'Expense already exists!!!', 1

    ELSEIF ((select count(*) from Expense where Expense_ID = p_Expense_ID) > 0)
    THEN
        Update Expense set Category_ID = p_Category_ID, Sub_Category_ID = p_Sub_Category_ID, SupplierID = p_SupplierID, Quantity = p_Quantity, ExpenseDate = p_ExpenseDate,
        Notes = p_Notes, Price = p_Price, ModifiedBy = p_CreatedBy, ModifiedDate = NOW(), Project_ID= p_Project_ID where Expense_ID = p_Expense_ID;
    ELSE
        INSERT INTO Expense (Project_ID, Category_ID, Sub_Category_ID, SupplierID, Quantity, Price, CreatedBy, CreatedDate, ExpenseDate, Notes)
        VALUES (p_Project_ID, p_Category_ID, p_Sub_Category_ID, p_SupplierID, p_Quantity, p_Price, p_CreatedBy, NOW(), p_ExpenseDate, p_Notes);
    END IF;
END IF;
END;
//

DELIMITER ;



它在 ELSEIF 处抛出异常。异常逻辑就像我得到的费用计数大于 0 时,我抛出异常,就像它已经存在一样。不明白是什么错误。

【问题讨论】:

    标签: mysql sql stored-procedures mysql-python


    【解决方案1】:

    这不是有效的 MySQL 语法:

    THROW 50005, N'Expense already exists!!!', 1
    

    这看起来像 SQL Server。在 MySQL 中,您可以使用 SIGNAL 从代码块中引发异常,例如:

    SIGNAL SQLSTATE '50005' SET MESSAGE_TEXT = 'Expense already exists!!!';
    

    【讨论】:

    • 我已改为信号。然后它抛出异常,例如“您的 SQL 语法有错误;请检查与您的 MariaDB 服务器版本相对应的手册,以便在第 20 行的 '' 附近使用正确的语法”我的第 20 行是我们的信号语句本身。
    • @user2413229:在程序结束时,您有一个额外的、不需要的 END IF。应该只有一个 END IF 而不是两个。
    【解决方案2】:

    您应该使用 SIGNAL,而不是 THROW。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2021-11-29
      相关资源
      最近更新 更多