
Базы данных / ЛР_5_2014
.pdf
ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
Лабораторная работа 5
Функции, определяемые пользователем, и хранимые процедуры
Цель работы
Получить практические навыки создания и использования хранимых процедур на сервере БД и функций, определяемых пользователем.
Задания
1.Изучите приведенный в лабораторной работе теоретический материал.
2.Изучите приведенные в лабораторной работе примеры создания хранимых процедур и определяемых пользователями функций.
3.Выполните индивидуальное задание: сформулируйте и согласуйте с преподавателем список хранимых процедур и определяемых пользователями функций в проектируемой Вами базе данных. Список по содержанию может совпадать со списком запросов из предыдущей работы.
Предусмотреть хранимые процедуры с передачей параметров в процедуру и возврат значений параметров из процедуры.
Предусмотреть скалярных функций и функций, возвращаемых табличные знаяения.
4.Создайте SQL-код процедур и функций.
5.Проверьте работу процедур и функций, организовав обращение к
ним.
6.Покажите работу преподавателю.
7.Ответьте на контрольные вопросы.
Краткие теоретические сведения
Хранимая процедура
Хранимая процедура – программа (объект базы данных), объединяющий запросы и процедурную логику (операторы присваивания, ветвления и т. д.) и хранящаяся в базе данных.
Качала Н.М., 2014 |
Страница 1 |
ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
ВMS SQL Server 2008 R2 имеется три типа хранимых процедур (ХП): системные хранимые процедуры, расширенные хранимые процедуры и определяемые пользователем хранимые процедуры.
Системные хранимые процедуры предоставляет SQL Server 2008 R2. Они имеют префикс sp и используются для управления SQL Server, а также для вывода на экран информации о базах данных и пользователях.
Расширенные хранимые процедуры являются динамически подключаемыми библиотеками (DLL), которые может динамически загружать и выполнять SQL Server. Расширенные хранимые процедуры имеют префикс xp_.
Определяемые пользователем ХП создаются, хранятся и выполняются пользователями в контексте только той базы данных, для которой были созданы.
Хранимые процедуры похожи на процедуры языков высокого уровня. ХП в MS SQLSERVER 2008 2 может быть написана на языке Transact-SQL (T-SQL) или на любом языке платформы .NET (среда Common Language Runtime – CLR).
Влабораторной работе для написания ХП используется T-SQL.
Каждая ХП компилируется при первом выполнении, при этом в процессе компиляции строится оптимальный план выполнения процедуры. Описание процедуры совместно с планом ее выполнения хранится в системных таблицах БД.
Синтаксис хранимой процедуры
CREATE{PROCEDURE |PROC} [имя схемы. ] <имя процедуры>
[ { @<имя параметра>[ имя схемы типа данных. ] <тип данных>}
[ VARYING ]
[ = <значение по умолчанию>]
[ OUT | OUTPUT ]
[READONLY] |
] |
[ WITH |
|
RECOMPILE | ENCRYPTION | |
|
[EXECUTE AS {CALLER|SELF|OWNER|’<user name>’}] |
|
[FOR REPLICATION] |
|
AS |
|
{ [ BEGIN ] |
|
|
|
|
|
Качала Н.М., 2014 |
Страница 2 |

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
SQL-инструкции[;] [ END ] } [;]
Процедуры привязаны к схеме. Если имя схемы не указано при создании процедуры, то автоматически назначается схема по умолчанию для пользователя, который создает процедуру.
Имена процедур должны соответствовать требованиям, предъявляемым
кидентификаторам, и должны быть уникальными в схеме.
@parameter – параметр, объявленный в процедуре. Имя параметра, начинающееся со знака @ должно соответствовать правилам написания идентификаторов.
Параметры являются локальными в пределах процедуры. Можно объявить от 1 до 2100 параметров. В разных процедурах могут быть использованы одинаковые имена параметров.
При выполнении процедуры для каждого из объявленных параметров должно быть определено значение по умолчанию или задано равным другому параметру, или указано пользователем.
Параметры не могут быть объявлены, если указан параметр FOR
REPLICATION.
[<имя схемы типа данных.> ]<тип данных> – тип данных параметра и схема, к которой принадлежит этот тип
Все типы данных T-SQL можно использовать в качестве параметров. Для создания параметров, возвращающих табличное значение, можно
использовать определяемый пользователем табличный тип. Возвращающие табличное значение параметры могут быть только входными и должны сопровождаться ключевым словом READONLY.
Типы данных cursor могут быть только выходными параметрами и должны сопровождаться ключевым словом VARYING.
VARYING – указывает результирующий набор, поддерживаемый в качестве выходного параметра. Этот параметр динамически формируется процедурой, и его содержимое может различаться. Применяется только к аргументам типа cursor.
Если для некоторого параметра определено значение по умолчанию, то процедуру можно выполнить без указания значения этого параметра. Значение по умолчанию должно быть константой или может быть равно
Качала Н.М., 2014 |
Страница 3 |

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
NULL. Значение константы может иметь вид шаблона, что позволяет использовать ключевое слово LIKE при передаче параметра в процедуру.
OUT | OUTPUT показывает, что параметр процедуры является выходным.
READONLY указывает, что параметр не может быть обновлен или изменен в тексте процедуры.
RECOMPILE показывает, что компонент Database Engine не кэширует план запроса для этой процедуры, что вызывает ее компиляцию при каждом выполнении. Этот параметр нельзя использовать, если указано предложение
FOR REPLICATION, а также для процедур CLR.
ENCRYPTION – предписывает серверу выполнить шифрование кода ХП, что может обеспечить защиту от использования авторских алгоритмов, реализующих работу ХП. Текст ХП не виден непосредственно ни в одном из представлений каталога в SQL Server и доступен только привилегированным пользователям Процедуры, созданные с этим аргументом, не могут быть опубликованы как часть репликации SQL Server.
Параметр FOR REPLICATION востребован при репликации данных и включении создаваемой хранимой процедуры в качестве статьи в публикацию.
Ключевое слово AS размещается в начале собственно тела ХП.
Для запуска хранимой процедуры обращаются к ней по имени с указанием при необходимости значений входных параметров или/и объявлением выходных переменных.
Примеры хранимых процедур
1. Вывести паспортные данные сотрудника Зотова.
CREATE PROCEDURE my_proc1
AS
SELECT номер_пасп, кем_выдан, дата_выдачи
FROM СОТРУДНИКИ
WHERE Фамилия= ‘Зотов’
Вызов процедуры:
EXEC my_proc1
Качала Н.М., 2014 |
Страница 4 |

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
2. Вывести |
паспортные данные заданного |
сотрудника (фамилия |
передается через параметры).
CREATE PROCEDURE my_proc2 @FIO VARCHAR(30)
AS
SELECT номер_пасп, кем_выдан, дата_выдачи FROM СОТРУДНИКИ
WHERE Фамилия= @FIO
Вызов процедуры:
EXEC my_proc2 'Сидоров'
3. Вычислить и вывести возраст сотрудников на текущую дату.
CREATE PROCEDURE my_proc3 AS
SELECT Фамилия,
DATEDIFF(year, Дата_рожд, GETDATE()) AS Возраст
FROM СОТРУДНИКИ
ORDER BY Фамилия;
Вызов процедуры:
EXEC my_proc3
4. Определить средний возраст сотрудников
CREATE PROC my_proc5
-- возврат значения переменной из процедуры
@Sred_Vozr FLOAT OUTPUT AS
SELECT @total=AVG(DATEDIFF(year, Дата_рожд, GETDATE()) ) FROM СОТРУДНИКИ
Вызов процедуры:
DECLARE @srVozrast FLOAT
EXEC my_proc5 @srVozrast OUTPUT SELECT @srVozrast AS Средний_возраст
5. Найти родственников заданного сотрудника
CREATE PROCEDURE COTR_RODCTV @FIO VARCHAR(30)
Качала Н.М., 2014 |
Страница 5 |

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
AS
SELECT R.Фамилия, R.Имя, R.Дата_рожд, Родство.наименование
FROM (РОДСТВЕННИКИ as R INNER JOIN СОТРУДНИКИ as C ON R.таб_номер=C.таб_номер)
INNER JOIN РОДСТВО ON РОДСТВО.код_родств=R.код_родств
WHERE C.Фамилия= @FIO;
Вызов процедуры:
exec COTR_RODCTV 'Андреев'
В среде MS SQL Server Management Studio для создания хранимой процедуры необходимо вызвать соответствующий пункт контекстного меню объекта «Хранимые процедуры» (рис.1). В правой части окна среды появиться шаблон хранимой процедуры (рис. 2).
Рис. 1. Контекстное меню объекта базы данных «Хранимая процедура»
Качала Н.М., 2014 |
Страница 6 |

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
Рис. 2. Шаблон хранимой процедуры
Хранимая процедура имеет следующую структуру (рис. 2):
1.Область настройки параметров синтаксиса процедуры. Позволяет настраивать некоторые синтаксические правила, используемые при наборе кода процедуры. В нашем случае это:
SET ANSI_NULLS ON– включает использование значений NULL в кодировке ANSI,
SETQUOTED_IDENTIFIER ON – включает возможность использования двойных кавычек для определения идентификаторов;
2.Область определения имени процедуры (Procedure_Name) и параметров передаваемых в процедуру (@Param1, @Param2). Определение параметров имеет следующий синтаксис:
@<Имя параметра><Тип анных>=<Значениепо умолчанию>
Параметры разделяются между собой запятыми.
3. Начало тела процедуры, обозначается служебным словом
«BEGIN».
Качала Н.М., 2014 Страница 7

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
4.Тело процедуры, содержит команды языка программирования запросов T-SQL;
5.Конец тела процедуры, обозначается служебным словом «END».
Определяемые пользователем функции
Определяемая пользователем функция – подпрограмма, которая может многократно использоваться в пользовательских запросах.
Пользовательские функции можно использовать, как и любое другое выражение в SQL запросе.
Оператор определения пользовательский функции имеет вид:
CREATE FUNCTION [OWNER].[FUNCTION NAME] (PARAMETER LIST) RETURNS (return_type_spec) AS
BEGIN (FUNCTION BODY) END
Пользовательские функции бывают двух типов: функции, возвращающие скалярные значения и функции, возвращающие таблицы.
У функций нет ограничений на возвращаемое значение. Возвращаемые функцией значения могут принадлежать к любому типу данных, определенному в SQL Server 2008 R2, кроме типа данных больших двоичных объектов (BLOB), курсоров, временных меток (timestamps).
Всреде MS SQL Server Management Studio откройте свою БД, выделите
вОбозревателе объектов объект Функции, в зависимости от задачи,
выделите папку «Скалярные функции» или «Функции, возвращающие табличное значение» и из контекстного меню выберите команду для создания новой пользовательской функции.
Вправой части окна среды появиться шаблон пользовательской функции.
1.Найти родственников заданного сотрудника
CREATE FUNCTION RODSTVENIKI (@FIO VARCHAR(30))
RETURNS TABLE AS
RETURN
(
Качала Н.М., 2014 |
Страница 8 |

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
SELECT R.Фамилия, R.Имя, R.Дата_рожд, Родство.наименование
FROM (РОДСТВЕННИКИ as R INNER JOIN СОТРУДНИКИ as C ON R.таб_номер=C.таб_номер)
INNER JOIN РОДСТВО ON РОДСТВО.код_родств=R.код_родств
WHERE C.Фамилия= @FIO;
)
Обращение к функции
SELECT Фамилия, Имя, Дата_рожд, наименование AS степень_родства
FROM RODSTVENIKI('Андреев')
2. Найти сотрудников, рожденных в заданном месяце
CREATE FUNCTION MONTH_birth
(
@m int
)
RETURNS TABLE AS
RETURN
(
SELECT Фамилия FROM СОТРУДНИК
WHERE MONTH(Дата_рожд)=@m
Обращение к функции – выборка сотрудников, рожденных в сентябре
SELECT Фамилия
FROM MONTH_birth(09)
3. Определить средний возраст сотрудников
CREATE FUNCTION AVG_vozr () RETURNS float
AS BEGIN
DECLARE @Result float SET @Result=
(SELECT AVG(DATEDIFF(year, Дата_рожд, GETDATE())) FROM СОТРУДНИКИ
)
RETURN (@Result) END
Качала Н.М., 2014 |
Страница 9 |

ПМИ |
БАЗЫ ДАННЫХ |
2014-2015 |
Обращение к функции
DECLARE @sred FLOAT SET @sred=dbo.AVG_vozr()
SELECT @sred AS Средний_возраст
Контрольные вопросы
1.Что такое хранимая процедура?
2.На каких языках программирования может быть написана хранимая процедура в MS SQL SERVER?
3.Перечислите виды хранимых процедур?
4.В чем заключается преимущество хранимых процедур в сравнении с процедурами, реализованными на клиенте?
5.В чем преимущество хранимых процедур перед запросами на выборку?
6.Можно ли созданные в БД хранимые процедуры использовать для реализации тех же функций в другой БД?
7.Расскажите алгоритм выполнения процедур при наличии параметров, значения которых заданы по умолчанию.
8.В какой системной базе данных хранятся системные процедуры?
9.Укажите разницу между определяемыми пользователем функциями (UDF) и хранимыми процедурами.
Качала Н.М., 2014 |
Страница 10 |