Professional Documents
Culture Documents
Lab 07
Lab 07
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;
/
-apelare directa
EXECUTE calc_crdt1_p(110);
EXECUTE calc_crdt1_p(&dati_codul);
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.
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
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;
/
EXECUTE calc_crdt1_cs;
TEMA
SA SE SCRIE O INTEROGARE CARE SA AFISEZE
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
TERMEN 30.04.2023!!