Uživatelem definovaná funkce - User-defined function

Uživatelem definované funkce ( UDF ) je funkce poskytované uživatelem programu nebo prostředí, v situaci, kdy Obvykle se předpokládá, že funkce jsou zabudovány do programu nebo prostředí. UDF jsou obvykle psány na požadavek jeho tvůrce.

ZÁKLADNÍ jazyk

V některých starých implementacích programovacího jazyka BASIC jsou funkce definované uživatelem definovány pomocí syntaxe "DEF FN". Modernější dialekty BASIC jsou ovlivněny paradigmatem strukturovaného programování , kde je většina nebo celý kód zapsán jako funkce nebo postupy definované uživatelem a koncept se stává prakticky nadbytečným.

Databáze

V systémech pro správu relačních databází poskytuje uživatelem definovaná funkce mechanismus pro rozšíření funkcí databázového serveru přidáním funkce, kterou lze vyhodnotit pomocí příkazů standardního dotazovacího jazyka (obvykle SQL ). Standard SQL rozlišuje skalární a tabulkové funkce. Skalární funkce vrací pouze jednu hodnotu (nebo NULL ), zatímco funkce tabulky vrací (relační) tabulku obsahující nula nebo více řádků, každý řádek s jedním nebo více sloupci.

Uživatelem definované funkce v SQL jsou deklarovány pomocí CREATE FUNCTIONpříkazu. Například funkce, která převádí Celsia na Fahrenheita, může být deklarována takto:

CREATE FUNCTION dbo.CtoF(Celsius FLOAT)
  RETURNS FLOAT
  RETURN (Celsius * 1.8) + 32

Po vytvoření může být uživatelem definovaná funkce použita ve výrazech v příkazech SQL. Lze jej například vyvolat tam, kde je povolena většina ostatních vnitřních funkcí. To také zahrnuje příkazy SELECT , kde lze tuto funkci použít proti datům uloženým v tabulkách v databázi. Při takovém použití je funkce koncepčně vyhodnocena jednou za řádek. Předpokládejme například tabulku s názvem Elementss řádkem pro každý známý chemický prvek. Tabulka má sloupec s názvem BoilingPoint pro bod varu tohoto prvku ve stupních Celsia. Dotaz

SELECT Name, CtoF(BoilingPoint)
  FROM Elements

získá název a bod varu z každé řady. Vyvolá uživatelem definovanou funkci CtoF, jak byla deklarována výše, aby převedla hodnotu ve sloupci na hodnotu ve Fahrenheite.

Každá uživatelem definovaná funkce nese určité vlastnosti nebo vlastnosti. Standard SQL definuje následující vlastnosti:

  • Jazyk - definuje programovací jazyk, ve kterém je implementována uživatelem definovaná funkce; příklady zahrnují SQL, C, C# a Java.
  • Styl parametrů - definuje konvence, které se používají k předávání parametrů funkce a výsledků mezi implementací funkce a databázovým systémem (platí pouze v případě, že jazyk není SQL).
  • Specifický název - název funkce, která je v databázi jedinečná. Vzhledem k přetíženým funkcím nemusí být název funkce jedinečný . Některé implementace SQL vyžadují, aby názvy funkcí byly v rámci databáze jedinečné, a přetížené funkce nejsou povoleny.
  • Determinismus - určuje, zda je funkce deterministická nebo ne. Charakteristika determinismu má vliv na optimalizátor dotazů při kompilaci příkazu SQL.
  • Přístup k datům SQL - říká systému správy databází, zda funkce neobsahuje žádné příkazy SQL (NO SQL), obsahuje příkazy SQL, ale nepřistupuje k žádným tabulkám nebo pohledům (OBSAHUJE SQL), čte data z tabulek nebo zobrazení (READS SQL DATA), nebo ve skutečnosti upravuje data v databázi (MODIFIKUJE DATA SQL).

Uživatelem definované funkce by neměly být zaměňovány s uloženými procedurami . Uložené procedury umožňují uživateli seskupit sadu příkazů SQL. Procedura může přijímat parametry a spouštět své příkazy SQL v závislosti na těchto parametrech. Procedura není výraz, a proto ji nelze použít jako funkce definované uživatelem.

