Sunteți pe pagina 1din 4

Facultatea de Științe Economice - SIG - Oracle – Laboratorul 9

Pachete de subprograme

Grupeaza variabile, subprograme, tipuri de date PL/SQL care sunt corelate logic.
Sunt formate din 2 parti:
- specificatia pachetului – zona publica
- corpul pachetului – zona privata

Specificatia pachetului:
CREATE [OR REPLACE] PACKAGE nume_pachet
IS|AS
--declaratii de variabile si tipuri publice, sunt initializate cu NULL implicit
--specificatii ale subprogramelor publice
END [nume_pachet];

Corpul pachetului:
CREATE [OR REPLACE] PACKAGE BODY nume_pachet
IS|AS
--declaratii de variabile si tipuri private
--definitii ale subprogramelor publice si private
[BEGIN
-- Este optional si se executa o singura data la primul apel si la incarcarea pachetului in memorie
END [nume_pachet];

Observatie: In cadrul pachetelor pentru a utiliza o functie/procedura in cadrul unui subprogram,


aceasta trebuie declarata inainte (principiul forward declarations);

In zona de specificatii a pachetului se pot declara:


 proceduri;
 funcţii;
 variabile;
 cursoare;
 excepţii.
Corpul pachetului defineste complet procedurile, functiile si cursoarele.

Supraincarcarea subprogramelor
 Se poate realiza numai pentru functii/proceduri din cadrul pachetelor, nu si pentru subprograme
singulare (stocate direct in baza de date);
 Nu se pot supraincarca 2 subprograme care au paramentrii de tipuri asemanatoare (ex: NUMBER
si DECIMAL sau VARCHAR2 si VARCHAR);

Exemplu:
CREATE OR REPLACE PACKAGE actualizare_produse IS
procedure adauga_produs
(p_codp produse.codprodus%type,
p_denp produse.denprodus%type,
p_um produse.um%type,
p_stoc produse.stoc%type);

-1-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 9

procedure modifica_produs
(p_codp produse.codprodus%type,
p_denp produse.denprodus%type,
p_um produse.um%type,
p_stoc produse.stoc%type);

procedure modifica_produs
(p_codp produse.codprodus%type,
p_stoc produse.stoc%type);

procedure sterge_produs
(p_codp produse.codprodus%type);

function exista_cod
(p_codp produse.codprodus%type)
return boolean;

exceptie exception;

END;
/

CREATE OR REPLACE PACKAGE BODY actualizare_produs IS


procedure adauga_produs
(p_codp produse.codprodus%type,
p_denp produse.denprodus%type,
p_um produse.um%type,
p_stoc produse.stoc%type)
is
begin
if exista_cod(p_codp) then
raise exceptie;
else
insert into produse values (p_codp, p_denp, p_um, p_stoc);
end if;
exception
when exceptie then
dbms_output.put_line('Produs existent!');
end;

procedure modifica_produs
(p_codp produse.codprodus%type,
p_denp produse.denprodus%type,
p_um produse.um%type,
p_stoc produse.stoc%type)
is
begin
if exista_cod(p_codp) then
update produse
set denprodus=p_denp, um=p_um, stoc=p_stoc
where codprodus=p_codp;
-2-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 9

else
raise exceptie;
end if;
exception
when exceptie then
dbms_output.put_line('Produsul cu aceast cod nu exista!');
end;

--supraîncărcare a procedurii modifica_produs


procedure modifica_produs
(p_codp produse.codprodus%type,
p_stoc produse.stoc%type)
is
begin
if exista_cod(p_codp) then
update produse
set stoc=p_stoc
where codprodus=p_codp;
else
raise exceptie;
end if;
exception
when exceptie then
dbms_output.put_line('Produsul cu aceast cod nu exista!');
end;

procedure sterge_produs
(p_codp produse.codprodus%type)
is
begin
if exista_cod(p_codp) then
delete from produse
where codprodus=p_codp;
dbms_output.put_line('Produsul cu codul '||p_codprodus||' a fost sters!');
else
raise exceptie;
end if;
exception
when exceptie then
dbms_output.put_line('Produsul cu aceast cod nu exista!');
end;

function exista_cod
(p_codp produse.codprodus%type)
return boolean
is
v_unu number;
begin
select 1 into v_unu
from produse
where codprodus=p_codprodus;
return true;
-3-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 9

exception
when no_data_found then
return false;
end;

END;
/

Apelul procedurilor / functiilor din cadrul pachetului:


execute actualizare_produse.adauga_produs(449,'ceai', 12, 200);
select * from produse;

execute actualizare_produse.modifica_produs(449,'gogosi', 10, 200);


select * from produse;

execute actualizare_produse.modifica_produs(444, null);


select * from produse;

execute actualizare_produse.sterge_produs(449);
select * from produse;

Stergerea pachetului se realizeaza cu comenzile:


DROP PACKAGE nume_pachet;
DROP PACKAGE BODY nume_pachet;

Vizualizarea specificatiilor pachetelor in dictionarul metadatelor se realizeaza prin:


Select text
From user_source
Where name='NUME_PACHET' and type='PACKAGE'

Iar pentru a vizualiza corpul pachetului:


Select text
From user_source
Where name='NUME_PACHET' and type='PACKAGE BODY'

Exemplu:
Select text
From user_source
Where name='ACTUALIZARE_PRODUSE' and type='PACKAGE BODY';

-4-

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