Ваша процедура InsertSalesOrder хорошо обрабатывает добавление одного заказа с одним изданием, но задание требует также возможность обработки заказов с разными изданиями в одном заказе. Чтобы решить эту задачу, вам нужно будет адаптировать процедуру, чтобы она могла принимать несколько изданий и их количество для одного магазина.
1 из способов, как это можно сделать:
- Создайте новую процедуру InsertMultipleSalesOrder, которая будет принимать список изданий и их количество.
- Используйте таблицу-значение для передачи списка изданий и их количества в процедуру.
- Внутри процедуры обработайте каждую запись из таблицы-значения и добавьте соответствующие записи в таблицу продаж.
CREATE TYPE TitleQuantityTableType AS TABLE
(
title_name VARCHAR(80),
qty SMALLINT
);
GO
CREATE PROCEDURE InsertMultipleSalesOrder
@stor_name VARCHAR(40),
@TitleQuantity TitleQuantityTableType READONLY,
@payterms VARCHAR(12)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @stor_id CHAR(4);
DECLARE @ord_num VARCHAR(20);
DECLARE @ord_date DATETIME;
SET @ord_date = GETDATE();
SELECT @stor_id = stor_id
FROM stores
WHERE stor_name = @stor_name;
SET @ord_num = LEFT(CONVERT(VARCHAR(36), NEWID()), 10);
IF @stor_id IS NOT NULL
BEGIN
DECLARE @title_id CHAR(6);
DECLARE TitleCursor CURSOR FOR
SELECT title_name, qty FROM @TitleQuantity;
OPEN TitleCursor;
FETCH NEXT FROM TitleCursor INTO @title_name, @qty;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @title_id = title_id
FROM titles
WHERE title = @title_name;
IF @title_id IS NOT NULL
BEGIN
INSERT INTO sales (stor_id, ord_num, ord_date, qty, payterms, title_id)
VALUES (@stor_id, @ord_num, @ord_date, @qty, @payterms, @title_id);
UPDATE titles
SET ytd_sales = ytd_sales + @qty
WHERE title_id = @title_id;
END
ELSE
BEGIN
SELECT 'Издание с названием ' + @title_name + ' не найдено' AS [Result];
END
FETCH NEXT FROM TitleCursor INTO @title_name, @qty;
END
CLOSE TitleCursor;
DEALLOCATE TitleCursor;
SELECT 'Заказ успешно добавлен' AS [Result];
END
ELSE
BEGIN
SELECT 'Магазин с указанным названием не найден' AS [Result];
END
END
GO