You are on page 1of 6

Laborator 7

Proceduri, exceptie si functie. Utilizare parametru de iesire. Definire si utilizare cursor.


1. CREAREA A TREI TABELE
Crearea tabelelor se regaseste in script.
2. COMPLETAREA CU DATE
Popularea tabelelor cu date se face se realizeaza
in ordinea „parinti”  „copii”.
Trebuie respectata ordinea si tipul campurilor.
BEGIN
....
Pentru a adauga datele mai rapid, instructiunile au fost
incadrate intr-o procedura.
END;
/
3. Determinarea si afisarea sumei creditelor obtinute la o anumita disciplina de catre toti studentii
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) AS totalcredite
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
-LIMITAREA LA O INREGISTRARE
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) AS totalcredite
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4 AND disc_XY.cod_disc=120
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
-ACTIVAREA AFISARII REZULTATELOR PROCEDURILOR
SET SERVEROUTPUT ON;
-PORNIND DE LA ACEASTA INTEROGARE, VOM CREA PROCEDURI A CAROR COMPLEXIATAE VA CRESTE GRADUAL
-procedura nestocata
DECLARE
v_cod_disc disc_XY.cod_disc%TYPE;
v_den_disc disc_XY.den_disc%TYPE;
v_total NUMBER;
BEGIN
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) INTO v_cod_disc, v_den_disc, v_total
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4 AND disc_XY.cod_disc=120
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
DBMS_OUTPUT.PUT_LINE ('La disciplina cu codul '||v_cod_disc||' denumita '||v_den_disc||' s-au obtinut
'||v_total||' credite');
END;
/
-transformarea in procedura stocata

CREATE OR REPLACE PROCEDURE calc_crdt1 IS


v_cod_disc disc_XY.cod_disc%TYPE;
v_den_disc disc_XY.den_disc%TYPE;
v_total NUMBER;
BEGIN
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) INTO v_cod_disc, v_den_disc, v_total
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4 AND disc_XY.cod_disc=120
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
DBMS_OUTPUT.PUT_LINE ('La disciplina cu codul '||v_cod_disc||' denumita '||v_den_disc||' s-au obtinut
'||v_total||' credite');
END;
/

EXECUTE calc_crdt1;
-transformarea in procedura stocata cu parametru
CREATE OR REPLACE PROCEDURE calc_crdt1_p (p_cod disc_XY.cod_disc%TYPE) IS
v_cod_disc disc_XY.cod_disc%TYPE;
v_den_disc disc_XY.den_disc%TYPE;
v_total NUMBER;
BEGIN
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) INTO v_cod_disc, v_den_disc, v_total
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4 AND disc_XY.cod_disc=p_cod
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
DBMS_OUTPUT.PUT_LINE ('La disciplina cu codul '||v_cod_disc||' denumita '||v_den_disc||' s-au obtinut
'||v_total||' credite');
END;
/

-APELAREA PROCEDURII CU PARAMETRU IN DIVERSE VARIANTE

-apelare directa
EXECUTE calc_crdt1_p(110);
EXECUTE calc_crdt1_p(&dati_codul);

-apelare dintr-o procedura nestocata – nu se mai utilizeaza EXECUTE


BEGIN
calc_crdt1_p(110);
END;
/
BEGIN
calc_crdt1_p(&dati_codul);
END;
/

-apelare dintr-o procedura nestocata, cu memorarea si utilizarea raspunsului de la tastatura

DECLARE
v_slct_cod disc_XY.cod_disc%TYPE;
BEGIN
v_slct_cod:=&dati_codul;
DBMS_OUTPUT.PUT_LINE ('Situatia disciplinei cu codul '||v_slct_cod);
calc_crdt1_p(v_slct_cod);
END;
/

-OBS - numele variabilelor, parametrilor din procedura apelanta nu sunt legate de denumirile variabilelor si
parametrilor din procedura apelata
-sa se modifice procedura de mai sus, astfel incat sa cuprinda si situatia in care este comunicat un cod gresit.

CREATE OR REPLACE PROCEDURE calc_crdt1_p_ex (p_cod disc_XY.cod_disc%TYPE) IS


v_cod_disc disc_XY.cod_disc%TYPE;
v_den_disc disc_XY.den_disc%TYPE;
v_total NUMBER;
BEGIN
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) INTO v_cod_disc, v_den_disc, v_total
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4 AND disc_XY.cod_disc=p_cod
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
DBMS_OUTPUT.PUT_LINE ('La disciplina cu codul '||v_cod_disc||' denumita '||v_den_disc||' s-au obtinut
'||v_total||' credite');
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.PUT_LINE ('Nu exista disciplina ');
END;
/
-apelare prodecurii este identica, doar ca acum poate acoperi si situatia unui cod eronat

DECLARE
v_slct_cod disc_XY.cod_disc%TYPE;
BEGIN
v_slct_cod:=&dati_codul;
DBMS_OUTPUT.PUT_LINE ('Situatia disciplinei cu codul '||v_slct_cod);
calc_crdt1_p_ex(v_slct_cod);
END;
/
-transformarea procedurii calc_crdt1_p in functie si utilizarea informatiei pe care o returneaza functia
CREATE OR REPLACE FUNCTION f_calc_crdt1_p (p_cod disc_XY.cod_disc%TYPE) RETURN NUMBER IS
v_cod_disc disc_XY.cod_disc%TYPE;
v_den_disc disc_XY.den_disc%TYPE;
v_total NUMBER;
BEGIN
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) INTO v_cod_disc, v_den_disc, v_total
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4 AND disc_XY.cod_disc=p_cod
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
DBMS_OUTPUT.PUT_LINE ('La disciplina cu codul '||v_cod_disc||' denumita '||v_den_disc||' s-au obtinut
'||v_total||' credite');
RETURN v_total;
END;
/
-apelarea functiei se poate face doar dintr-o procedura sau alta functie si presupune definirea unei variabile care
sa preia rezultatul returnat de functie, in situatia aceasta totalul de credite.

DECLARE
v_slct_cod disc_XY.cod_disc%TYPE;
v_prel_tot NUMBER;
BEGIN
v_slct_cod:=&dati_codul;
DBMS_OUTPUT.PUT_LINE ('Situatia disciplinei cu codul '||v_slct_cod);
v_prel_tot:=f_calc_crdt1_p(v_slct_cod);
DBMS_OUTPUT.PUT_LINE ('Aici se afiseaza totalul de '||v_prel_tot||' credite returnat de functie');
END;
/
-daca se doreste ca rezultatul totalului de credite sa fie extras din procedura, este necesar ca procedura sa aiba
parametru de iesire; punctul de pornire va fi tot procedura calc_crdt1_p

CREATE OR REPLACE PROCEDURE calc_crdt1_p_io (p_cod disc_XY.cod_disc%TYPE, p_ies_tot OUT NUMBER) IS


v_cod_disc disc_XY.cod_disc%TYPE;
v_den_disc disc_XY.den_disc%TYPE;
v_total NUMBER;
BEGIN
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) INTO v_cod_disc, v_den_disc, v_total
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4 AND disc_XY.cod_disc=p_cod
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
DBMS_OUTPUT.PUT_LINE ('La disciplina cu codul '||v_cod_disc||' denumita '||v_den_disc||' s-au obtinut
'||v_total||' credite');
p_ies_tot:=v_total;
END;
/
-apelarea procedurii cu parametru de iesire seamana cu apelarea unei functii, in sensul ca presupune definirea unei
variabile care sa preia rezultatul (totalul de credite in acest caz) care "paraseste" procedura prin intermediul
parametrului de iesire

DECLARE
v_slct_cod disc_XY.cod_disc%TYPE;
v_prel_tot NUMBER;
BEGIN
v_slct_cod:=&dati_codul;
DBMS_OUTPUT.PUT_LINE ('Situatia disciplinei cu codul '||v_slct_cod);
calc_crdt1_p_io(v_slct_cod,v_prel_tot);
DBMS_OUTPUT.PUT_LINE ('Aici se afiseaza totalul de '||v_prel_tot||' credite returnat de procedura cu parametru
de iesire');
END;
/

4. Afisarea situatiei totalurilor de credite la toate disciplinele. Utilizarea cursorului

Pornind de la interogarea ititiala, se construieste procedura care utilizeza cursorul.


CREATE OR REPLACE PROCEDURE calc_crdt1_cs IS
CURSOR c IS
SELECT disc_XY.cod_disc, den_disc, SUM(nr_credite) AS totalcredite
FROM disc_XY INNER JOIN ex_XY ON disc_XY.cod_disc=ex_XY.cod_disc
WHERE nota>4
GROUP BY disc_XY.cod_disc, den_disc
ORDER BY 1;
BEGIN
DBMS_OUTPUT.PUT_LINE ('Cod disciplina Denumire disciplina Numar credite');
FOR i IN c LOOP
DBMS_OUTPUT.PUT_LINE (' '||i.cod_disc||' '||i.den_disc||' '||i.totalcredite);
END LOOP;
END;
/

EXECUTE calc_crdt1_cs;
TEMA
SA SE SCRIE O INTEROGARE CARE SA AFISEZE

coddisc, dendisc, cea_mai_mare_nota, nr_studenti_participanti

SA SE AFISEZE ACEASTA SITUATIE UTILIZAND O PROCEDURA STOCATA CU CURSOR, CONFORM MODELULUI DIN
SEMINAR.

PORNIND TOT DE LA INTEROGAREA INITIALA, SA SE TRANSFORME IN INTEROGARE PENTRU O DISCIPLINA IAR APOI
SA SE CONSTRUIASCA PROGRESIV PROCEDURILE DE AFISARE CU PARAMETRU, CU FUNCTIE, CONFORM
SEMINARULUI, PRECUM SI PROCEDURILE ANONIME DE APELARE ALE ACESTORA.

SUPLIMENTAR, LA VARIANTA CU PARAMETRU DE IESIRE SAU LA VARIANTA CU FUNCTIE, IN UNA DIN PROCEDURILE
APELANTE SA SE AFISEZE, DUPA CAZ, MESAJUL

La disciplina cu codul ... au / nu au participat toti studentii.

RASPUNSURILE SE POSTEAZA PE PLATFORMA IN SECTIUNEA DEDICATA.

TERMEN 30.04.2023!!

You might also like