Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_Laboratornyi_774_praktikum.doc
Скачиваний:
28
Добавлен:
17.06.2021
Размер:
921.09 Кб
Скачать

Лабораторная работа №6. Программирование на языке Transact-sql

Цель работы

  1. Ознакомиться с основами программирования на языке Transact-SQL.

  2. Освоить способы создания и использования хранимых процедур.

  3. Изучить способы создания и использования определяемых пользователем функций.

Задачи

  1. Написание кода, использующего переменные языка Transact-SQL и временные таблицы.

  2. Создание хранимых процедур.

  3. Создание пользовательских функций трех типов (Scalar, Inline Table-valued, Multi-statement Table-valued).

  4. Написание проверочного кода для тестирования правильности работы созданных хранимых процедур и функций.

Методические указания

При помощи пользовательского меню Windows запустите утилиту SQL Server Management Studio, после чего на панели Object Explorer в древовидной структуре раскройте папку Databases.

С помощью команды меню FileOpenFile загрузите сценарий из файла D:\Work\X7230ХХХ\script.sql в окно Query.

Выполните сценарий, нажав на панели инструментов кнопку Execute (или клавишу F5). В результате будет создана база данных Склад_ХХХ.

Обновите данные на панели Object Explorer. Для этого используйте команду Refresh в контекстном меню папку Databases или соответствующую кнопку в верхней части панели. В результате база данных Склад_ХХХ станет видимой на панели Object Explorer.

Закройте окно Query, содержащее сценарий script.sql. Затем на панели инструментов нажмите кнопку New Query, и откройте новое пустое окно Query, предназначенное для формирования нового сценария. Готовые к исполнению команды (пакеты) языка Transact-SQL, из которых будет формироваться сценарий, выделены ниже при помощи стрелок  и .

Сделайте активной созданную базу данных Склад_ХХХ:

USE Склад_ХХХ

GO

Раздел I. Основы программирования на языке Transact-sql.

Если возникает потребность работать с переменными, то предварительно нужно эти переменные создать, используя команду объявления переменных, которая имеет следующий синтаксис (см. [1], стр. 1059):

DECLARE  { @local_variable data_type } [ ,...n]

DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY

-- Для присвоения значения переменным можно использовать

-- команды SET и SELECT:

SET @Код = 10

SET @Имя = 'MS SQL Server'

SET @Цена = 299.99

-- Команда SELECT отличается от команды SET тем, что позволяет

-- присвоить значения сразу нескольким переменным:

SELECT @Код = 10, @Имя = 'MS SQL Server', @Цена = 299.99

-- Для вывода (на экран монитора) значений переменных также

-- используется команда SELECT:

SELECT @Код, @Имя, @Цена

-- При выводе значений переменных можно снабдить их содержательными

-- именами. При этом идентификаторы, содержащие недопустимые символы,

-- такие как ' ' (пробел), '%', '*' и др., должны быть заключены в

-- квадратные скобки:

SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS

[Цена товара]

-- Связку AS можно, при желании, опускать:

SELECT @Код [Код товара], @Имя Наименование, @Цена [Цена товара]

GO

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

Переменным можно присваивать значения полей из таблиц базы данных. Например:

DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY

SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена

FROM Товар

WHERE КодВалюты IN ('USD', 'EUR')

SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS

[Цена товара]

GO

Здесь переменные @Код, @Имя, @Цена получили значения соответствующих полей последней строки набора данных, выбираемого командой SELECT (сам набор данных на экран не выводится). Поэтому, если, например, необходимо сохранить в переменных сначала сведения о товаре с наибольшей, а затем – с наименьшей ценой применительно к кодам валют USD и EUR, то необходимо выполнить следующую последовательность команд:

DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY

-- Выборка данных из таблицы Товар с сортировкой строк

-- по столбцу Цена в порядке возрастания

SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена

FROM Товар

WHERE КодВалюты IN ('USD', 'EUR')

ORDER BY Цена

-- Вывод данных о товаре с наибольшей ценой

SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS

[MAX цена товара]

-- Выборка данных из таблицы Товар с сортировкой строк по столбцу Цена

-- в порядке убывания

SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена

FROM Товар

WHERE КодВалюты IN ('USD', 'EUR')

ORDER BY Цена DESC -- DESC указывает на убывающий порядок сортировки

-- Вывод данных о товаре с наименьшей ценой

SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS

[MIN цена товара]

GO

Можно определить также среднюю цену товаров:

DECLARE @Цена MONEY

SELECT @Цена = AVG(Цена)

FROM Товар

WHERE КодВалюты IN ('USD', 'EUR')

-- Вывод средней цены товаров

SELECT @Цена AS [AVG цена товаров]

GO

Пример. Пусть необходимо определить наименование товара, по которому был наибольший спрос за последние N дней. Один из вариантов решения этой задачи заключается в выполнении следующей последовательности шагов.

1). Объявляем переменные, требуемые для решения данной задачи:

DECLARE @Name VARCHAR(50), @Code INT, @Quantity NUMERIC(12,3),

@N INT

2). Задаем значение интервала в днях:

SET @N = 60

3). Выполняем выборку данных с группировкой по кодам товаров и подсчетом для каждой группы суммарного количества заказанного товара (т.е. величины спроса). При этом результирующий набор данных будем сортировать в порядке возрастания величины спроса и, следовательно, последняя его строка будет задавать товар с наибольшим спросом. Результат выполнения этой команды на экран не выдается, а вместо этого данные последней строки сохраняются в переменных @Code и @Quantity:

SELECT @Code = КодТовара, @Quantity = SUM(Количество)

FROM Заказ

WHERE ДатаЗаказа BETWEEN GetDate() - @N AND GetDate()

GROUP BY КодТовара

ORDER BY SUM(Количество)

4). По найденному в предыдущем пункте коду товара с наибольшим спросом находим соответствующее ему наименование товара:

SELECT @Name = Наименование

FROM Товар

WHERE КодТовара = @Code

5). Выдаем найденный результат на экран:

SELECT @Name AS [Наименование товара], @Quantity AS

[Итоговое кол-во], @N AS [Временной интервал]

GO

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

Программный код на языке Transact-SQL может включать в себя также битовые и логические операторы, операторы перехода (GOTO) и приостанова (WAITFOR), команды организации ветвлений (IF, CASE) и циклов (WHILE), операторные скобки (BEGIN…END) и др. (см. [1], стр. 1057 – 1087).

Временные таблицы. Они создаются в системной базе данных tempdb и бывают двух типов: локальные и глобальные. Локальные временные таблицы видны только из того соединения, в котором были созданы, и автоматически уничтожаются при закрытии этого соединения. Глобальные временные таблицы также уничтожаются при закрытии соединения, в котором были созданы, однако, когда они существуют, то видны и из любых других соединений. Это предоставляет удобный механизм для обмена данными между различными приложениями, например, между различными копиями хранимых процедур (одна и та же хранимая процедура, запускаемая различными пользователями, может обращаться к глобальной временной таблице для получения информации).

Имена локальных временных таблиц начинаются символом «#», а глобальных – двумя такими символами.

Примеры создания и использования локальных временных таблиц:

CREATE TABLE #Goods (

КодТовара INT PRIMARY KEY,

Наименование VARCHAR(50) NOT NULL,

ЕдиницаИзм CHAR(10) NULL

)

INSERT #Goods

SELECT КодТовара, Наименование, ЕдиницаИзм

FROM Товар

SELECT * FROM #Goods

GO

SELECT Наименование, Цена, КодВалюты

INTO #Goods_2

FROM Товар

SELECT * FROM #Goods_2

GO