Sunteți pe pagina 1din 3

1.

Într-un bloc PL/SQL, folosind un cursor explicit, să se afișeze primele 3


comenzi care au cele mai multe produse comandate.

2. Utilizând o comandă SQL, creaţi o tabela numită Mesaje, având un câmp unic, de
tip Varchar2.

3. Scrieţi un bloc PL/SQL pentru a selecta codul comenzilor încheiate într-un an


introdus de la tastatură.

- Dacă interogarea returnează mai mult de o valoare pentru numărul comenzii,


tratați excepția cu o rutină de tratare corespunzătoare și inserați în tabela
MESAJE mesajul “Atenţie! In anul 2000 s-au încheiat mai multe comenzi!”.
- Dacă interogarea nu returnează nicio valoare pentru numărul comenzii, tratați
excepția cu o rutină de tratare corespunzătoare și inserați în tabela Mesaje
mesajul “Atenţie! In anul 2000 nu s-au încheiat comenzi!”.
- Dacă se returnează o singură linie, introduceți în tabela Mesaje numărul
comenzii.
- Tratați orice altă excepție cu o rutină de tratare corespunzătoare și inserați în
tabela MESAJE mesajul “A apărut o altă excepție!”.

--EXERCITIUL 2

CREATE TABLE Mesaje(prenume varchar2 (20))]

--EXERCITIUL 1

SET SERVEROUTPUT ON

DECLARE
CURSOR c IS
SELECT nr_comanda,count (id_produs) as produse from RAND_COMENZI

group by nr_comanda
order by PRODUSE desc;
T c%rowtype;

BEGIN
OPEN c;

LOOP
FETCH c INTO T;
DBMS_OUTPUT.PUT_LINE('nr.comanda:'||T.nr_comanda||'cantitate:'||T.produse);
EXIT WHEN c%ROWCOUNT=3;

END LOOP;
CLOSE c;
END;

---ex 3

SET SERVEROUTPUT ON
DECLARE
comenzi.nr_comanda%TYPE;
BEGIN
SELECT nr_comanda INTO V from COMENZI WHERE EXTRACT(YEAR FROM DATA)=&B-1;
DBMS_OUTPUT.PUT_LINE(V);
EXCEPTION WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('pREA MULTE INREGISTRARI');
when NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nici o comanda');
end;

Exerciții - săptămâna impară

--1. Construiți procedura Valoare_comenzi care să calculeze și să afișeze valoarea


fiecărei comenzi încheiate într-un an indicat ca parametru de intrare. Apelați
procedura.

--2. Construiți funcția Calcul_vechime care să returneze vechimea angajatului al


cărui id este dat ca parametru de intrare.

--3. Apelați funcția Calcul_vechime în cadrul unei proceduri, Vechime_angajati,


prin care se vor parcurge toți angajații, în scopul afișării vechimii fiecăruia.

--4. Construiți funcția Calcul_varsta_client care să returneze varsta clientului al


cărui id este dat ca parametru de intrare. Tratați cazul în care clientul indicat
nu există.

--5. Apelați funcția Calcul_varsta_client în cadrul unei proceduri,


Afisare_clienti, prin care se vor parcurge toți clienții, în scopul afișării
vârstei fiecăruia.

--1. Construi?i procedura Valoare_comenzi care s? calculeze ?i s? afi?eze valoarea


fiec?rei comenzi încheiate într-un an indicat ca parametru de intrare. Apela?i
procedura.

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE valoare_comenzi (p_an IN NUMBER) IS
CURSOR V IS SELECT co.nr_comanda,SUM(cantitate*pret) VAL FROM RAND_COMENZI r,
COMENZI co
where co.nr_comanda=r.nr_comanda AND extract(year from data)=p_an GROUP BY
co.nr_comanda;
BEGIN
FOR T in V LOOP
dbms_output.put_line('valoarea comenzii'||' '||T.nr_comanda||' '||' este de :'||'
'||T.val);
END LOOP;
END;
/
execute VALOARE_COMENZI(1999);

--2. Construi?i func?ia Calcul_vechime care s? returneze vechimea angajatului al


c?rui id este dat ca parametru de intrare.

SET SERVEROUTPUT ON
CREATE OR REPLACE FUNCTION calcul_vechime (p_id IN NUMBER) return number as
V_VECHIME NUMBER ;
begin
SELECT ROUND((SYSDATE-DATA_ANGAJARE)/365) INTO V_VECHIME FROM ANGAJATI WHERE
ID_ANGAJAT=P_ID;
RETURN V_VECHIME;
EXCEPTION
WHEN NO_DATA_FOUND THEN RETURN 0 ;
WHEN OTHERS THEN RETURN -1;
END;
/
EXECUTE calcul_vechime(195);

--3. Apelați funcția Calcul_vechime în cadrul unei proceduri, Vechime_angajati,


prin care se vor parcurge toți angajații, în scopul afișării vechimii fiecăruia

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE Vechime_Angajati
IS
CURSOR V IS SELECT * FROM angajati ;
BEGIN
FOR T IN V LOOP
DBMS_OUTPUT.PUT_LINE('ANGAJATUL CU ID-UL' ||T.ID_ANGAJAT||'ARE VECHIMEA DE:'||
calcul_vechime(T.id_angajat)||' '||'ANI');
END LOOP;
END;
/
EXECUTE vechime_angajati;

--4. Construiți funcția Calcul_varsta_client care să returneze varsta clientului


al cărui id este dat ca parametru de intrare. Tratați cazul în care clientul
indicat nu există.
create or replace function Calcul_varsta_client ( p_id clienti.id_client%TYPE)
RETURN NUMBER AS v_varsta NUMBER;
BEGIN
SELECT ROUND ((SYSDATE-data_nastere)/365) INTO v_varsta
FROM clienti
WHERE id_client=p_id;
return v_varsta;
EXCEPTION
WHEN NO_DATA_FOUND THEN RETURN 0;
WHEN OTHERS THEN RETURN -1;
END;
/

--5. Apelați funcția Calcul_varsta_client în cadrul unei proceduri,


Afisare_clienti, prin care se vor parcurge toți clienții, în scopul afișării
vârstei fiecăruia.
SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE AFISARE_CLIENTI IS cursor V is select* from CLIENTI ;
begin
for T in V loop
dbms_output.put_line('clientul cu id-ul' || T.id_client||'are varsta de' ||
calcul_varsta_client(T.id_client);
end loop;
end;
/
execute afisare_clienti;

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