БД_лабы(11 лаб, 5 семестр) / БД_ЛР8
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Систем автоматизированного проектирования
отчет
по лабораторной работе №8
по дисциплине «Базы Данных»
Тема: Создание и использование хранимых процедур
Студенты гр. 3352 |
________________ |
Гареева К.Р. |
|
________________ |
Жигунова О.М. |
Преподаватель |
________________ |
Горяинов С.В. |
Санкт-Петербург
2025
Цель работы:
Научиться писать и применять хранимые процедуры. В лабораторной работе используется БД Adventure Works.
Упражнение 1 - создание хранимой процедуры без параметров
Запрос 1:
Создадим процедуру Sales.GetDiscounts, которая выбирает все записи из таблицы Sales.SpecialOffer и сортирует их по StartDate и EndDate.
CREATE PROCEDURE Sales.GetDiscounts
AS
BEGIN
SELECT
Description,
DiscountPct,
Type,
Category,
StartDate,
EndDate,
MinQty,
MaxQty
FROM Sales.SpecialOffer
ORDER BY StartDate, EndDate;
END;
GO
Рисунок 1 - Результат выполнения 1-го запроса
Запрос 2
Проверим корректность выполнения запроса (рис. 2) с помощью запроса:
EXEC Sales.GetDiscounts;
Рисунок 2 - Проверка выполнения запроса 1.
Упражнение 2- создание хранимой процедуры с параметром
Запрос 3:
Теперь создадим процедуру Sales.GetDiscountsForCategory, которая принимает параметр @Category и фильтрует данные по этому полю.
USE AdventureWorks;
GO
CREATE PROCEDURE Sales.GetDiscountsForCategory
@Category NVARCHAR(50)
AS
BEGIN
SELECT
Description, DiscountPct, Type, Category, StartDate, EndDate, MinQty, MaxQty
FROM Sales.SpecialOffer
WHERE Category = @Category
ORDER BY StartDate, EndDate;
END;
GO
Рисунок 3 - Результат выполнения 3-го запроса
Запрос 4
Проверим корректность выполнения запроса (рис. 4) с помощью запроса:
EXEC Sales.GetDiscountsForCategory 'Customer';
EXEC Sales.GetDiscountsForCategory 'Reseller';
Рисунок 4 - Проверка выполнения запроса 3.
Упражнение 3 - создание хранимой процедуры с параметрами и значениями по умолчанию
Запрос 5
Создадим процедуру Sales.GetDiscountsForCategoryAndDate с параметрами:
@Category NVARCHAR(50) — категория скидки, @DateToCheck DATETIME = NULL — дата проверки (по умолчанию NULL, заменяется GETDATE()).
Процедура должна выводить скидки только для указанной категории, активные на указанную дату (рис. 5).
EXEC Sales.GetDiscountsForCategoryAndDate 'Reseller';
Процедура автоматически подставит текущую дату GETDATE()
и покажет все активные скидки категории Reseller на сегодня.
DECLARE @DateToCheck DATETIME;
SET @DateToCheck = DATEADD(month, 1, GETDATE());
EXEC Sales.GetDiscountsForCategoryAndDate 'Reseller', @DateToCheck;
Здесь проверяются скидки категории Reseller, которые будут активны через месяц.
USE AdventureWorks;
GO
CREATE PROCEDURE Sales.GetDiscountsForCategoryAndDate
@Category NVARCHAR(50),
@DateToCheck DATETIME = NULL
AS
BEGIN
IF @DateToCheck IS NULL
SET @DateToCheck = GETDATE();
SELECT
Description, DiscountPct, Type, Category, StartDate, EndDate,
MinQty, MaxQty
FROM Sales.SpecialOffer
WHERE Category = @Category
AND @DateToCheck BETWEEN StartDate AND EndDate
ORDER BY StartDate, EndDate;
END;
GO
EXEC Sales.GetDiscountsForCategoryAndDate 'Reseller';
DECLARE @DateToCheck DATETIME;
SET @DateToCheck = DATEADD(month, 1, GETDATE());
EXEC Sales.GetDiscountsForCategoryAndDate 'Reseller', @DateToCheck;
Рисунок 5 - Результат выполнения 5-го запроса
Упражнение 4 - создание хранимой процедуры с входными и выходными параметрами
Запрос 6:
Создадим хранимую процедуру Sales.AddDiscount, которая принимает параметры для вставки новой скидки в таблицу Sales.SpecialOffer, использует обработку ошибок TRY...CATCH, при ошибке записывает информацию в таблицу dbo.ErrorLog, при успехе возвращает ID новой записи через выходной параметр @NewProductID; возвращает значение (0 — ошибка, 1 — успех).
USE AdventureWorks;
GO
CREATE PROCEDURE Sales.AddDiscount
@Description NVARCHAR(255),
@DiscountPct SMALLMONEY,
@Type NVARCHAR(50),
@Category NVARCHAR(50),
@StartDate DATETIME,
@EndDate DATETIME,
@MinQty INT,
@MaxQty INT,
@NewProductID INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
IF @DiscountPct <= 0
BEGIN
THROW 50001, 'DiscountPct must be greater than zero.', 1;
END;
INSERT INTO Sales.SpecialOffer
(Description, DiscountPct, Type, Category, StartDate, EndDate, MinQty, MaxQty, rowguid, ModifiedDate)
VALUES
(@Description, @DiscountPct, @Type, @Category, @StartDate, @EndDate, @MinQty, @MaxQty, NEWID(), GETDATE());
SET @NewProductID = SCOPE_IDENTITY();
RETURN 1;
END TRY
BEGIN CATCH
INSERT INTO dbo.ErrorLog (ErrorTime, UserName, ErrorNumber, ErrorSeverity, ErrorState, ErrorProcedure, ErrorLine, ErrorMessage)
VALUES (GETDATE(), SUSER_SNAME(), ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE());
RETURN 0;
END CATCH
END;
GO
Рисунок 6 - Результат выполнения 6-го запроса
Запрос 7
Данный запрос проверяет хранимую процедуру Sales.AddDiscount, которая добавляет новую запись о скидке в таблицу Sales.SpecialOffer.
DECLARE @StartDate DATETIME, @EndDate DATETIME;
SET @StartDate = GETDATE();
SET @EndDate = DATEADD(month, 1, @StartDate);
DECLARE @NewID INT;
EXEC Sales.AddDiscount
'Half price off everything',
0.5,
'Seasonal Discount',
'Customer',
@StartDate,
@EndDate,
0,
20,
@NewID OUTPUT;
SELECT @NewID AS NewSpecialOfferID;
Рисунок 7 - Проверка выполнения запроса 6, успешная проверка
Запрос 8
Теперь введем данные, которые должны вызвать ошибку и проверим, что программа выдает информацию об ошибке. В этом случае вставка не произойдёт, а в таблице dbo.ErrorLog появится запись об ошибке, где ErrorProcedure = 'AddDiscount.
DECLARE @StartDate DATETIME, @EndDate DATETIME;
SET @StartDate = GETDATE();
SET @EndDate = DATEADD(month, 1, @StartDate);
DECLARE @NewID INT, @ReturnValue INT;
EXEC @ReturnValue = Sales.AddDiscount
'Half price off everything',
-0.5,
'Seasonal Discount',
'Customer',
@StartDate,
@EndDate,
0,
20,
@NewID OUTPUT;
IF (@ReturnValue = 0)
SELECT TOP 1 *
FROM dbo.ErrorLog
ORDER BY ErrorTime DESC;
ELSE
SELECT @NewID AS NewSpecialOfferID;
Рисунок 8 - Проверка выполнения запроса 6, проверка ошибки
Вывод
В ходе выполнения лабораторной работы №8 была изучена и реализована практика создания и использования хранимых процедур в базе данных AdventureWorks. В процессе работы были созданы четыре вида процедур: без параметров, с входным параметром, с параметрами и значением по умолчанию, а также с входными и выходными параметрами и обработкой ошибок. Было показано, как процедуры позволяют автоматизировать выполнение типовых SQL-запросов, упростить логику работы с данными и повысить надежность взаимодействия с базой. На примере процедуры Sales.AddDiscount продемонстрировано применение конструкции TRY...CATCH для перехвата ошибок и запись их в таблицу dbo.ErrorLog, а также использование функции SCOPE_IDENTITY() для получения идентификатора добавленной записи. Таким образом, в ходе лабораторной работы были освоены основные принципы разработки, проверки и отладки хранимых процедур.
