Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
12.37 Mб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Систем автоматизированного проектирования

отчет

по лабораторной работе №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() для получения идентификатора добавленной записи. Таким образом, в ходе лабораторной работы были освоены основные принципы разработки, проверки и отладки хранимых процедур.

Соседние файлы в папке БД_лабы(11 лаб, 5 семестр)