Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы данных / ЛР_5_2014

.pdf
Скачиваний:
30
Добавлен:
21.03.2015
Размер:
751.28 Кб
Скачать

ПМИ

БАЗЫ ДАННЫХ

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

Соседние файлы в папке Базы данных