Sunteți pe pagina 1din 4

Laborator 10

Alte exemple de blocuri de proceduri si functii. Utilizarea unor variabile de tip obiect predefinit.
Vom realiza diverse proceduri si functii, deci avem nevoie de activarea afisarii.
SET SERVEROUTPUT ON;
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. Crearea si utilizarea comparativa a unei proceduri cu doi parametrii de iesire versus o functie cu un
parametru de iesire.

Interogari pregatitoare
SELECT EXTRACT(MONTH FROM data_cursa) AS luna, SUM(incasari), COUNT(id_cursa)
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa);
SELECT EXTRACT(MONTH FROM data_cursa) AS luna, SUM(incasari), COUNT(id_cursa)
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa)
HAVING EXTRACT(MONTH FROM data_cursa)=1;
SELECT SUM(incasari), COUNT(id_cursa)
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa)
HAVING EXTRACT(MONTH FROM data_cursa)=1;
Preluarea interogarii in functie de unde incercam sa returnam doua valori
CREATE OR REPLACE FUNCTION sit_lun_f1 (p_luna NUMBER) RETURN NUMBER AS
v_tot_inc NUMBER;
v_nrc NUMBER;
BEGIN
SELECT SUM(incasari), COUNT(id_cursa) INTO v_tot_inc,v_nrc
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa)
HAVING EXTRACT(MONTH FROM data_cursa)=p_luna;
RETURN v_tot_inc;
RETURN v_nrc;
END;
/
Utilizarea functiei
DECLARE
v_prel_luna NUMBER;
v1 NUMBER;
v2 NUMBER;
BEGIN
v_prel_luna:=&dati_luna;
v1:=sit_lun_f1(v_prel_luna);
v2:=sit_lun_f1(v_prel_luna);
DBMS_OUTPUT.PUT_LINE ('Totalul lunii '||v_prel_luna||' este '||v1||' iar numarul de curse este '||v2);
END;
/

Se observa ca nu se poate extrage decat


o informatie.
Pentru a extrage doua sau mai multe informatii,
o prima varianta este de a tranforma functia intr-o
functie cu parametru de iesire.

CREATE OR REPLACE FUNCTION sit_lun_f2 (p_luna NUMBER, p_nrc OUT NUMBER) RETURN NUMBER AS
v_tot_inc NUMBER;
BEGIN
SELECT SUM(incasari), COUNT(id_cursa) INTO v_tot_inc,p_nrc
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa)
HAVING EXTRACT(MONTH FROM data_cursa)=p_luna;
RETURN v_tot_inc;
END;
/
Utilizarea functiei
DECLARE
v_prel_luna NUMBER;
v1 NUMBER;
v2 NUMBER;
BEGIN
v_prel_luna:=&dati_luna;
v1:=sit_lun_f2(v_prel_luna, v2);
DBMS_OUTPUT.PUT_LINE ('Totalul lunii '||v_prel_luna||' este '||v1||' iar numarul de curse este '||v2);
END;
/
O alta metoda prin care se pot obtine doua sau mai multe valori din apelarea unei functii, este prin definirea unui
nou tip de variabila obiect care sa incapsuleze in campuri distincte aceste valori.

CREATE OR REPLACE TYPE OB_INF AS OBJECT (v_ob1 NUMBER, v_ob2 NUMBER);


/
Functia va fi asemanatoare cu prima varinata cu exceptia instructiunii de „incapsulare” a informatiei.
CREATE OR REPLACE FUNCTION sit_lun_f3 (p_luna NUMBER) RETURN OB_INF AS
v_tot_inc NUMBER;
v_nrc NUMBER;
BEGIN
SELECT SUM(incasari), COUNT(id_cursa) INTO v_tot_inc,v_nrc
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa)
HAVING EXTRACT(MONTH FROM data_cursa)=p_luna;
RETURN OB_INF(v_tot_inc,v_nrc);
END;
/
Utilizarea functiei
DECLARE
v_prel_luna NUMBER;
v1_2 OB_INF;
v1 NUMBER;
v2 NUMBER;
BEGIN
v_prel_luna:=&dati_luna;
v1_2:=sit_lun_f3(v_prel_luna);
v1:=v1_2.v_ob1;
v2:=v1_2.v_ob2;
DBMS_OUTPUT.PUT_LINE ('Totalul lunii '||v_prel_luna||' este '||v1||' iar numarul de curse este '||v2);
END;
/

OBS: functia returneaza „capsula” cu cele doua informatii in interiorul ei.


Apelarea functiei se poate face doar prin utilizarea unei variabile intermediare de tipul OB_INF, care va prelua in
ea cele doua informatii, pe care apoi le va putea afisa separat.

Aceasta functie poate fi utilizata suucesiv, prin apelare dintr-un cursor, pentru a calcula aceste informatii pentru
fiecare luna.
DECLARE
CURSOR c_luna IS
SELECT EXTRACT(MONTH FROM data_cursa) AS luna
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa)
ORDER BY 1;

v1_2 OB_INF;
BEGIN
DBMS_OUTPUT.PUT_LINE ('Luna Suma Nr_curse');
DBMS_OUTPUT.PUT_LINE ('------------------------------------');
FOR i IN c_luna LOOP
v1_2:=sit_lun_f3(i.luna);
DBMS_OUTPUT.PUT_LINE (' '||i.luna||' '||v1_2.v_ob1||' '||v1_2.v_ob2);
END LOOP;
END;
/

O utilizare inedita a instructiunilor TO_CHAR, TO_DATE

DECLARE
CURSOR c_luna IS
SELECT EXTRACT(MONTH FROM data_cursa) AS luna
FROM curse_XY
GROUP BY EXTRACT(MONTH FROM data_cursa)
ORDER BY 1;
v1_2 OB_INF;
v_nluna VARCHAR2(15);
BEGIN
DBMS_OUTPUT.PUT_LINE (' Luna Suma Nr_curse');
DBMS_OUTPUT.PUT_LINE ('--------------------------------------------');
FOR i IN c_luna LOOP
v1_2:=sit_lun_f3(i.luna);
v_nluna:=TO_CHAR(TO_DATE(i.luna, 'MM'), 'MONTH','NLS_DATE_LANGUAGE = romanian');
DBMS_OUTPUT.PUT_LINE (' '||v_nluna||' '||v1_2.v_ob1||' '||v1_2.v_ob2);
END LOOP;
END;
/

OBS: stergera unui tip predefinit de variabila se realizeaza astfel

DROP TYPE OB_INF;

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