Documente Academic
Documente Profesional
Documente Cultură
DECLARE
v_prel_categ soferi_XY.categ%TYPE;
v_tot NUMBER;
BEGIN
v_prel_categ:=UPPER('&dati_categoria');
v_tot:=total_categ(v_prel_categ);
DBMS_OUTPUT.PUT_LINE ('Totalul categoriei '||v_prel_categ||' este '||v_tot);
END;
/
Trecerea la cursor pentru a afisa totalul incasarilor fiecarei categorii; totalul fiecarei categorii se va calcula
repetitiv cu ajutorul functiei stocate total_categ care are ca argument o valoare din cursor; de asemenea, se va
realiza si un total general la sfarsitul tabelului calculat in doua moduri.
-pregatire SELECT
SELECT categ
FROM soferi_XY
GROUP BY categ;
sau
SELECT DISTINCT categ
FROM soferi_XY;
-procedura de calcul al totalului la fiecare categorie si obtinerea, in acelasi timp, si al totalului general.
CREATE OR REPLACE PROCEDURE calc_tot_categ_c1 AS
CURSOR c IS
SELECT DISTINCT categ
FROM soferi_XY;
v_calc NUMBER:=0;
v_tg NUMBER:=0;
BEGIN
FOR i IN c LOOP
v_calc:=total_categ(i.categ);
v_tg:=v_tg+v_calc;
DBMS_OUTPUT.PUT_LINE ('Totalul categoriei '||i.categ||' este '||v_calc);
END LOOP;
DBMS_OUTPUT.PUT_LINE ('--------------------------------------');
DBMS_OUTPUT.PUT_LINE ('Total general '||v_tg);
END;
/
EXECUTE calc_tot_categ_c1;
-Varianta a doua cu cap de tabel si calculul unui total general calculat intr-un SELECT separat;
CREATE OR REPLACE PROCEDURE calc_tot_categ_c2 AS
CURSOR c IS
SELECT DISTINCT categ
FROM soferi_XY;
v_calc NUMBER:=0;
v_tg NUMBER:=0;
BEGIN
DBMS_OUTPUT.PUT_LINE ('Cod categorie Total incasari');
FOR i IN c LOOP
v_calc:=total_categ(i.categ);
DBMS_OUTPUT.PUT_LINE (' '||i.categ||' '||v_calc);
END LOOP;
DBMS_OUTPUT.PUT_LINE ('--------------------------------------');
SELECT SUM(incasari) INTO v_tg
FROM curse_XY;
DBMS_OUTPUT.PUT_LINE ('Total general '||v_tg);
END;
/
EXECUTE calc_tot_categ_c2;
4. Intrucat oricare dintre soferi poate efectua curse cu oricare dintre vehiculele din parc, sa se afiseze totalul
incasarilor pe fiecare din combinatiile POSIBILE!! dintre soferi si vehicule, ordonate alfabetic dupa numele
soferilor si apoi dupa id_ul auto; daca acest total este zero, sa se afiseze un mesaj in care se precizeaza ca
acel sofer nu a efectuat curse cu acel vehicul.
RETURN v_tot_f;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
END;
/
Afisarea tuturor combinatiilor posibile--produs cartezian, relatie fara WHERE
SELECT codpers,id_auto,nume,nrauto
FROM soferi_XY,parc_XY
ORDER BY nume,id_auto;
Procedura de apelare a functiei de mai sus
EXECUTE list_inc;
CURSOR c1 IS
SELECT codpers,nume
FROM soferi_XY
ORDER BY nume;
v_trs_cod soferi_XY.codpers%TYPE;
CURSOR c2 IS
SELECT codpers,id_auto,nrauto
FROM soferi_XY,parc_XY
WHERE codpers=v_trs_cod
ORDER BY nume,id_auto;
v_total NUMBER;
contor NUMBER :=0;
v_tot_sof NUMBER :=0;
BEGIN
DBMS_OUTPUT.PUT_LINE (' Nume sofer Nr auto Suma');
DBMS_OUTPUT.PUT_LINE ('-------------------------------------------------------------');
FOR i IN c1 LOOP
DBMS_OUTPUT.PUT_LINE (' '||i.nume);
v_tot_sof:=0;
v_trs_cod:=i.codpers;
FOR j IN c2 LOOP
v_total:=total_sf_auto(j.codpers,j.id_auto);
IF v_total > 0 THEN
DBMS_OUTPUT.PUT_LINE (' '||j.nrauto||' '||v_total);
contor:=contor+1;
ELSE
DBMS_OUTPUT.PUT_LINE (' '||j.nrauto||' nu a efectuat curse');
END IF;
v_tot_sof:=v_tot_sof+v_total;
END LOOP;
DBMS_OUTPUT.PUT_LINE ('-------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE (' Total sofer '||v_tot_sof);
DBMS_OUTPUT.PUT_LINE ('-------------------------------------------------------------');
END LOOP;
DBMS_OUTPUT.PUT_LINE (' Combinatii realizate '||contor);
END;
/
EXECUTE list_inc_supl;
Obs:
Cand se utilizeaza doua cursoare interconectate, este necesara declararea unei variabile intre declararile celor
doua cursoare, variabila ce este utilizata pentru transferul valorii ce provine de la primul cursor si intervine in cel
de-al doilea cursor.