Синтаксическая ошибка оператора Case MySQL хранимой процедуры - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать хранимую процедуру, которая вычисляет сумму, умножая заказанное количество и норму продукта из разных таблиц, называемую «Тариф» и получая количество из таблицы бронирований. После расчета я хочу, чтобы он был вставлен в другую. Таблица «Сумма». У меня есть всего 5 продуктов. Если, например, product = 'abc', то укажите сумму для 'abc' и вставьте ноль для суммы остальных продуктов. Здесь я использую оператор Case, который выдает синтаксическую ошибку. Пожалуйста, предложите мне свою помощь.

DELIMITER $$
CREATE PROCEDURE `calculate_amount` (IN IN_book_id INT,IN IN_qty INT )
-- begin
BEGIN
-- declare
DECLARE prdct VARCHAR(10);
DECLARE cust_id INT(5);
-- select into
SELECT Product FROM Bookings WHERE Book_id=IN_book_id INTO prdct;
SELECT Cust_id FROM Bookings WHERE Book_id=IN_book_id INTO cust_id;
-- conditionals & action
CASE prdct
WHEN "20ltr"
THEN INSERT INTO Amount(Cust_id,Book_id,Can,300ml,500ml,1lit,2lit) VALUES(cust_id,IN_book_id,(SELECT Rate.Can*Bookings.Qty FROM Rate,Bookings WHERE Bookings.Book_id=IN_book_id),0,0,0,0);

WHEN "300ml"
THEN INSERT INTO Amount(Cust_id,Book_id,Can,300ml,500ml,1lit,2lit) VALUES(cust_id,IN_book_id,0,(SELECT Rate.300ml*Bookings.Qty FROM Rate,Bookings WHERE Bookings.Book_id=IN_book_id),0,0,0); 

WHEN "500ml"
THEN 
INSERT INTO Amount(Cust_id,Book_id,Can,300ml,500ml,1lit,2lit) VALUES(cust_id,IN_book_id,0,0,(SELECT Rate.500ml*Bookings.Qty FROM Rate,Bookings WHERE Bookings.Book_id=IN_book_id),0,0); 

WHEN "1ltr"
THEN 
INSERT INTO Amount(Cust_id,Book_id,Can,300ml,500ml,1lit,2lit) VALUES(cust_id,IN_book_id,0,0,0,(SELECT Rate.1lit*Bookings.Qty FROM Rate,Bookings WHERE Bookings.Book_id=IN_book_id),0); 

WHEN "2ltr"
THEN 
INSERT INTO Amount(Cust_id,Book_id,Can,300ml,500ml,1lit,2lit) VALUES(cust_id,IN_book_id,0,0,0,0,(SELECT Rate.2lit*Bookings.Qty FROM Rate,Bookings WHERE Bookings.Book_id=IN_book_id)); 

ELSE 
    BEGIN
    END;
END CASE;
-- end
END;$$

DELIMITER ;

1 Ответ

0 голосов
/ 08 сентября 2018

В SQL (в общем) CASE не используется для условного потока программы, он используется для возврата единичных значений в присваивании переменных. MySQL допускает это, но я рекомендую избегать его использования, так как другие системы баз данных не поддерживают его

Типичные сценарии:

--doing varied logic:
name = CASE 
    WHEN num = 1 THEN 'one' 
    WHEN othernum = 2 THEN 'two' 
END

--testing a single variable for being equal to values:
name = CASE num 
  WHEN 1 THEN 'one' 
  WHEN 2 THEN 'two' 
END

Избегайте этого:

CASE 
  WHEN num = 1 THEN name = 'one' 
  WHEN num = 2 THEN name = 'two' 
END

Если вы не используете свои навыки работы с базами данных, по сути, единственное, что вы должны поместить в «результат» дела, это значение, а не утверждение

ЕСЛИ ELSEIF ELSE используется для условного выполнения программы в основных базах данных, документы по MySQL для него находятся здесь:

https://dev.mysql.com/doc/refman/8.0/en/if.html

В качестве другого отступления предпочтите использовать «для строк, а не» - двойные кавычки - это еще одно отклонение MySQL от стандарта

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