Sunteți pe pagina 1din 12

Functii

Definitie
• O funcţie SQL, definită de utilizator, grupează in
cadrul unui obiect SQL de sine stătător o secvenţă de
instrucţiuni SQL încapsulată, ce poate fi reutilizată ori
de câte ori este nevoie, in cadrul altor obiecte SQL
Server
Tipuri de functii
În funcţie de tipul de rezultat returnat, funcţiile definite de utilizatori
pot fi clasificate în două mari categorii:
1. Funcţii de tip scalar (scalar functions) – care returnează o valoare ce
poate fi încadrată în unul dintre tipurile de date SQL Server (de ex. char,
varchar, numeric, datetime, etc.)
2. Funcţii de tip tabelar (table valued functions) – care returnează un
set de înregistrări ce poate fi asimilat unui tabel virtual.
Funcţii de tip scalar (scalar functions)
• Funcţiile definite de utilizatori au rolul de a returna un rezultat,
calculat conform unui algoritm descris de utilizator.
• Sintaxa
CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName>
(
-- Add the parameters for the function here
<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
)
RETURNS <Function_Data_Type, ,int>
AS
BEGIN
-- Declare the return variable here
DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>

-- Add the T-SQL statements to compute the return value here


SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>

-- Return the result of the function


RETURN <@ResultVar, sysname, @Result>

END
GO
Exemplu
--1 Sa se creeze o functie care afiseaza numele si prenumele dat
Create FUNCTION [dbo].[Scrienumele]()
RETURNS nvarchar(100)
AS
BEGIN
RETURN N'Popescu Emilian'
END

--APELARE FUNCTIE
--a
PRINT dbo.Scrienumele();
--b
use delia
go
Select CodISBN,Dencarte,DataAparitie, dbo.Scrienumele() as Numeutilizator
From Carti;
Exemplu
--2 Se doreşte sa se realizeze o funcţie pentru a calcula câte săptămâni au trecut de la data maxima de aparitie a cartii, pentru
fiecare carte Pentru cartile care nu au data aparitie, funcţia va returna valoarea 0
CREATE FUNCTION Calcul2 (@CodISBNnou as int)
RETURNS int
AS
BEGIN
DECLARE @DataAparitienoua as datetime
SET @DataAparitienoua = (SELECT max(DataAparitie)
FROM CARTI
WHERE CodISBN=@CodISBNnou)
RETURN
CASE
WHEN @DataAparitienoua>=GETDATE() THEN 0
ELSE Datediff(week, @DataAparitienoua, getdate())
END
END

--APELARE FUNCTIE
SELECT CodISBN, DenCarte, DataAparitie,dbo.Calcul2(CodISBN) as [cod nou]
FROM Carti
WHERE CodISBN>1930
Funcţii de tip tabelar (table valued functions)
• Funcţiile de tip tabelar se diferenţiază de cele de tip scalar prin faptul
că returnează un set de date sub forma unui tabel bidimensional
conform modelului relaţional.
• Având în vedere faptul că sunt asimilate tabelelor (virtuale), pot fi
utilizate în cadrul unei fraze SQL, similar modului cum sunt utilizate
tabelele bazei de date.
• Datele rezultate nu sunt memorate sub forma unui tabel în baza de
date, ci sunt obţinute dinamic la fiecare apel al funcţiei – similar
obiectelor de tip View. Diferenţa majoră faţă de acestea constă în
posibilitatea utilizării parametrilor în cadrul funcţiilor, conferindu-le
un grad ridicat de flexibilitate.
A) varianta INLINE (Inline Table Valued)
• se returnează un tabel ca rezultat, fără a fi nevoie sa se definească structura acestuia. În această variant,

nu sunt permise BEGIN ….END, ci doar o frază SQL de tip SELECT, rezultatele fiind furnizate sub forma unui

tabel. Fiecare câmp din interogarea sursă trebuie să aibă un nume, ceea ce înseamnă că expresiile cu mai

mulţi operanzi trebuie sa aibă neapărat un alias.


• În această variantă de utilizare, utilizarea clauzei ORDER BY este permisă numai dacă se utilizează

împreună cu TOP în instrucţiunea SELECT. Nu sunt permise prelucrări complexe.


• Sintaxa
CREATE FUNCTION [numepropritar.] nume_funcţie ([ @parametru_1 AS tip_de_date],
…. [ @parametrul_n AS tip_de_date] )
RETURNS TABLE
As
RETURN (fraza_SQL_SELECT)
EXEMPLU
--3. Realizaţi o funcţie prin intermediul căreia să se determine care sunt primii 10 clienţi cu
cele mai multe facturi. Funcţia va returna numărul de facturi.
CREATE FUNCTION CLIENTI_majoritari()
RETURNS TABLE
AS
RETURN (SELECT top 10 CodFiscal, COUNT(CodFiscal) as numar
FROM Client
GROUP BY CodFiscal
ORDER BY COUNT(CodFiscal) DESC)

--Apelare functie
SELECT CodFiscal, DenClient, Adresa
FROM Client
WHERE CLIENT.CodFiscal IN (SELECT CodFiscal FROM CLIENTI_majoritari() )
B) varianta MULTIINSTRUCŢIUNE
(Multi Statement Table Valued)
• se returnează un tabel rezultat, fiind necesară şi definirea structurii acestuia. Faţă de varianta A, această
categorie poate să includă prelucrări complexe.
• Sintaxa
CREATE FUNCTION [numepropritar.] nume_funcţie ([ @parametru_1 AS tip_de_date],
…. [ @parametrul_n AS tip_de_date] )
RETURNS @variabila_output TABLE
(câmp_1 tip de date, …
câmp_N tip de date)
AS
BEGIN
INSTRUCŢIUNI SQL
RETURN
END
EXEMPLU
--4 Sa se creeze functia care accepta ca intrare parametrul localitate
--si returneaza Id si nume pentru toti clientii introdusi prin parametrul de intrare
-- Daca nu exista valori se va afisa mesaj de atentionare
USE Delia
GO
CREATE FUNCTION Autoripelocalitate12
( @loc nvarchar(50) )
RETURNS
@Autoriloc table (
autori_id nVarchar(50),
autori_nume nchar(50)
)
AS
BEGIN
INSERT INTO @Autoriloc
SELECT CodFiscal,DenClient
FROM Client
WHERE Localitate = @loc
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO @Autoriloc
VALUES ('','Nu exista autori din localitatea ceruta')
END
RETURN
END
GO
--Apelare functie
SELECT * FROM Autoripelocalitate12('BUCURESTI')

S-ar putea să vă placă și