Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
In general, un pachet consta din doua parti: are o specificatie si un corp, stocate separat in baza de date.
Specificatia este interfata pentru aplicatii. Aici sunt declarate tipurile, variabilele, constantele, exceptiile, cursoarele si subprogramele care pot fi apelate.
Corpul defineste cursorii si subprogramele, si astfel implementeaza specificatia.
Pachetele nu pot fi apelate recursiv, nu pot fi parametrizate sau incuibate. Odata scris si compilat un pachet poate fi folosit in multe aplicatii.
Avantajele utilizarii pachetelor sunt:
modularitatea;
usurinta construirii aplicatiei;
incapsularea (ascunderea informatiei);
functionalitatea;
cresterea performantei;
supraincarcarea.
Pentru a crea un pachet mai intai se creeaza specificatia pachetului si apoi se creeaza corpul pachetului. Constructiile publice ale pachetului sunt cele care se declara in specificatia pachetului si sunt definite in corpul pachetului, iar constructiile private sunt cele definite numai in interiorul pachetului.
Fig. ‑ Descrierea unui pachet
Unde:
1. Variabila globala (publica).
2. Procedura de tip public.
3. Procedura de tip private (locala pachetului).
4. Variabila globala.
5. Variabila locala.
Un pachet se creaza astfel:
Se scrie specificatia pachetului intr-un fisier script, folosind instructiunea CREATE PACKAGE. Fisierul poate fi creat fie utilizand SQL*PLUS fie Procedure Builder. Codul sursa este compilat si depozitat in dictionarul datelor.
Se scrie corpul pachetului intr-un fisier script folosind instructiunea CREATE PACKAGE BODY. Fisierul poate fi creat fie utilizand SQL*PLUS fie Procedure Builder. Codul sursa este deasemenea compilat si depozitat in dictionarul datelor.
Se apeleaza orice constructie public din interiorul pachetului in mediul ORACLE Server.
Specificatia unui pachet are urmatoarea sintaxa:
CREATE [OR REPLACE) PACKAGE package_name
IS | AS
public type and item declarations
subprogram specifications
END package_name;
unde: package name -este numele pachetului;
type and item declarations -declararea variabilelor, constantelor, cursoarelor, exceptiilor sau tipurilor;
subprogram specifications -declararea subprogramele PL/SQL;
Exemplu: Crearea specificatiei pachetului cu numele comm_package.
SQL>CREATE OR REPLACE PACKAGE comm_package IS
g_comm NUMBER := 10; --initialized to 10
PROCEDURE reset_comm
(v_comm IN NUMBER) ;
END comm_package;
/
In acest exemplu variabila globala g_comm si procedura reset_comm sunt constructii publice.
SQL>EXECUTE comm_package .g_comm : = 5
SQL>EXECUTE comm _package.reset_comm(8)
Crearea corpului pachetului se realizeaza prin urmatoarea sintaxa:
CREATE [OR REPLACE] PACKAGE BODY package_name
IS | AS
private type and item declarations
subprogram bodies
END package_name;
unde: package name -este numele pachetului;
type and item declarations -declararea variabilelor, constantelor, cursoarelor, exceptiilor sau tipurilor.
subprogram bodies -definirea subprogramele PL/SQL.
Specificam optiunea REPLACE cand corpul pachetului deja exista. Folosim cuvantul cheie IS in loc de AS daca folosim Procedure Builder. Daca nu folosim Procedure Builder, IS si AND sunt echivalente.
Exemplu: Crearea corpului pachetului comm_package.
SQL>CREATE OR REPLACE PACKAGE BODY comm_package IS
FUNCTION validate_comm
(v_comm IN NUMBER) RETURN BOOLEAN
IS
v_max_comm NUMBER;
BEGIN
SELECT MAX(comm)
INTO v_max_comm
FROM emp;
IF v_comm > v_max_comm THEN RETURN(FALSE);
ELSE RETURN(TRUE)
END IF;
END validate_comm;
PROCEDURE reset_comm(v_comm IN NUMBER)
IS
v_valid BOOLEAN;
BEGIN
v_valid := validate_comm(v_comm);
IF v_valid = TRUE THEN
g_comm := v_comm;
ELSE
RAISE_APPLICATION_ERROR (-20210, 'Invalid comm');
END IF;
END reset_comm;
END comm_package;
In scrierea pachetelor este indicat sa pastram pachetele cat mai general posibile, sa definim specificarea pachetului inainte de corpul sau, iar specificatia sa contina numai constructii publice.
In exemplul de mai sus se observa apelarea functiei validate_comm din procedura reset_comm. Cand apelam o functie sau o procedura a pachetului din afara sa, trebuie sa-i prefixam numele cu numele pachetului.
Exemplu: Apelarea procedurii reset_comm din SQL/PLUS:
SQL> EXECUTE comm_package.reset_comm(1500);
Exemplu: Apelarea procedurii reset_comm dintr-o schema diferita, de exemplu a lui scott:
SQL> EXECUTE scott.comm_package.reset_comm(1500);
Cand referim o variabila, un cursor, o constanta sau o exceptie din afara pachetului, trebuie sa prefixam numele acesteia cu numele pachetului.
Exemplu: Referirea variabilei globale g_comm din procedura hire_emp, care nu apartine pachetului comm_package:
CREATE OR REPLACE PROCEDURE hire_emp
(v_ename IN emp.ename%TYPE,
v_mgr IN emp.mgr%TYPE,
v_job IN emp.job%TYPE,
v_sal IN emp.sal%TYPE)
IS
v_comm emp.comm%TYPE;
BEGIN
v_comm := comm_package.g_comm;
END hire_emp;
Stergerea specificatiei unui pachet se face folosind urmatoarea sintaxa:
DROP PACKAGE package_name
Stergerea corpului unui pachet se face folosind sintaxa:
DROP PACKAGE BODY package_name
Folosind tabelele create in lucrarea 1 si anume DEPT, EMP si SALGRADE sa se scrie folosind limbajul PL/SQL un pachet cu denumirea student care va contine urmatoarele proceduri si functii:
Copyright © 2024 - Toate drepturile rezervate