Funkcja zdefiniowana przez użytkownika - User-defined function

Funkcja zdefiniowana przez użytkownika ( UDF ) to funkcja udostępniana przez użytkownika programu lub środowiska w kontekście, w którym zwykle zakłada się, że funkcje są wbudowane w program lub środowisko. UDF są zwykle pisane na potrzeby ich twórcy.

PODSTAWOWY język

W niektórych starych implementacjach języka programowania BASIC funkcje zdefiniowane przez użytkownika są definiowane przy użyciu składni „DEF FN”. Bardziej nowoczesne dialekty języka BASIC są pod wpływem paradygmatu programowania strukturalnego , w którym większość lub cały kod jest napisany jako funkcje lub procedury zdefiniowane przez użytkownika, a koncepcja staje się praktycznie zbędna.

Bazy danych

W systemach zarządzania relacyjnymi bazami danych funkcja zdefiniowana przez użytkownika zapewnia mechanizm rozszerzania funkcjonalności serwera bazy danych o funkcję, która może być oceniana w standardowym języku zapytań (zwykle SQL ). Standard SQL rozróżnia funkcje skalarne i tabelowe. Funkcja skalarna zwraca tylko pojedynczą wartość (lub NULL ), podczas gdy funkcja tabelowa zwraca (relacyjną) tabelę zawierającą zero lub więcej wierszy, z których każdy zawiera jedną lub więcej kolumn.

Funkcje zdefiniowane przez użytkownika w SQL są deklarowane za pomocą CREATE FUNCTIONinstrukcji. Na przykład funkcja konwertująca stopnie Celsjusza na Fahrenheita może być zadeklarowana w następujący sposób:

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

Po utworzeniu funkcja zdefiniowana przez użytkownika może być używana w wyrażeniach w instrukcjach SQL. Na przykład można go wywoływać tam, gdzie dozwolona jest większość innych funkcji wewnętrznych. Obejmuje to również instrukcje SELECT , w których funkcja może być używana do danych przechowywanych w tabelach w bazie danych. Koncepcyjnie funkcja jest oceniana raz na wiersz w takim użyciu. Załóżmy na przykład tabelę o nazwie Elements, z wierszem dla każdego znanego pierwiastka chemicznego. Tabela zawiera kolumnę o nazwie BoilingPoint określającą temperaturę wrzenia tego pierwiastka w stopniach Celsjusza. Zapytanie

SELECT Name, CtoF(BoilingPoint)
  FROM Elements

pobierze nazwę i temperaturę wrzenia z każdego rzędu. Wywołuje funkcję zdefiniowaną przez użytkownika CtoF, jak zadeklarowano powyżej, aby przekonwertować wartość w kolumnie na wartość w stopniach Fahrenheita.

Każda funkcja zdefiniowana przez użytkownika ma określone właściwości lub cechy. Standard SQL definiuje następujące właściwości:

  • Język - określa język programowania, w którym zaimplementowana jest funkcja zdefiniowana przez użytkownika; przykłady obejmują SQL, C, C# i Java.
  • Styl parametru — określa konwencje, które są używane do przekazywania parametrów funkcji i wyników między implementacją funkcji a systemem bazy danych (ma zastosowanie tylko wtedy, gdy językiem nie jest SQL).
  • Nazwa właściwa - nazwa funkcji, która jest unikalna w ramach bazy danych. Zauważ, że nazwa funkcji nie musi być unikatowa, biorąc pod uwagę przeciążone funkcje . Niektóre implementacje SQL wymagają, aby nazwy funkcji były unikatowe w bazie danych, a przeciążone funkcje nie są dozwolone.
  • Determinizm — określa, czy funkcja jest deterministyczna, czy nie. Charakterystyka determinizmu ma wpływ na optymalizator zapytań podczas kompilowania instrukcji SQL.
  • Dostęp do danych SQL - informuje system zarządzania bazą danych, czy funkcja nie zawiera instrukcji SQL (NO SQL), zawiera wyrażenia SQL, ale nie ma dostępu do żadnych tabel ani widoków (CONTAINS SQL), odczytuje dane z tabel lub widoków (READS SQL DATA), lub faktycznie modyfikuje dane w bazie danych (MODIFIES SQL DATA).

