Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiNovye.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.92 Mб
Скачать

Функции Scalar

Создание функций этого типа выполняется с помощью команды CREATE FUNCTION, имеющей следующий синтаксис:

CREATE FUNCTION [<ownername>. ] <function_name> ( [ { @parameter_name <scalar_parameter_data_type> [ = <default> ] } [ ,...n ] ] ) RETURNS <scalar_return_data_type> [ WITH <function_option> [,...n] ] [ AS ] BEGIN <function_body> RETURN <scalar_expression> END

Рассмотрим назначение и использование параметров команды.

[ownername.]function_name  с помощью этого параметра указывается имя, которое будет присвоено функции function_name. Дополнительно можно указать имя владельца owner_name, которому будет принадлежать создаваемая функция. Это должно быть имя пользователя или роли, имеющихся в базе данных, в контексте которой создаётся функция. Если имя владельца опущено, то создаваемая функция будет принадлежать пользователю, выполняющему создание функции. При выборе имени функции следует учитывать, что имя должно быть уникальным в пределах владельца. Более того, не должно существовать других объектов, принадлежащих тому же владельцу и имеющих аналогичное имя. При выборе имени функции необходимо следовать стандартным правилам именования объектов. Если же в имени функции предполагается использовать недопустимые символы (например, пробел, точку, слэш и т. д.), то требуются ограничители (квадратные скобки или двойные кавычки).

Как видно из синтаксиса, указание имени базы данных, а тем более сервера, не разрешается. Таким образом, пользовательская функция может быть создана только в текущей базе данных. Если же необходимо создать функцию в иной базе данных, то следует установить её в качестве текущей.

@parameter_name scalar_parameter_data_type [ = default ]. Как было сказано выше, функция может содержать ноль, один или более входных параметров. Рассматриваемая конструкция как раз и используется для определения входных параметров. Каждый параметр должен иметь имя, уникальное в пределах создаваемой функции, и начинаться с символа @. Имя параметра указывается с помощью аргумента @parameter_name. После имени параметра через пробел необходимо указать тип данных scalar_parameter_data_type, который будет иметь параметр. Допускается использование любого из поддерживаемых SQL Server типов данных, включая пользовательские, за исключением типов данных timestamp, cursor и table. Дополнительно можно указать значение default, которое будет автоматически присваиваться параметру, если пользователь явно не указал значение соответствующего параметра при вызове функции. Естественно, значение по умолчанию должно быть того же типа, что и сам параметр. Как видно из синтаксиса команды CREATE FUNCTION, можно указать множество параметров. Для этого достаточно просто перечислить их определения через запятую.

RETURNS scalar_return_data_type. С помощью этой конструкции указывается, какой тип данных будет иметь возвращаемое функцией значение. Слово RETURNS является ключевым и должно присутствовать всегда. Собственно тип данных указывается с помощью аргумента scalar_return_data_type. Как уже было сказано, функции типа Scalаr могут возвращать значения любых типов данных, за исключением типов данных timestamp , text, ntext, image, table и cursor.

WITH function_option. С помощью ключевого слова WITH могут быть указаны дополнительные параметры, с которыми должна быть создана функция. Собственно параметр указывается с помощью конструкции function_option, которая имеет следующий синтаксис:

<function_option>::= { ENCRYPTION | SCHEMABINDING }

Благодаря ключевому слову ENCRYPTION код команды CREATE FUNCTION, который был использован для создания функции, будет зашифрован, и никто не сможет просмотреть его. Эта возможность позволяет скрыть логику работы функции. Код команд, который используется для создания объектов базы данных, хранится в столбце text системной таблицы syscomments и без шифрования может быть просмотрен с помощью обычной команды SELECT.

В теле функции может выполняться обращение к различным объектам базы данных. Как следствие этой связи, изменение или удаление соответствующих объектов базы данных может привести к нарушению работы функции. Чтобы запретить внесение изменений в объекты базы данных, которые могут привести к нарушению работы создаваемой функции, требуется указать при создании этой функции ключевое слово SCHEMABINDING.

AS. После этого ключевого слова следует определение собственно тела функции. В принципе, ключевое слово AS может быть опущено.

BEGIN ... END. Между этими ключевыми словами указывается набор команд function_body, которые собственно и будут являться телом функции.

RETURN sca1ar_expression. Когда в ходе выполнения кода функции встречается ключевое слово RETURN, выполнение функции завершается и как результат вычисления функции возвращается значение, указанное непосредственно после ключевого слова RETURN. Отметим, что в теле функции разрешается использование множества команд RETURN, которые могут возвращать различные значения. В качестве возвращаемого значения допускаются как обычные константы, так и сложные выражения. Единственно, тип данных возвращаемого значения должен совпадать с типом данных, указанных после ключевого слова RETURN. В качестве примера рассмотрим создание функции Funс1, которая будет иметь три входных параметра. Первые два параметра будут иметь тип данных bigint, тогда как третий  тип данных char(l) и значение по умолчанию «*». Функция будет возвращать значение типа данных bigint и выполнять четыре основных арифметических операции: сложение, вычитание, умножение и деление двух значений, подаваемых на вход функции. Операция, которую необходимо выполнить, будет задаваться с помощью третьего параметра, который может принимать соответственно значения «+», «-», «*» и «/».

CREATE FUNCTION Func1 (@Varl bigint, @Var2 bigint, @Oper char(1) = '*’) RETURNS bigint AS BEGIN DECLARE @Var3 bigint SET @Var3 = CASE @Oper WHEN ‘+’ THEN @Varl + @Var2 WHEN ‘-‘ THEN @Varl - @Var2 WHEN ‘*’ THEN @Varl * @Var2 WHEN ‘/’ THEN @Varl / @Var2 ELSE 0 END RETURN @Var3 END

Теперь вызовем созданную функцию:

SELECT Func1(4,5, ’+’), Func1(3,7,’*’) - Func1(64,4,’/’)*2

Будет возвращён следующий результат

9 -11

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]