Пользователь функция ( UDF ) является функция обеспечивается пользователем программы или сред, в условиях , когда обычное предположение , что функции встроены в программу или окружающую среду. UDF обычно пишутся по требованию их создателя.
БАЗОВЫЙ язык
В некоторых старых реализациях языка программирования BASIC пользовательские функции определяются с использованием синтаксиса «DEF FN». На более современные диалекты BASIC влияет парадигма структурированного программирования , где большая часть или весь код написан как определяемые пользователем функции или процедуры, и концепция становится практически избыточной.
Базы данных
В системах управления реляционными базами данных пользовательская функция предоставляет механизм для расширения функциональных возможностей сервера базы данных путем добавления функции, которая может быть оценена с помощью операторов стандартного языка запросов (обычно SQL ). Стандарт SQL различает скалярные и табличные функции. Скалярная функция возвращает только одно значение (или NULL ), тогда как табличная функция возвращает (реляционную) таблицу, содержащую ноль или более строк, каждая строка с одним или несколькими столбцами.
Пользовательские функции в SQL объявляются с помощью CREATE FUNCTION
оператора. Например, функция, преобразующая градусы Цельсия в градусы Фаренгейта, может быть объявлена следующим образом:
СОЗДАТЬ ФУНКЦИЮ dbo . CTOF ( по Цельсию ПОПЛАВКОВЫЕ ) ВОЗВРАТ FLOAT RETURN ( по Цельсию * 1 . 8 ) + 32
После создания пользовательская функция может использоваться в выражениях в операторах SQL. Например, его можно вызвать там, где разрешено большинство других встроенных функций. Сюда также входят операторы SELECT , в которых функцию можно использовать для данных, хранящихся в таблицах базы данных. По идее, при таком использовании функция оценивается один раз для каждой строки. Например, предположим, что есть таблица с именем ELEMENTS, в которой есть строка для каждого известного химического элемента. В таблице есть столбец с именем BoilingPoint для точки кипения этого элемента в градусах Цельсия. Запрос
ВЫБРАТЬ имя , CtoF ( точка кипения ) из элементов
будет извлекать имя и точку кипения из каждой строки. Он вызывает определяемую пользователем функцию CtoF, как объявлено выше, чтобы преобразовать значение в столбце в значение в градусах Фаренгейта.
Каждая определяемая пользователем функция имеет определенные свойства или характеристики. Стандарт SQL определяет следующие свойства:
- Язык - определяет язык программирования, на котором реализована пользовательская функция; примеры включают SQL, C, C # и Java.
- Стиль параметра - определяет соглашения, которые используются для передачи параметров функции и результатов между реализацией функции и системой базы данных (применимо только в том случае, если язык не является SQL).
- Определенное имя - имя функции, уникальное в базе данных. Обратите внимание, что имя функции не обязательно должно быть уникальным, учитывая перегруженные функции . Некоторые реализации SQL требуют, чтобы имена функций в базе данных были уникальными, а перегруженные функции не допускаются.
- Детерминизм - определяет, является ли функция детерминированной или нет. Характеристика детерминизма влияет на оптимизатор запросов при компиляции оператора SQL.
- Доступ к данным SQL - сообщает системе управления базой данных, не содержит ли функция операторов SQL (NO SQL), содержит ли она операторы SQL, но не имеет доступа к каким-либо таблицам или представлениям (CONTAINS SQL), читает ли данные из таблиц или представлений (READS SQL DATA), или фактически изменяет данные в базе данных (МОДИФИЦИРУЕТ ДАННЫЕ SQL).
Пользовательские функции не следует путать с хранимыми процедурами . Хранимые процедуры позволяют пользователю группировать набор команд SQL. Процедура может принимать параметры и выполнять свои операторы SQL в зависимости от этих параметров. Процедура не является выражением и, следовательно, не может использоваться как пользовательские функции.
Некоторые системы управления базами данных позволяют создавать пользовательские функции на языках, отличных от SQL. Например, Microsoft SQL Server позволяет пользователю использовать для этой цели языки .NET, включая C #. DB2 и Oracle поддерживают определяемые пользователем функции, написанные на языках программирования C или Java.
SQL Server 2000
В Microsoft SQL Server 2000 существует три типа UDF : скалярные функции , встроенные функции , возвращающие табличное значение, и функции с несколькими операторами , возвращающие табличное значение.
Скалярные функции возвращают одно значение данных (не таблицу) с предложением RETURNS. Скалярные функции могут использовать все скалярные типы данных, за исключением временных меток и пользовательских типов данных. Встроенные возвращающие табличное значение функции возвращают набор результатов одного оператора SELECT. Многопользовательские возвращающие табличное значение функции возвращают таблицу, которая была построена с помощью множества операторов TRANSACT-SQL.
Пользовательские функции могут быть вызваны из запроса, как встроенные функции, такие как OBJECT_ID, LEN, DATEDIFF, или могут быть выполнены с помощью оператора EXECUTE, как хранимые процедуры.
Примечания по производительности: 1. В Microsoft SQL Server 2000 возвращающая табличное значение функция, которая «обертывает» представление, может быть намного быстрее, чем само представление. Следующая MyFunction является примером «функции-оболочки», которая работает быстрее, чем базовое представление MyView:
СОЗДАТЬ ФУНКЦИЮ MyFunction () ВОЗВРАТ @tbl TABLE ( StudentID VARCHAR ( 255 ), SAS_StudentInstancesID INT , Этикетка VARCHAR ( 255 ), Значение ДЕНЬГИ , CMN_PersonsID INT )В ВИДЕНАЧИНАТЬ ВСТАВИТЬ @tbl ( StudentID , SAS_StudentInstancesID , Этикетка , Значение , CMN_PersonsID ) ВЫБЕРИТЕ StudentID , SAS_StudentInstancesID , Этикетка , Значение , CMN_PersonsID ОТ MyView - где MyView выбирает ( с присоединяется ) в одни и те же столбцы из большой таблицы ( ы ) ВОЗВРАЩАТЬСЯКОНЕЦ
2. В Microsoft SQL Server 2005 результат выполнения того же кода противоположен: представление выполняется быстрее, чем «функция-оболочка».
Пользовательские функции - это подпрограммы, состоящие из одного или нескольких операторов Transact-SQL, которые можно использовать для инкапсуляции кода для повторного использования. Он принимает ноль или более аргументов и оценивает возвращаемое значение. Имеет в теле операторы потока управления и DML, аналогичные хранимым процедурам. Не допускает изменений какого-либо глобального состояния сеанса, например модификации базы данных или внешнего ресурса, такого как файл или сеть. Не поддерживает выходной параметр. Для передачи значения параметра по умолчанию необходимо указать ключевое слово DEFAULT. Ошибки в UDF вызывают прерывание UDF, которое, в свою очередь, прерывает оператор, вызвавший UDF.
СОЗДАТЬ ФУНКЦИЮ CubicVolume - Введите размеры в сантиметрах ( @CubeLength decimal ( 4 , 1 ), @CubeWidth decimal ( 4 , 1 ), @CubeHeight десятичный ( 4 , 1 ) ) ВОЗВРАТ десятичный ( 12 , 3 ) В ВИДЕНАЧИНАТЬ ВОЗВРАТ ( @CubeLength * @CubeWidth * @CubeHeight ) КОНЕЦ
Тип данных, поддерживаемый в Microsoft SQL Server 2000 Как временная таблица, используемая для хранения результатов В основном используется для определения временной переменной типа (таблицы) и возвращаемого значения UDF. Область действия ограничена функцией, хранимой процедурой или пакетом, в котором она находится. определено Операция присваивания не разрешена между (Таблица) переменными Может использоваться в SELECT, INSERT, UPDATE и DELETE CREATE FUNCTION для создания UDF ALTER FUNCTION для изменения характеристик UDF DROP FUNCTION для удаления UDF
Apache Hive
Apache Hive определяет, помимо обычных пользовательских функций (UDF), также определяемые пользователем агрегатные функции (UDAF) и функции создания таблиц (UDTF). [1] Hive позволяет разработчикам создавать свои собственные пользовательские функции с помощью Java. [2]
Рекомендации
- ^ "LanguageManual UDF - Apache Hive - Фонд программного обеспечения Apache" . 26 июня 2015.
- ^ «HivePlugins - Apache Hive - Apache Software Foundation» . 26 июня 2015.