LANGUAGE SQL

[ [ NOT ] DETERMINISTIC ]

[ [ NO ] EXTERNAL ACTION ]

[ уровень_доступа_к_SQL_данным ]

[ CALLED ON NULL INPUT ]

тело_функции

Здесь имя функции – определяет имя новой функции, которое может совпадать с именем какой-либо существующей функции, используемой в качестве источника; список параметров – задает имена и типы данных параметров функции, перечисленные через запятую. Имя функции вместе с количеством и типами данных параметров должно быть уникальным (длина, точность и масштаб, указываемые для соответствующих типов данных, во внимание не принимаются).

RETURNS– определяет тип возвращаемого функцией результата. Тип возвращаемого результата, в зависимости от типа функции (скалярная или табличная), представляется по-разному.

Результатом скалярной функции является одно значение, поэтому для скалярной функции RETURNS указывает тип результата и имеет следующий вид: RETURNS тип_данных.

Результатом табличной функции является таблица, поэтому для табличной функции RETURNS представляет структуру таблицы и имеет следующий вид:

RETURNS TABLE ( список_колонок )

Список колонок состоит из перечисленных через запятую имен и типов данных колонок. Все имена колонок должны быть разными.

LANGUAGE SQL – подчеркивает, что тело функции написано на языке SQL PL.

DETERMINISTIC или NOT DETERMINISTIC: DETERMINISTIC – указывает, что функция возвращает один и тот же результат для одних и тех же значений аргументов; NOT DETERMINISTIC– указывает, что для одних и тех же значений аргументов функция может возвратить разные результаты. Примером NOT DETERMINISTIC функции является функция, возвращающая случайное значение. Должно быть указано NOT DETERMINISTIC, если в теле функции используются какие-либо специальные регистры или вызов другой NOT DETERMINISTIC функции. Если данная конструкция опущена при определении функции, по умолчанию принимается NOT DETERMINISTIC.

EXTERNAL DATA или NO EXTERNAL DATA – указывает, выполняет (EXTERNAL DATA) или не выполняет (NO EXTERNAL DATA) функция некоторые действия, которые изменяют состояние внешнего, по отношению к базе данных, объекта (внешние действия). Если данная конструкция не указана, по умолчанию принимаетсяEXTERNAL DATA.

Уровень доступа к данным SQL – указывает, какой тип предложений SQL используется в теле функции. Может быть задан один из трех уровней доступа:

CONTAINS SQL – указывает, что в теле функции не могут быть использованы предложения SQL, которые читают (SELECT) и/или изменяют (INSERT, DELETE, UPDATE) данные;

READS SQL DATA – значение, принимаемое по умолчанию; указывает, что в теле функции не могут быть использованы предложения SQL, изменяющие данные;

MODIFIES SQL DATA – допускается только для табличных функций; указывает, что в теле функции могут быть использованы предложения SQL, модифицирующие данные в таблицах. Допускаются все предложения SQL, которые могут быть включены в динамическое составное предложение. Табличная SQL функция, модифицирующая данные, позволяет объединить модификацию данных и возврат некоторого результирующего множества записей.

CALLED ON NULL INPUT– указывает, что функция вызывается и в том случае, если какие-либо из аргументов имеют NULL значение. Функция также может возвращать NULL значение. Если не указано, по умолчанию принимается такое же поведение функции.

Тело функции – указывает, что именно выполняет функция при ее вызове, и может быть представлено в виде RETURN предложение или в виде динамического составного предложения. Во втором случае динамическое составное предложение, определяющее тело функции, должно включать, по крайней мере, одно предложение RETURN, и предложение RETURN должно обязательно выполниться при вызове функции. Табличная функция может содержать только одно предложение RETURN, и это предложение должно быть последним в динамическом составном предложении.

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

Примечания:

• если тело SQL функции содержит ссылки на какие-либо специальные регистры, представляющие дату и время, все ссылки возвращают одно и то же значение. Это же значение возвращают и ссылки на специальные регистры даты и/или времени, использованные в предложении, в котором вызывается данная функция;

• в теле SQL функции не может быть прямой или косвенный рекурсивный вызов этой же функции.

Ограничения на доступ к таблице:

• если функция определена как READS SQL DATA, она не может обращаться к таблице, модифицируемой предложением SQL, в котором данная функция вызывается. Например, если функция BONUS() определена как READS SQL DATA, и выполняется следующее предложение SQL:

UPDATE EMPLOYEE SET SALARY = SALARY + BONUS(EMPNO)

Тогда никакие предложения SQL, включенные в функцию BONUS, не могут читать данные из таблицы EMPLOYEE;

• если функция определена как MODIFIES SQL DATA, чтение из таблиц, модифицируемых данной функцией (и в определении функции, и в предложении, вызывающем функцию), не допускается;

• на табличную SQL функцию, изменяющую данные, можно ссылаться только из конструкции FROM самого внешнего запроса; при этом в конструкции FROM допускается вызов только одной табличной функции, изменяющей данные, и эта функция должна быть последней в списке.

Примеры:

Пример 1. Определить скалярную функцию, которая возвращает значение тангенса для некоторого угла, используя существующие функции вычисления синуса и косинуса.

CREATE FUNCTIONTAN (X DOUBLE)

RETURNSDOUBLE