Sunteți pe pagina 1din 9

RECAPITULARE

Model subiect examen

1- Cerinta I: Tabele/diagrame
2 – Cerinta II: Triggers
3 – Cerinta III : Views
4 – Cerinta IV: Functii (scalar sau tabel)
5 – Cerinta V : Proceduri stocate/Cursor
CERINTA I.
Se dau următoarele tabele dintr-o bază de date pentru evidenţa clienţilor,
contractelor şi încasărilor la o firmă.
Se cunoaşte că, pentru fiecare contract, se pot întocmi unul sau mai multe
rapoarte privind situaţia lucrărilor în care se precizează: NrRaport, DataRaport,
Observatii privind stadiul lucrărilor şi suma solicitată.
Cerinţă: Adăugati tabelul/tabelele necesare şi modificaţi Diagrama de relaţii.
Restricţie: DataRaport trebuie să fie după 1 ianuarie 2008.
REZOLVARE – CERINTA 1
CERINTA II.

Realizaţi un trigger pe tabelul incasari, pentru operaţia de ştergere, pentru a nu se


putea şterge incasarile ce provin din contracte finalizate in anul 2007.

REZOLVARE

CREATE TRIGGER Cerinta2 ON Incasari for DELETE


AS
IF EXISTS(SELECT NrContract FROM DELETED
WHERE NrCONTRACT IN (SELECT NrContract FROM CONTRACTE
WHERE YEAR(DataFinalizare)=2007))
BEGIN
RAISERROR ('Nu se poate sterge', 18,1)
ROLLBACK TRANSACTION
END
CERINTA III.
Realizaţi un View pentru a calcula totalul încasărilor din anul 2007 pe fiecare
client. Pentru clienţii la care totalul incasarilor depaşeste 40.000 se va calcula
un BONUS de 2% din total incasari
Cerinta IV.
Realizaţi o funcţie de tip scalar care va calcula pe fiecare contract un
coeficient de importanţa în funcţie de valoarea contractului şi de anul in
care a fost incheiat contractul
- pentru contractele din anul 2007 cu valoare peste 60.000  coeficient 1
- pentru contractele din anul 2007 cu valoare sub 60.000  coeficient 2
- pentru contractele de dinainte de 2007  coeficient 3

REZOLVARE
CREATE FUNCTION Cerinta4(@datac as datetime, @Valoare as money)
RETURNS MONEY
AS
BEGIN
RETURN
CASE
WHEN YEAR(@DATAC)= 2007 AND @VALOARE >=60000 THEN 1
WHEN YEAR(@DATAC)= 2007 AND @VALOARE <60000 THEN 2
ELSE 3
END
END

Exemplu de utilizare:
SELECT NrContract, DataContract, Valoare, dbo.Cerinta4(DataContract, Valoare)
FROM CONTRACTE
Cerinta IV.
Realizaţi o funcţie de tip scalar care va calcula pe fiecare contract un
coeficient de importanţa în funcţie de valoarea contractului şi de anul in
care a fost incheiat contractul
- pentru contractele din anul 2007 cu valoare peste 60.000  coeficient 1
- pentru contractele din anul 2007 cu valoare sub 60.000  coeficient 2
- pentru contractele de dinainte de 2007  coeficient 3

REZOLVARE
CREATE FUNCTION Cerinta4(@datac as datetime, @Valoare as money)
RETURNS MONEY
AS
BEGIN
RETURN
CASE
WHEN YEAR(@DATAC)= 2007 AND @VALOARE >=60000 THEN 1
WHEN YEAR(@DATAC)= 2007 AND @VALOARE <60000 THEN 2
ELSE 3
END
END

Exemplu de utilizare:
SELECT NrContract, DataContract, Valoare, dbo.Cerinta4(DataContract, Valoare)
FROM CONTRACTE
Cerinta IV (exemplul 2).
Realizaţi o funcţie de tip tabelar care sa returneze numerele de contracte şi
numele clientilor pentru contractele dintr-un anumit an (Anul va fi specifact ca
argument al functiei)

REZOLVARE

CREATE FUNCTION ListaPeAn (@An as integer)


RETURNS @Tabel TABLE
(NrContract Integer, Client varchar(50) )
AS
BEGIN
INSERT @Tabel
SELECT NrContract, NumeFirma
FROM CLIENTI INNER JOIN CONTRACTE ON
CLIENTI.CodClient=CONTRACTE.CodClient
WHERE YEAR(DataContract)= @an

RETURN
END

Exemplu de utilizare:
SELECT * FROM ListaPeAn(2006)
Cerinta V. (exemplul 2)
Realizaţi o procedura stocată cu parametri pentru a realiza un clasament al
clientilor in functie de valoarea totala a contractelor. Se vor utiliza functiile
RANK sau ROW_NUMBER. Procedura va fi parametrizata pentru nu a afisa
decat clientii a caror valoare totala a contractelor depaseste o suma
specificata prin parametru.

REZOLVARE

CREATE PROC Clasament


@suma as money
AS
SELECT NUMEFIRMA, SUM(VALOARE) AS TOTAL,
RANK() OVER ( ORDER BY SUM(VALOARE) DESC)
FROM CLIENTI INNER JOIN CONTRACTE
ON CLIENTI.CODCLIENT= CONTRACTE.CODCLIENT
GROUP BY NUMEFIRMA
HAVING SUM(VALOARE)>@SUMA

Exemplu de utilizare:
EXEC Clasament 6000

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