Funkcje zdefiniowane przez użytkownika nie powinny być mylone z procedurami składowanymi . Procedury składowane umożliwiają użytkownikowi pogrupowanie zestawu poleceń SQL. Procedura może akceptować parametry i wykonywać swoje instrukcje SQL w zależności od tych parametrów. Procedura nie jest wyrażeniem i dlatego nie może być używana jak funkcje zdefiniowane przez użytkownika.

Niektóre systemy zarządzania bazami danych umożliwiają tworzenie funkcji zdefiniowanych przez użytkownika w językach innych niż SQL. Na przykład Microsoft SQL Server pozwala użytkownikowi używać w tym celu języków .NET, w tym C#. DB2 i Oracle obsługują funkcje zdefiniowane przez użytkownika napisane w językach programowania C lub Java.

SQL Server 2000

W programie Microsoft SQL Server 2000 istnieją trzy typy funkcji UDF : funkcje skalarne , wbudowane funkcje z wartościami przechowywanymi w tabeli i wielowyrazowe funkcje z wartościami w tabeli.

Funkcje skalarne zwracają pojedynczą wartość danych (nie tabelę) z klauzulą ​​RETURNS. Funkcje skalarne mogą używać wszystkich skalarnych typów danych, z wyjątkiem datownika i typów danych zdefiniowanych przez użytkownika. Wbudowane funkcje zwracające tabelę zwracają zestaw wyników pojedynczej instrukcji SELECT. Wieloinstrukcyjne funkcje zwracające tabelę zwracają tabelę, która została zbudowana przy użyciu wielu instrukcji TRANSACT-SQL.

Funkcje zdefiniowane przez użytkownika mogą być wywoływane z zapytania, takie jak funkcje wbudowane, takie jak OBJECT_ID, LEN, DATEDIFF, lub mogą być wykonywane za pomocą instrukcji EXECUTE, jak procedury składowane.

Uwagi dotyczące wydajności: 1. W Microsoft SQL Server 2000 funkcja z wartościami tabelarycznymi, która „zawija” widok, może być znacznie szybsza niż sam widok. Poniższa funkcja MyFunction jest przykładem "opakowania funkcji", które działa szybciej niż bazowy widok 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 Microsoft SQL Server 2005 wynik wykonania tego samego kodu jest odwrotny: widok jest wykonywany szybciej niż "funkcja-wrapper".

Funkcje zdefiniowane przez użytkownika to podprogramy składające się z co najmniej jednej instrukcji języka Transact-SQL, której można użyć do hermetyzacji kodu do ponownego użycia. Pobiera zero lub więcej argumentów i ocenia wartość zwracaną. Ma zarówno instrukcje przepływu sterowania, jak i DML w swoim ciele, podobnie jak procedury składowane. Nie zezwala na zmiany jakiegokolwiek stanu sesji globalnej, takie jak modyfikacje bazy danych lub zasobów zewnętrznych, takich jak plik lub sieć. Nie obsługuje parametru wyjściowego. Aby przekazać domyślną wartość parametru, należy określić słowo kluczowe DEFAULT. Błędy w UDF powodują przerwanie UDF, co z kolei przerywa instrukcję, która wywołała UDF.

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

Typ danych obsługiwany w Microsoft SQL Server 2000 Podobnie jak tabela tymczasowa używana do przechowywania wyników Używana głównie do definiowania zmiennej tymczasowej typu (tabela) i wartości zwracanej funkcji UDF Zakres jest ograniczony do funkcji, procedury składowanej lub partii, w której jest zdefiniowana Operacja przypisania nie jest dozwolona między zmiennymi (tabeli) Może być używany w funkcjach SELECT, INSERT, UPDATE i DELETE CREATE FUNCTION do tworzenia funkcji UDF ALTER FUNCTION do zmiany charakterystyki funkcji UDF DROP FUNCTION do usuwania funkcji UDF

Ula Apache

Apache Hive definiuje, oprócz zwykłych funkcji zdefiniowanych przez użytkownika (UDF), także funkcje agregujące zdefiniowane przez użytkownika (UDAF) i funkcje generujące tabele (UDTF). Hive umożliwia programistom tworzenie własnych niestandardowych funkcji w języku Java.

Bibliografia

Zewnętrzne linki