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

Раздел III. Создание и работа с определяемыми пользователем функциями.

Помимо использования встроенных функций, пользователи могут создавать свои собственные функции. Эти функции в отличие от встроенных являются обычными объектами базы данных, т.е. имеют своего владельца, который может предоставлять другим пользователям право на их вызов. Имеется три типа определяемых пользователем функций.

1).Функции типа Scalar. Функции этого типа являются наиболее привычными и возвращают скалярное значение любого из типов данных, поддерживаемых сервером, за исключением text, ntext, image, timestamp, table и cursor. Команда создания функции имеет следующий синтаксис (см. [1], стр. 1115):

CREATE  FUNCTION [ owner_name. ] function_name     ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS scalar_return_data_type

[ WITH < function_option> [ [,] ...n] ]

[ AS ]

BEGIN     function_body     RETURN scalar_expression END

/* Функция типа Scalar, возвращающая курс валюты по ее коду */

CREATE FUNCTION fn_ВыборКурсаВалюты

(@Код CHAR(3))

RETURNS SMALLMONEY

BEGIN

DECLARE @Курс SMALLMONEY --объявляем локальную переменную @Курс

SELECT @Курс = КурсВалюты

FROM Валюта

WHERE КодВалюты = @Код

RETURN @Курс --функция возвращает значение переменной @Курс

END

GO

/* Проверка работы функции func_ВыборКурсаВалюты */

DECLARE @Code CHAR(3)

SET @Code = 'USD'

SELECT @Code AS [Код валюты], dbo.fn_ВыборКурсаВалюты(@Code)

AS [Курс валюты]

GO

Примечание. При вызове скалярной функции, ее имя должно быть дополнено именем владельца или именем пользователя, которому предоставлено право на вызов этой функции.

2). Функции типа Inline Table-valued. Эти функции всегда возвращают значения типа данных table (таблица). Тело функции всегда состоит из одной команды SELECT. Особенностью функций этого типа является то, что код функции при выполнении программы вставляется непосредственно в исполняемый набор команд, т.е. происходит не вызов функции, а встраивание. Команда создания функции имеет следующий синтаксис (см. [1], стр. 1117):

CREATE FUNCTION [ owner_name. ] function_name     ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS TABLE

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

RETURN [ ( ] select-stmt [ ) ]

/* Функция типа Inline Table-valued, возвращающая заказы по валюте*/

CREATE FUNCTION fn_ВыборЗаказовПоВалюте

(@Код CHAR(3))

RETURNS TABLE

AS RETURN

SELECT Заказ.*, Товар.КодВалюты

FROM Заказ INNER JOIN Товар

ON Заказ.КодТовара = Товар.КодТовара

WHERE Товар.КодВалюты = @Код

GO

/* Проверка работы функции func_ВыборЗаказовПоВалюте */

SELECT * FROM fn_ВыборЗаказовПоВалюте('USD')

GO

3). Функции типа Multi-statement Table-valued. Эти функции, как и функции предыдущего типа, возвращают значение типа table, однако тело функции этого типа может состоять более чем из одной команды, что дает возможность использовать в теле функции транзакции, курсоры, вызывать хранимые процедуры и т.д. Команда создания функции имеет следующий синтаксис (см. [1], стр. 1118):

CREATE FUNCTION [ owner_name. ] function_name     ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS @return_variable TABLE < table_type_definition >

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

BEGIN     function_body     RETURN END

< function_option > ::=     { ENCRYPTION | SCHEMABINDING }

< table_type_definition > :: =     ( { column_definition | table_constraint } [ ,...n ]

/* Функция типа Multi-statement Table-valued, возвращающая таблицу с новым столбцом */

CREATE FUNCTION fn_ВыборРегионовСтраны

(@Страна VARCHAR(20))

RETURNS @CountryRegions TABLE (

КодРегиона INT PRIMARY KEY,

Страна VARCHAR(20) NOT NULL,

Город VARCHAR(20) NULL,

ОбластнойЦентр BIT NULL)

BEGIN

-- Объявляем локальную переменную @rowset типа таблица

DECLARE @rowset TABLE (

КодРегиона INT PRIMARY KEY,

Страна VARCHAR(20) NOT NULL,

Область VARCHAR(20) NULL,

Город VARCHAR(20) NULL,

ОбластнойЦентр BIT DEFAULT 0 NULL)

-- Заносим данные в локальную переменную @rowset