Создать хранимую процедуру отладки - PullRequest
0 голосов
/ 25 апреля 2020

Использование данных и схемы с этого сайта: Использование данных с этого сайта: https://www.sqlservertutorial.net/sql-server-sample-database/

Мне выдается приглашение:

Создать хранимая процедура placeOrder (), которая может быть вызвана для вставки нового заказа в базу данных. Он получит customerId в виде INT, productId в качестве INT и qty в качестве INT и вернет (в качестве параметра anoutput) order_id новой строки, созданной в табличных порядках.

Эта хранимая процедура найдет Магазин с самым большим запасом этого конкретного продукта и назначить этот магазин для заказа. Order_status должен быть установлен в 1 (то есть в ожидании), текущая системная дата (см. Функцию CURDATE) будет назначена order_date, столбец required_date будет через 7 дней после текущей системной даты (см. Функцию ADDDATE) и столбец staff_id будет назначен для всех, кто работает в выбранном магазине (согласно предыдущему требованию). Поскольку столбец order_id не является столбцом с автоинкрементом, вам необходимо рассчитать его значение. Вы можете использовать max (order_id), чтобы узнать самый высокий order_id в таблице.

В строке order_item должен быть указан productId, а qty передан хранимой процедуре. Item_id должен быть установлен в 1 (так как в этом заказе будет только один элемент). Прайс-лист должен быть получен из таблицы продуктов, используя переданный productId. Значение скидки должно быть установлено на 0

. Если я правильно понимаю подсказку, мне сначала нужно указать идентификатор магазина, в котором содержится большинство товаров определенного типа. После того, как у меня есть это хранилище, мне нужно вставить новую строку данных в таблицу "orders", основными данными которой являются order_id, customer_id, order_status, order_date, required, date и staff_id. Я НЕ понимаю, о чем говорит последняя часть вопроса / как go о решении.

Вот мой текущий код, но я почти уверен, что мел полон ошибок а также заметки и недостающие фрагменты, поэтому, пожалуйста, помогите мне, где вы можете:

DELIMITER //
CREATE procedure placeOrder (IN customerID INT, IN productID INT, IN QTY INT, OUT order_id INT)
BEGIN
DECLARE customerID INT;
DECLARE produtcID INT;
DECLARE quantity INT;

SELECT customer_id INTO customerID from customers where customer_id = customerID;
SELECT product_id INTO productID from  order_items where product_id = productID;
SELECT quantity INTO qty from order_items where quantity = qty; 

/**find store id with max stocks of product**/
select st.store_name, sk.store_id from stocks as sk
INNER JOIN
stores as st
ON sk.store_id = st.store_id
WHERE max(sk.quantity)
GROUP by sk.product_id;

select st.store_id from stores as st
INNER JOIN orders as o
ON st.store_id= o.store_id

Insert into orders (order_id, customer_id, order_status, order_date, required_date, staff_id)
WHERE order_status = '1',
AND order_date = select(curdate()),
AND required_date = adddate('order_date' +7),
AND staff_id = /**ANYONE from store listed in precious query (how do I relate these two queries)**



END

1 Ответ

1 голос
/ 25 апреля 2020
  1. Не объявляйте повторно параметры функции.
  2. Вам не нужно использовать запрос SELECT для задания переменных, которые уже установлены в параметрах.
  3. Вы Вы не получаете магазин с максимальным количеством правильно. Используйте ORDER BY sk.quantity DESC LIMIT 1
  4. Вам необходимо использовать INTO <variable> в запросе, чтобы установить переменные из запроса. Если вы этого не сделаете, результат запроса будет преобразован в результат процедуры, который здесь нежелателен.
  5. Вы не используете WHERE в операторе INSERT , WHERE используется для поиска существующих строк, соответствующих условию, а INSERT - для создания новых строк. Вы используете VALUES() для перечисления всех значений, которые должны быть назначены указанным столбцам.
CREATE procedure placeOrder (IN customerID INT, IN productID INT, IN QTY INT, OUT orderId INT)
BEGIN

DECLARE topStoreId INT;
DECLARE staffId INT;

/**find store id with max stocks of product**/
select sk.store_id 
from stocks as sk
INNER JOIN stores as st
ON sk.store_id = st.store_id
WHERE sk.product_id = productID
ORDER BY sk.quantity DESC
LIMIT 1
INTO topStoreId;

/* Pick an arbitrary staff from the selected store */
SELECT staff_id
FROM staffs
WHERE store_id = topStoreId
LIMIT 1
INTO staffId;

SELECT MAX(order_id)
FROM orders AS o
INTO orderId;

Insert into orders (order_id, customer_id, order_status, order_date, required_date, staff_id, store_id)
VALUES (orderId, customerId, 1, CURDATE(), DATE_ADD(CURDATE(), INTERVAL 1 WEEK), staffId, topStoreId);

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