Redigerer
Brukerdefinert funksjon
Hopp til navigering
Hopp til søk
Advarsel:
Du er ikke innlogget. IP-adressen din vil bli vist offentlig om du redigerer. Hvis du
logger inn
eller
oppretter en konto
vil redigeringene dine tilskrives brukernavnet ditt, og du vil få flere andre fordeler.
Antispamsjekk.
Ikke
fyll inn dette feltet!
En '''brukerdefinert funksjon'''<ref>{{Kilde www|url=https://www.uio.no/studier/emner/matnat/ifi/INF3100/v12/undervisningsmateriale/lysark/kap10_3-5_postgres.pdf|tittel=INF3100 Databasesystemer, Universitetet i Oslo, 2012-04-17, Ellen Munthe-Kaas}}</ref><ref>{{Kilde www|url=http://www.ia.hiof.no/~elinkaan/databaser/2005/eksempler/postgres/rep8_funksjoner.html|tittel=Brukerdefinerte funksjoner - elinkaan}}</ref> er en [[Underrutine|funksjon]] skrevet av brukeren av et program. Begrepet brukes gjerne i forbindelser hvor den vanlige antakelsen er at de nødvendige funksjonene allerede er innebygd i programmet. Brukerdefinerte funksjoner skrives som regel på grunn av at programmøren har spesielle behov. == BASIC-språket == I noen gamle implementeringer av programmeringsspråket [[BASIC]] lages brukerdefinerte funksjoner definert ved hjelp syntaksen "DEF FN". Nyere dialekter av BASIC har blitt påvirket av det [[Strukturert programmering|strukturerte programmeringsparadigmet]] hvor enten det meste eller alt av kode er skrevet med brukerdefinerte funksjoner eller prosedyrer, og konseptet blir dermed praktisk talt overflødig. == COBOL-språket == I programmeringsspråket [[COBOL]] er en brukerdefinert funksjon en [[Entitet (informatikk)|entitet]] som defineres av brukeren ved å spesifisere et FUNCTION ID-avsnitt. En brukerdefinert funksjon må returnere en verdi ved å spesifisere RETURNING-frasen til prosedyrens divisjonshode, og disse kalles med funksjonsidentifikator-syntaksen. Standarden ISO/IEC 1989:2014 Programming Language COBOL har flere detaljer. Fra og med 2022 mai har kompilatoren IBM Enterprise COBOL for z/OS 6.4 ([[IBM COBOL]]) støtte for brukerdefinerte funksjoner. == Databaser == I [[databasehåndteringssystem]] for [[Relasjonsdatabase|relasjonsdatabaser]] (RDMBS-er) gir brukerdefinerte funksjoner en mekanisme for å utvide funksjonaliteten til en [[databasetjener]] ved å legge til en funksjon som kan evalueres i standarduttrykk i spørrespråk (vanligvis [[Structured Query Language|SQL]]). [[ISO/IEC 9075|SQL-standarden]] skiller mellom [[Skalar (databehandling)|skalare]] og [[Tabulare data|tabulare]] funksjoner. En skalarfunksjon returnerer bare én enkelt verdi (eller [[NULL]]), mens en tabellfunksjon returnerer en (relasjonell) tabell som består av ingen eller flere rader, og hvor hver rad har én eller flere kolonner. Brukerdefinerte funksjoner i SQL deklareres ved hjelp av <code>CREATE FUNCTION</code>-uttrykket. For eksempel kan en brukerdefinert funksjon som konverterer [[Grad celsius|celsius]] til [[Grad fahrenheit|fahrenheit]] (en temperaturskala som brukes I USA) deklareres slik:<syntaxhighlight lang="sql"> CREATE FUNCTION dbo.CtoF(Celsius FLOAT) RETURNS FLOAT RETURN (Celsius * 1.8) + 32 </syntaxhighlight>Når en brukerdefinert funksjon er opprettet kan den brukes i [[Uttrykk (programmering)|uttrykk]] i SQL-setninger. For eksempel kan den kalles de fleste steder hvor andre innebygde funksjoner er tillatt. Dette inkluderer [[Select (SQL)|SELECT-uttrykk]], hvor funksjonen kan brukes mot data lagret i tabeller i databasen. Ved slik bruk blir funksjonen konseptuelt evaluert en gang per rad. For eksempel kan man anta en tabell som heter {{Kode|Elements}} med én rad for hvert kjente grunnstoff. Tabellen har en kolonne som heter BoilingPoint for kokepunktet til hvert element oppgitt i celsius. Den følgende spørringen:<syntaxhighlight lang="sql"> SELECT Name, CtoF(BoilingPoint) FROM Elements </syntaxhighlight>vil returnere navn og kokepunkt for hver rad. Den kaller den brukerdefinerte <code>CtoF</code>-funksjonen som deklarert ovenfor, og vil konvertere verdien i kolonnen til en verdi i fahrenheit. Hver brukerdefinerte funksjon har visse egenskaper eller karakteristikker. 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 til å overføre funksjonsparametrene og resultatene 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. Merk at funksjonsnavnet ikke trenger å være unikt med tanke på [[Overdefinert funksjon|overdefinerte 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. Determinisme-karakteristikken har innflytelse på [[spørreoptimering]] når en SQL-setning kompileres. * SQL-datatilgang: Forteller databasestyringssystemet om funksjonen ikke inneholder noen SQL-setninger (NO SQL), eller inneholder SQL-setninger men ikke får tilgang til noen tabeller eller [[Visning (database)|visninger]] (CONTAINS SQL), eller leser data fra tabeller eller visninger (READS SQL DATA), eller faktisk endrer data i databasen (MODIFIES SQL DATA). === Sammenlignet med lagrede prosedyrer === Brukerdefinerte funksjoner må ikke forveksles med [[Lagret prosedyre|lagrede prosedyrer]]. En lagret prosedyre lar brukeren gruppere en mengde av SQL-kommandoer, og de kan motta parametere og utføre SQL-setninger som avhenger av disse parametrene. En prosedyre er ikke et uttrykk, og (lagrede prosedyrer) kan derfor ikke brukes som brukerdefinerte funksjoner. === Andre språk === Noen databasestyringssystemer tillater at det opprettes brukerdefinerte funksjoner på andre språk enn SQL. For eksempel lar [[Microsoft SQL Server]] brukeren bruke [[.NET|.NET-språk]] inkludert [[C Sharp|C#]] for dette formålet. DB2 og Oracle støtter brukerdefinerte funksjoner skrevet i [[C (programmeringsspråk)|C]] eller [[Java (programmeringsspråk)|Java]]. ==== SQL Server 2000 ==== I [[Microsoft SQL Server]] 2000 er det 3 typer brukerdefinerte funksjoner: [[Skalarfelt|Skalarfunksjoner]], innebygde tabellfunksjoner og fleruttrykks tabellfunksjoner. * Skalarfunksjoner returnerer en enkelt dataverdi (ikke en tabell) med RETURNS-klausulen. De kan bruke alle skalare datatyper, med unntak av [[tidsstempel]] og brukerdefinerte datatyper. * Innebygde tabellfunksjoner returnerer [[resultatmengde]]n av en enkelt SELECT-uttrykk/setning{{Klargjør}} * Fleruttrykks tabellfunksjoner returnerer en tabell som har blitt bygget med mange TRANSACT-SQL-uttrykk/setninger{{Klargjør}} Brukerdefinerte funksjoner kan kalles fra en spørring lik som for innebygde funksjoner som OBJECT_ID(), LEN() og DATEDIFF(), eller kan kjøres via en EXECUTE-setning som lagrede prosedyrer. På Microsoft SQL Server 2000 kan ytelsen til tabellfunksjoner som "pakker" en visning være mye raskere enn selve visningen. Deb følgende funksjonen MyFunction er et eksempel på en funksjonsinnpakning som går raskere enn den underliggende visningen MyView:<syntaxhighlight lang="tsql"> 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 </syntaxhighlight>På Microsoft SQL Server 2005 er derimot resultatet av den samme kodeutførelsen motsatte: Visningen utføres raskere enn funksjonsinnpakningen. Brukerdefinerte funksjoner i Microsoft SQL er [[Underrutine|underrutiner]] laget av en eller flere Transact-SQL-setninger som kan brukes til å innkapsle kode for gjenbruk. * Den tar ingen eller flere argumenter og evaluerer en returverdi * Inneholder både [[kontrollflyt]]- og [[Data manipulation language|DML]]-uttrykk som ligner på lagrede prosedyrer * Tillater ikke endringer i globale øktstatuser, eksempelvis endringer i databaseressurser eller eksterne ressurser som en fil eller et nettverk * Støtter ikke utputtparametre * DEFAULT-nøkkelordet må spesifiseres for å overføre standardverdiern til parameteren * Feil i brukerdefinerte funksjoner får brukerdefinerte funksjoner til å avbrytes, som igjen avbryter uttrykket som kalte den brukerdefinerte funksjonen <syntaxhighlight lang="tsql"> 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 </syntaxhighlight>Datatyper som støttes i Microsoft SQL Server 2000: * Som en midlertidig tabell som brukes til å lagre resultater * Mest brukt til å definere midlertidige variabler av type (tabell) og returverdien til en brukerdefinerte funksjon. * Omfanget er begrenset til funksjon, lagret prosedyre eller satsen der den er definert * Tildelingsoperasjon er ikke tillatt mellom (tabell)variabler * Kan brukes i SELECT, INSERT, UPDATE og DELETE * CREATE FUNCTION brukes for å opprette en brukerdefinert funksjon * ALTER FUNCTION brukes for å endre egenskapene til en brukerdefinert funksjon * DROP FUNCTION brukes for å fjerne en brukerdefinert funksjon ==== Apache Hive ==== [[Apache Hive]] definerer, i tillegg til de vanlige brukerdefinerte funksjoner, også brukerdefinerte ''aggregerte'' funksjoner (UDAF) og ''tabellgenererende'' funksjoner (UDTF).<ref> {{Kilde www|url=https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF|tittel=LanguageManual UDF - Apache Hive - Apache Software Foundation|fornavn=|etternavn=|forlag=}} </ref> Hive gjør det mulig for utviklere å lage sine egne tilpassede funksjoner med Java.<ref> {{Kilde www|url=https://cwiki.apache.org/confluence/display/Hive/HivePlugins|tittel=HivePlugins - Apache Hive - Apache Software Foundation|fornavn=|etternavn=|forlag=}} </ref> ==== Apache Doris ==== Apache Doris, en [[Åpen kildekode|åpent kildekodet]] [[Online analytisk prosessering|sanntidsanalytisk database]], lar eksterne brukere bidra med sine egne brukerdefinerte funksjoner til databasen.<ref>{{Kilde www|url=https://doris.apache.org/docs/dev/ecosystem/udf/contribute-udf?_highlight=udf|tittel=Apache Doris UDF|besøksdato=8. april 2023|arkiv-dato=2023-04-10|arkiv-url=https://web.archive.org/web/20230410141729/https://doris.apache.org/docs/dev/ecosystem/udf/contribute-udf/?_highlight=udf|url-status=yes}}</ref> == Referanser == <references/> {{SQL}} [[Kategori:SQL]] [[Kategori:Databaser]]
Redigeringsforklaring:
Merk at alle bidrag til Wikisida.no anses som frigitt under Creative Commons Navngivelse-DelPåSammeVilkår (se
Wikisida.no:Opphavsrett
for detaljer). Om du ikke vil at ditt materiale skal kunne redigeres og distribueres fritt må du ikke lagre det her.
Du lover oss også at du har skrevet teksten selv, eller kopiert den fra en kilde i offentlig eie eller en annen fri ressurs.
Ikke lagre opphavsrettsbeskyttet materiale uten tillatelse!
Avbryt
Redigeringshjelp
(åpnes i et nytt vindu)
Maler som brukes på denne siden:
Mal:Fix
(
rediger
)
Mal:Fix/category
(
rediger
)
Mal:Hlist/styles.css
(
rediger
)
Mal:ISOtilNorskdato
(
rediger
)
Mal:Ifsubst
(
rediger
)
Mal:Kilde www
(
rediger
)
Mal:Klargjør
(
rediger
)
Mal:Kode
(
rediger
)
Mal:Navbox
(
rediger
)
Mal:SQL
(
rediger
)
Modul:Arguments
(
rediger
)
Modul:Citation/CS1
(
rediger
)
Modul:Citation/CS1/COinS
(
rediger
)
Modul:Citation/CS1/Configuration
(
rediger
)
Modul:Citation/CS1/Date validation
(
rediger
)
Modul:Citation/CS1/Identifiers
(
rediger
)
Modul:Citation/CS1/Utilities
(
rediger
)
Modul:Citation/CS1/Whitelist
(
rediger
)
Modul:ISOtilNorskdato
(
rediger
)
Modul:Navbar
(
rediger
)
Modul:Navbar/configuration
(
rediger
)
Modul:Navbar/styles.css
(
rediger
)
Modul:Navbox
(
rediger
)
Modul:Navbox/configuration
(
rediger
)
Modul:Navbox/styles.css
(
rediger
)
Modul:TableTools
(
rediger
)
Navigasjonsmeny
Personlige verktøy
Ikke logget inn
Brukerdiskusjon
Bidrag
Opprett konto
Logg inn
Navnerom
Side
Diskusjon
norsk bokmål
Visninger
Les
Rediger
Rediger kilde
Vis historikk
Mer
Navigasjon
Forside
Siste endringer
Tilfeldig side
Hjelp til MediaWiki
Verktøy
Lenker hit
Relaterte endringer
Spesialsider
Sideinformasjon