Исключение в ELSEIF в моей SQL хранимой процедуре - PullRequest
1 голос
/ 09 апреля 2020

Я написал хранимую процедуру в 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. Логическое исключение c было похоже на то, что счетчик расходов, который я получаю больше, чем 0 я кидаю исключение так как будто оно уже существует. Не понимаю, в чем ошибка.

Ответы [ 2 ]

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

Недопустимый синтаксис MySQL:

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

Это похоже на SQL Сервер. В MySQL вы можете использовать SIGNAL для вызова исключений из блока кода, например:

SIGNAL SQLSTATE '50005' SET MESSAGE_TEXT = 'Expense already exists!!!';
0 голосов
/ 09 апреля 2020

Вы должны использовать СИГНАЛ, а не THROW.

...