- •Кафедра экономической информатики
- •Базы данных
- •Содержание
- •Введение
- •Лабораторная работа №1. Логические и физические модели данных
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей в eRwin
- •Раздел II. Создание связей между сущностями, подмножеств модели и хранимых отображений. Переход к физической модели данных
- •Раздел III. Выполнение операции прямого проектирования
- •Раздел IV. Выполнение операции обратного проектирования
- •Лабораторная работа №2. Усложненные диаграммы «сущность-связь»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей логической модели
- •Раздел II. Создание связей между сущностями и иерархии наследования
- •Раздел III. Выполнение вариантов трансформы категориальной связи
- •Раздел IV. Выполнение методов синхронизации системного каталога базы данных и текущей модели
- •Лабораторная работа №3. Работа в среде субд «ms sql Server 2005»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Управление пользователями и правами доступа к данным
- •Лабораторная работа №4. Создание базы данных и ее объектов с помощью команд языка Transact-sql
- •Методические указания и задания к выполнению
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Ввод данных в таблицы базы данных
- •Insert into Заказ (КодКлиента, КодТовара, Количество)
- •Inner join Поставщик
- •Inner join Товар
- •Раздел III. Управление пользователями и правами доступа к данным.
- •Раздел IV. Анализ полученных результатов
- •Лабораторная работа №5. Манипулирование данными с помощью команд языка Transact-sql
- •Методические указания
- •Раздел I. Выборка данных из таблиц и представлений.
- •Раздел II. Обновление данных в таблицах и представлениях.
- •Раздел III. Удаление данных из таблиц и представлений.
- •Раздел IV. Изменение структуры таблицы.
- •Раздел V. Удаление таблицы из базы данных.
- •Задание к работе
- •Лабораторная работа №6. Программирование на языке Transact-sql
- •Методические указания
- •Раздел I. Основы программирования на языке Transact-sql.
- •Раздел II. Создание и работа с хранимыми (на сервере) процедурами.
- •If @Страна is not null
- •If @Город is not null
- •If @Город is not null
- •Insert into Валюта
- •Values(@Код, @Имя, @Шаг, @Курс)
- •If @Страна is not null
- •If @Город is not null
- •Into ##Регион
- •Раздел III. Создание и работа с определяемыми пользователем функциями.
- •Insert @rowset (КодРегиона, Страна, Область, Город)
- •Задание к работе
- •Лабораторная работа №7. Курсоры и триггеры в языке Transact-sql
- •Методические указания
- •Раздел I. Использование курсоров в языке Transact-sql
- •If @НачалоИнтервала is null
- •If @КонецИнтервала is null
- •Раздел II. Создание триггеров в языке Transact-sql.
- •If update(ДатаЗаказа)
- •If update(Цена)
- •If update(Цена)
- •Inserted.Цена * Валюта.КурсВалюты
- •Задание к работе
- •Литература Основная
- •Базы данных
- •220013, Минск, п. Бровки, 6.
Insert @rowset (КодРегиона, Страна, Область, Город)
SELECT КодРегиона, Страна, Область, Город
FROM Регион
WHERE Страна = @Страна
-- Заносим данные в столбец "ОбластнойЦентр" переменной @rowset
UPDATE @rowset
SET ОбластнойЦентр = 1
WHERE Область = ''
-- Заносим данные в результирующую переменную @CountryRegion типа таблица, т.к.
-- локальная переменная @rowset после выхода из функции автоматически уничтожается
INSERT @CountryRegions
SELECT КодРегиона, Страна, Город, ОбластнойЦентр
FROM @rowset
RETURN
END
GO
/* Проверка работы функции fn_ВыборРегионовСтраны */
SELECT * FROM fn_ВыборРегионовСтраны('Беларусь')
SELECT * FROM fn_ВыборРегионовСтраны('Россия')
GO
Для внесения изменений в существующие пользовательские функции используются те же команды, что и для их создания, с тем лишь отличием, что вместо зарезервированного слова CREATE используется слово ALTER (см. [1], стр. 1119).
Для удаления пользовательской функции используется команда, имеющая следующий синтаксис (см. [1], стр. 1120):
DROP FUNCTION { [ owner_name . ] function_name } [ ,...n ]
Задание к работе
1. Создайте хранимую процедуру pr_КолебанияСпросаТоваров, которая решает рассмотренную выше (см. раздел I) задачу определения наименования товара, по которому был наибольший или наименьший спрос за последние N дней. Эта процедура должна иметь два входных параметра (@Интервал, @ТипРезультата) и два выходных параметра (@Имя, @Итог). Если значение входного параметра @ТипРезультата равно 1, находится товар наибольшего спроса. Если же значение параметра равно 2 – находится товар наименьшего спроса.
2. Создайте хранимую процедуру pr_КлиентПоставщик_СтранаИнтервал, которая подсчитывает, сколько различных клиентов и различных поставщиков из указанной страны фигурирует в таблице Заказ, причем анализируются только те заказы, в которых значение поля Дата заказа попадает в указанный интервал дат. Эта процедура должна иметь три входных параметра (@Страна, @НачалоИнтервала, @КонецИнтервала) и два выходных параметра (@ЧислоКлиентов, @ЧислоПоставщиков). Если же значение параметра @Страна не будет указано (т.е. будет равно NULL), то подсчет клиентов и поставщиков должен вестись независимо от их национальной принадлежности.
3. Создайте хранимую процедуру pr_Товар_СтранаВалютаИнтервал, которая подсчитывает, сколько различных товаров в конкретной валюте было заказано клиентами из указанной страны, причем анализируются только те заказы, в которых значение поля Дата заказа попадает в заданный интервал дат. Эта процедура должна иметь четыре входных параметра (@Страна, @Валюта, @НачалоИнтервала, @КонецИнтервала) и один выходной параметр (@ЧислоТоваров). При этом расширьте возможности процедуры следующим образом:
- если значение параметра @Страна не будет указано (т.е. будет равно NULL), то подсчет товаров должен вестись независимо от национальной принадлежности клиента;
- если значение параметра @Валюта не будет указано (т.е. будет равно NULL), то подсчет товаров должен вестись применительно к национальной валюте (код валюты – BYR).
4. Создайте пользовательскую функцию fn_getЧислоДней_вМесяце типа Scalar, которая для конкретной даты возвращает число дней в месяце, который определяется этой датой (високосность года не учитывается). Эта функция должна иметь один входной параметр (@Дата).
5. Создайте пользовательскую функцию fn_getФИО_вФормате типа Scalar, которая на основе текстовой строки, содержащей фамилию, имя и отчество, формирует текстовую строку в одном из следующих форматов:
1) исходная строка переводится в верхний регистр;
2) исходная строка переводится в нижний регистр;
3) на верхнем регистре должны быть только первые буквы слов;
4) выводится только фамилия, а имя и отчество заменяются их первыми буквами с точкой.
Эта функция должна иметь два входных параметра (@ФИО, @Формат).
Усложненный вариант. Расширьте возможности функции таким образом, чтобы была допустима исходная строка (задаваемая параметром @ФИО), содержащая не один, а несколько пробелов между фамилией и именем или между именем и отчеством, а также допускающая наличие лидирующих пробелов перед фамилией.
6. Создайте пользовательскую функцию fn_getGroup_НаименованиеВалюта типа Inline Table-valued, которая возвращает таблицу со следующими столбцами:
Наименование товара |
Имя валюты |
Заказанное кол-во |
Стоимость в валюте |
Стоимость в национальной валюте |
. . . |
. . . |
. . . |
. . . |
. . . |
Эта таблица должна отражать результат группировки данных по полям Наименование и ИмяВалюты. Для каждой такой группы подсчитывается итоговое количество заказанного товара и итоговая стоимость в валюте и в национальной валюте.
Пользовательская функция fn_getGroup_НаименованиеВалюта должна иметь два входных параметра (@НачалоИнтервала, @КонецИнтервала), поэтому при формировании результирующей таблицы необходимо учитывать только те строки из таблицы Заказ, в которых значение поля Дата заказа попадает в указанный параметрами интервал дат.
7. Создайте пользовательскую функцию fn_getTable_СтоимостьНВ типа Multi-statement Table-valued, которая возвращает таблицу со следующими столбцами:
Номер |
Дата заказа |
Имя клиента |
Наименование товара |
Количество |
Цена в НВ |
Стоимость в НВ |
. . . |
. . . |
. . . |
. . . |
. . . |
. . . |
. . . |
Эта таблица строится в три этапа. Сначала создается таблица со столбцами, показанными выше, где столбец Номер является автоинкрементным первичным ключом, столбцы Цена в НВ (цена в национальной валюте) и Стоимость в НВ (стоимость в национальной валюте) являются вычисляемыми. Число строк этой таблицы будет равно числу строк в таблице Заказ.
На втором этапе подсчитывается средняя стоимость в национальной валюте всех заказанных товаров.
На третьем этапе из полученной таблицы удаляются все те строки, в которых значение столбца Стоимость в НВ будет меньше, чем подсчитанная на втором этапе средняя стоимость в национальной валюте. В результате будет получена таблица, которую и должна возвращать данная пользовательская функция. Эта функция не имеет ни одного входного параметра.
8. Разработайте программный код для проверки работы созданных хранимых процедур и пользовательских функций.
9. Фрагменты кода, относящиеся к выполнению задания, сохраните в файле D:\Work\X7230ХХХ\script3.sql.
10. Удалите базу данных Склад_ХХХ. Для этого в ее контекстном меню выберите команду Delete и затем в появившемся окне Delete Object установите флажок Close Existing Connections.