ALTE DOCUMENTE
|
|||||||||
Structuri de control īn PL/SQL
Secventa
Instructiunea de atribuire <var> := <expresie>
Instructiunea NULL
Selectia
Instructiunea IF.ENDIF
IF <cond1> THEN
<instructiuni1>
[ELSEIF <cond2> THEN
<instructiuni2>
[ELSEIF <cond3> THEN
<instructiuni3>
. ]
[ELSE
<instructiunin>]
END IF;
Iteratia
Iteratia simpla Instructiunea LOOP...ENDLOOP
LOOP
<instructiuni>
EXIT WHEN <cond>
[<instructiuni>]
END LOOP;
Iteratia conditionata anterior - Instructiunea WHILE...END LOOP
WHILE <cond>
LOOP
<instructiuni>
END LOOP;
Iteratia cu control - Instructiunea FOR...END LOOP
FOR <contor> IN [REVERSE] <lim_inf> ..<lim_sup>
<instructiuni>
END
4. Proceduri/Functii stocate
Pentru a parametriza un subprogram, acesta trebuie inclus īntr-o schema a bazei de date. Acest lucru este posibil cu ajutorul comenzii CREATE OR REPLACE PROCEDURE FUNCTION. Odata ce a fost compilat si stocat īn baza de date, subprogramul stocat poate fi accesat si apelat din toate aplicatiile si de catre toti utilizatorii conectati la baza de date respectiva.
Parametrii subprogramelor pot fi de intrare (IN), de iesire (OUT) sau de intrare-iesire (IN OUT). Cei de intrare se comporta ca niste constante pe durata executiei subprogramului, valorile lor nu pot fi modoficate īn interiorul acestuia. Parametrii de iesire, īn schimb, se comporta ca niste variabile pe durata executiei subprogramului. Īnainte de apelul subprogramului, un astfel de parametru se considera initializat cu valoarea NULL, īn interiorul acestuia urmānd a i se modifica valoarea, care īn final va fi transmisa mediului apelant. Ultimul tip de parametrii prezinta valori īnainte de executia subprogramul, ce se pot modifica īn interiorul acestuia si care apoi, modificati, sunt returnati mediului apelant.
Exemplu : |
Se va formula o procedura pentru afisarea facturarilor dintr un anumit produs specificat prin codul sau se va utiliza metoda DBMS_OUTPUT.PUT_LINE pentru afisarea unei linii text. |
CREATE OR REPLACE PROCEDURE fact_prod (cod IN NUMBER) IS
v_data facturi.datfact%TYPE;
v_nr facturi.nrfact%TYPE;
v_lin liniifact.linie%TYPE;
v_cant liniifact.cantitate%TYPE;
v_pr liniifact.pretunit%TYPE;
v_d CHAR(8);
v_n CHAR(8);
v_l CHAR(2);
v_c CHAR(11);
v_p CHAR(11);
CURSOR c IS
SELECT datfact, facturi.nrfact, linie, cantitate, pretunit
FROM facturi.nrfact = liniifact.nrfact AND codpr = cod
ORDER BY datfact, facturi.nrfact, linie;
BEGIN
OPEN c;
FETCH c INTO v_data, v_nr, v_lin, v_cant, v_pr;
IF c%FOUND THEN
DBMS_OUTPUT.PUT_LINE ('Produsul ' TO_CHAR (cod);
WHILE c%FOUND
LOOP
v_d := TO_CHAR(v_data);
v_n := TO_CHAR(v_nr);
v_l := TO_CHAR(v_lin);
v_c := TO_CHAR(v_cant);
v_p := TO_CHAR(v_pr);
DBMS_OUTPUT.PUT_LINE(v_d v_n v_l v_c v_p);
FETCH c INTO v_data, v_nr, v_lin, v_cant, v_pr;
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('Nu exista facturari !!!');
END IF;
CLOSE c;
END;
Lansarea īn executie a procedurii
SQL> SET SERVEROUTPUT ON;
EXECUTE fact_prod(102);
5. Pachete stocate
Un pachet Oracle permite gruparea mai multor obiecte PL/SQL (constante, variabile, cursoare, functii, proceduri si exceptii) īntr-un tot unitar. Pachetele sunt formate din doua parti :
specificatia : realizeaza interfata pachetului cu aplicatia; aici se declara obiectele publice;
corpul pachetului : contine detalii de implementare precum si declaratiile care nu pot fi vazute īn afara pachetului ; totodata sunt definite complet cursoarele, procedurile si functiile trecute īn specificatia pachetului.
Exemplu : |
Se va defini un pachet stocat op_pachet ce va contine un obiect public - procedura afis_fact. Acestea apeleaza functia gasit_fact pentru a verifica existenta facturii specificate prin numarul ei. |
CREATE OR REPLACE PACKAGE op_fact IS
PROCEDURE afis_fact (nr2 IN NUMBER);
END;
CREATE OR REPLACE PACKAGE BODY op_fact IS
v_nrfact facturi.nrfact%TYPE;
v_codcl facturi.codcl%TYPE;
FUNCTION gasit_fact (nr1 IN NUMBER) RETURN BOOLEAN IS
v_gasit boolean := FALSE;
BEGIN
SELECT nrfact, codcl INTO v_nrfact,v_codcl FROM facturi
WHERE nrfact = nr1;
v_gasit := TRUE;
RETURN v_gasit;
EXCEPTION
WHEN no_data_found THEN
RETURN v_gasit;
END;
PROCEDURE afis_fact (nr2 IN NUMBER) IS
v_linie liniifact.linie%TYPE;
v_cant liniifact.cantitate%TYPE;
v_pret liniifact.pretunit%TYPE;
v_l CHAR(6);
v_c CHAR(10);
v_p CHAR(10);
CURSOR c1 IS
SELECT linie, cantitate, pretunit FROM liniifact
WHERE nrfact = nr2;
BEGIN
IF gasit_fact(nr2) THEN
DBMS_OUTPUT.PUT_LINE ('Factura: '||nr2);
DBMS_OUTPUT.PUT_LINE ('Client : '||v_codcl);
DBMS_OUTPUT.PUT_LINE ('Linia'||' '||'Cantitate'|| ' '||'Pret');
OPEN c1;
FETCH c1 INTO v_linie,v_cant,v_pret;
EXIT WHEN c1%NOTFOUND;
v_l: = TO_CHAR(v_linie);
v_c: = TO_CHAR(v_cant);
v_p: = TO_CHAR(v_pret);
DBMS_OUTPUT.PUT_LINE (v_l||' '||v_c||' '||v_p);
END
CLOSE c1;
ELSE
DBMS_OUTPUT.PUT_LINE ('Factura inexistenta !!!');
END IF;
END;
END;
|