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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Раздел 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,



Поделиться:


Последнее изменение этой страницы: 2017-01-25; просмотров: 162; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.137.218 (0.006 с.)