Documente Academic
Documente Profesional
Documente Cultură
Corpul pachetului este opţional dacă în specificaţie nu sunt declarate subprograme sau cursori.
Specificaţia şi corpul pachetului sunt compilate separat şi sunt stocate ca două obiecte distincte în
dicţionarul de date.
Corpul unui pachet reprezintă partea privată a acestuia şi are următoarea sintaxă:
Sistemul Oracle permite existența în același pachet a mai multor subprograme cu aceeași denumire.
Această tehnică, cunoscută sub denumirea de supraîncărcare, este utilă în special atunci când vreți
să executați aceleași subprograme de mai multe ori, însă cu argumente de tipuri diferite.
Un alt exemplu îl constituie funcția TO_CHAR care are mai multe modalități de a fi apelată, permițând
convertirea unui număr sau a unei date calendaristice într-un șir de caractere.
Puteți folosi același nume pentru subprograme diferite cât timp parametrii lor formali diferă ca
număr, ordine, categorie sau tip de date.
Supraîncarcarea poate fi aplicată doar subprogramelor în pachete, dar nu subprogramelor de
sine stătătoare.
Lucrări aplicative:
Aplicatia 1
Aplicatia 2
FROM angajati
WHERE cod_angajat= p_cod_angajat;
RETURN p_salariu;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
WHEN TOO_MANY_ROWS THEN
RETURN NULL;
END extragere_salariu;
END personal;
DECLARE
p_salariu NUMBER(8);
v_nume VARCHAR2(46);
p_cod_angajat NUMBER := 6;
BEGIN
v_nume := personal.nume_complet(p_cod_angajat);
p_salariu := personal.extragere_salariu(p_cod_angajat);
15. DECLANSATORI
Un declanșator (eng. trigger) reprezintă o unitate de program denumită specific, care este stocată în
bază de date și activată (executată) ca răspuns la un eveniment anume. Evenimentul specificat este
asociat cu un tabel, o vizualizare, o schemă sau baza de date și poate fi unul dintre următoarele:
operație ce ține de manipularea bazei de date (DML - DELETE, INSERT sau UPDATE);
operație ce ține de definirea bazei de date (DDL - CREATE, ALTER sau DROP);
operație de bază de date (SERVERERROR, LOGON, LOGOFF, STARTUP sau SHUTDOWN).
Lucrări aplicative:
Rezolvare:
CREATE OR REPLACE TRIGGER declansator_modificare_suma
BEFORE UPDATE OF suma ON facturi_aprovizionare
FOR EACH ROW
BEGIN
IF (:NEW.suma != :OLD.suma) THEN
Important!
În ceea ce privește declanșatorii aplicați la nivel de rând, se poate accesa rândul curent procesat
folosind două pseudo-records ( :old, :new). Tipul acestora este:
nume_tabelă_pe_care_acționează_declanșatorul%ROWTYPE
Observații:
Să se realizeze un declanșator care să nu permită inserarea unui preț mai mare de 50 u.m..
Rezolvare:
CREATE OR REPLACE TRIGGER restrictie_pret
BEFORE INSERT or UPDATE on produse
FOR EACH ROW
DECLARE v_pret_max number:=50;
BEGIN
IF :new.pret>v_pret_max then
RAISE_APPLICATION_ERROR (-20202, 'Nu se poate seta un pret mai mare de 50.');
END IF;
END;