Některé systémy pro správu databází umožňují vytváření funkcí definovaných uživatelem v jiných jazycích než SQL. Microsoft SQL Server například umožňuje uživateli používat k tomuto účelu jazyky .NET včetně C#. DB2 a Oracle podporují funkce definované uživatelem napsané v programovacích jazycích C nebo Java.

SQL Server 2000

V systému Microsoft SQL Server 2000 existují tři typy UDF : skalární funkce , vložené funkce s tabulkovou hodnotou a funkce s více tabulkami.

Skalární funkce vracejí jedinou datovou hodnotu (nikoli tabulku) s klauzulí RETURNS. Skalární funkce mohou používat všechny skalární datové typy, s výjimkou časového razítka a uživatelem definovaných datových typů. Vložené funkce s tabulkovou hodnotou vrací sadu výsledků jednoho příkazu SELECT. Multistatement table-valued functions return a table, which was built with many TRANSACT-SQL commands.

Uživatelem definované funkce lze vyvolat z dotazu, jako jsou vestavěné funkce, jako OBJECT_ID, LEN, DATEDIFF, nebo je lze spustit pomocí příkazu EXECUTE, jako jsou uložené procedury.

Poznámky k výkonu: 1. Na systému Microsoft SQL Server 2000 může být funkce s tabulkovou hodnotou, která „zabalí“ zobrazení, mnohem rychlejší než samotné zobrazení. Následující MyFunction je příkladem „wrapperu funkcí“, který běží rychleji než podkladové zobrazení MyView:

CREATE FUNCTION MyFunction()
    RETURNS @Tbl TABLE 
    (
        StudentID              VARCHAR(255),
        SAS_StudentInstancesID INT,
        Label                  VARCHAR(255),
        Value                  MONEY,
        CMN_PersonsID          INT
    )
AS
BEGIN
    INSERT @Tbl
    (
        StudentID,
        SAS_StudentInstancesID,
        Label,
        Value,
        CMN_PersonsID
    )
    SELECT 
        StudentID,
        SAS_StudentInstancesID,
        Label,
        Value,
        CMN_PersonsID
    FROM MyView -- where MyView selects (with joins) the same columns from large table(s)

    RETURN
END

2. Na serveru Microsoft SQL Server 2005 je výsledek stejného spuštění kódu opačný: zobrazení je spuštěno rychleji než „wrapper funkcí“.

Uživatelem definované funkce jsou podprogramy vytvořené z jednoho nebo více příkazů Transact-SQL, které lze použít k zapouzdření kódu pro opětovné použití. Trvá nula nebo více argumentů a vyhodnotí návratovou hodnotu. Má v těle příkazy control-flow i DML podobné uloženým procedurám. Nepovoluje změny žádného stavu globální relace, jako jsou úpravy databáze nebo externího zdroje, jako je soubor nebo síť. Nepodporuje výstupní parametr. K předání výchozí hodnoty parametru je nutné zadat klíčové slovo DEFAULT. Chyby v UDF způsobují přerušení UDF, což zase přeruší příkaz, který UDF vyvolal.

CREATE FUNCTION CubicVolume
-- Input dimensions in centimeters
(
    @CubeLength decimal(4,1), 
    @CubeWidth  decimal(4,1),
    @CubeHeight decimal(4,1)
)
    RETURNS decimal(12,3)
AS
BEGIN
  RETURN(@CubeLength * @CubeWidth * @CubeHeight)
END

Datový typ podporovaný v Microsoft SQL Server 2000 Jako dočasná tabulka používaná k ukládání výsledků Většinou se používá k definování dočasné proměnné typu (tabulka) a návratové hodnoty UDF Rozsah je omezen na funkci, uloženou proceduru nebo dávku, ve které je definovaná operace přiřazení není povolena mezi (tabulkou) proměnnými Lze použít ve funkcích SELECT, INSERT, UPDATE a DELETE CREATE FUNCTION k vytvoření UDF ALTER FUNCTION ke změně charakteristik funkce UDF DROP FUNCTION k odstranění UDF

Úl Apache

Apache Hive definuje kromě běžných uživatelem definovaných funkcí (UDF) také uživatelem definované agregační funkce (UDAF) a funkce generující tabulky (UDTF). Hive umožňuje vývojářům vytvářet vlastní vlastní funkce v Javě.

Reference

externí odkazy