Brukerdefinert funksjon - User-defined function

En brukerdefinert funksjon ( UDF ) er en funksjon levert av brukeren av et program eller miljø, i en kontekst der den vanlige antagelsen er at funksjoner er innebygd i programmet eller miljøet. UDFer er vanligvis skrevet for kravet til skaperen.

BASIC språk

I noen gamle implementeringer av BASIC programmeringsspråk defineres brukerdefinerte funksjoner ved bruk av "DEF FN" syntaks. Mer moderne dialekter av BASIC påvirkes av det strukturerte programmeringsparadigmet , der mest eller hele koden er skrevet som brukerdefinerte funksjoner eller prosedyrer, og konseptet blir praktisk talt overflødig.

Databaser

I relasjonsdatabasehåndteringssystemer gir en brukerdefinert funksjon en mekanisme for å utvide funksjonaliteten til databaseserveren ved å legge til en funksjon som kan evalueres i standard spørrespråk (vanligvis SQL ) setninger. De SQL standarden skiller mellom skalare og tabellfunksjoner. En skalarfunksjon returnerer bare en enkelt verdi (eller NULL ), mens en tabellfunksjon returnerer en (relasjonell) tabell som består av null eller flere rader, hver rad med en eller flere kolonner.

Brukerdefinerte funksjoner i SQL deklareres ved hjelp av CREATE FUNCTIONsetningen. For eksempel kan en funksjon som konverterer Celsius til Fahrenheit deklareres slik:

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

Når den er opprettet, kan en brukerdefinert funksjon brukes i uttrykk i SQL-setninger. For eksempel kan det påkalles der de fleste andre iboende funksjoner er tillatt. Dette inkluderer også SELECT -setninger , der funksjonen kan brukes mot data lagret i tabeller i databasen. Konseptuelt blir funksjonen evaluert en gang per rad ved slik bruk. Anta for eksempel en tabell med navn Elements, med en rad for hvert kjente kjemiske element. Tabellen har en kolonne med navnet BoilingPoint for kokepunktet til det elementet, i Celsius. Forespørselen

SELECT Name, CtoF(BoilingPoint)
  FROM Elements

ville hente navnet og kokepunktet fra hver rad. Den påkaller den brukerdefinerte funksjonen CtoF som deklarert ovenfor for å konvertere verdien i kolonnen til en verdi i Fahrenheit.

Hver brukerdefinerte funksjon har visse egenskaper eller egenskaper. SQL -standarden definerer følgende egenskaper:

  • Språk - definerer programmeringsspråket der den brukerdefinerte funksjonen er implementert; eksempler inkluderer SQL, C, C# og Java.
  • Parameterstil - definerer konvensjonene som brukes for å overføre funksjonsparametere og resultater mellom implementeringen av funksjonen og databasesystemet (gjelder bare hvis språket ikke er SQL).
  • Spesifikt navn - et navn på funksjonen som er unikt i databasen. Vær oppmerksom på at funksjonsnavnet ikke trenger å være unikt, med tanke på overbelastede funksjoner . Noen SQL -implementeringer krever at funksjonsnavn er unike i en database, og overbelastede funksjoner er ikke tillatt.
  • Determinisme - angir om funksjonen er deterministisk eller ikke. Determinismegenskapen har innflytelse på spørringsoptimereren når du kompilerer en SQL -setning.
  • SQL -datatilgang - forteller databasesystemet om funksjonen ikke inneholder SQL -setninger (INGEN SQL), inneholder SQL -setninger, men ikke får tilgang til noen tabeller eller visninger (CONTAINS SQL), leser data fra tabeller eller visninger (READS SQL DATA), eller endrer faktisk data i databasen (MODIFISERER SQL DATA).

Brukerdefinerte funksjoner skal ikke forveksles med lagrede prosedyrer . Lagrede prosedyrer lar brukeren gruppere et sett med SQL -kommandoer. En prosedyre kan godta parametere og utføre SQL -setningene avhengig av disse parameterne. En prosedyre er ikke et uttrykk og kan derfor ikke brukes som brukerdefinerte funksjoner.

Noen databasesystemer tillater opprettelse av brukerdefinerte funksjoner på andre språk enn SQL. Microsoft SQL Server , for eksempel, lar brukeren bruke .NET -språk inkludert C# for dette formålet. DB2 og Oracle støtter brukerdefinerte funksjoner skrevet på programmeringsspråk C eller Java.

SQL Server 2000

Det er tre typer UDF i Microsoft SQL Server 2000: skalarfunksjoner , innebygde tabellverdifunksjoner og flertrinns tabellverdifunksjoner.

Skalarfunksjoner returnerer en enkelt dataverdi (ikke en tabell) med RETURNS -leddet. Skalarfunksjoner kan bruke alle skalardatatyper, med unntak av tidsstempel og brukerdefinerte datatyper. Funksjoner med innebygde tabellverdier returnerer resultatsettet til en enkelt SELECT-setning. Multistatement-tabellverdifunksjoner returnerer en tabell, som ble bygget med mange TRANSACT-SQL-setninger.

Brukerdefinerte funksjoner kan påkalles fra en forespørsel som innebygde funksjoner som OBJECT_ID, LEN, DATEDIFF, eller kan utføres gjennom en EXECUTE-setning som lagrede prosedyrer.

Ytelsesnotater: 1. På Microsoft SQL Server 2000 kan en tabellverdi-funksjon som "ombryter" en visning være mye raskere enn selve visningen. Følgende MyFunction er et eksempel på en "funksjonsinnpakning" som kjører raskere enn den underliggende visningen 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. På Microsoft SQL Server 2005 er resultatet av den samme kodeutførelsen det motsatte: visningen kjøres raskere enn "funksjonsomslaget".

Brukerdefinerte funksjoner er underrutiner som består av en eller flere Transact-SQL-setninger som kan brukes til å kapsle kode for gjenbruk. Den tar null eller flere argumenter og evaluerer en returverdi. Har både kontrollflyt og DML-setninger i kroppen som ligner lagrede prosedyrer. Tillater ikke endringer i noen global sesjonstilstand, for eksempel endringer i databasen eller eksterne ressurser, for eksempel en fil eller et nettverk. Støtter ikke utdataparameter. STANDARD nøkkelord må angis for å passere standardverdien til parameteren. Feil i UDF får UDF til å avbryte, noe som igjen avbryter uttalelsen som påkalte 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

Datatype støttet i Microsoft SQL Server 2000 Som en midlertidig tabell som brukes til å lagre resultater Mest brukt til å definere midlertidig variabel av type (tabell) og returverdien til en UDF Omfanget er begrenset til funksjon, lagret prosedyre eller batch der den er definert Tildelingsoperasjon er ikke tillatt mellom (tabell) variabler Kan brukes i SELECT, INSERT, UPDATE og DELETE CREATE FUNCTION for å lage UDF ALTER FUNCTION for å endre egenskapene til UDF DROP FUNCTION for å fjerne UDF

Apache Hive

Apache Hive definerer, i tillegg til de vanlige brukerdefinerte funksjonene (UDF), også brukerdefinerte aggregatfunksjoner (UDAF) og tabellgenererende funksjoner (UDTF). Med Hive kan utviklere lage sine egne tilpassede funksjoner med Java.

Referanser

Eksterne linker