Sunteți pe pagina 1din 5

C4 – Blocuri PL/SQL

Blocul PL/SQL este o secventa de comenzi executabile, neexecutabile si exceptii/functii


proprii si din SQL. Obligatorie este numai partea executabia.
Blocurile pl/sql sunt procesate de motorul pl/sql care poate fi rezident pe Oracle
server/instrument de dezvoltare (de exemplu: Developer Suite)

Un bloc pl/sql are 3 componente: zona declarativa, zona executabila si zona de exceptii:

[DECLARE]
variabile,cursori,exceptii
BEGIN
comenzi SQL
structuri de programare
[EXCEPTION]
actiuni ce se executa cind apare o exceptie,eroare
END;

 blocul se termina (;)


 se utilizeaza(/) pentru a lansa un bloc anonim in bufferul SQL
 o eroare in PL/SQL este tratata ca o exceptie.

Exemplu:
DECLARE
v_variabila VARCHAR2(5);
BEGIN
SELECT coloana INTO variabila FROM tabela;
EXCEPTION
WHEN exceptie THEN actiune;
END;
/

Tipuri de blocuri pl/sql:


1. Bloc anonim
2. Subprograme:
 functii/proceduri stocate
 functii/proceduri de aplicatii
 pachete de proceduri
3. Triggere:
 triggere de aplicatii (developer)
 triggere pe baza de date

1. Blocuri anonime

Sunt blocuri fara nume si sunt declarate la puncul in aplicatie unde sunt executate:

Structura unui bloc anonim este:


DECLARE
------

1
BEGIN
-------
EXCEPTION
-------
END;
/

Exemplu:
DECLARE
v_sal constant real:=50000;
g_codp varchar2(5) not null:='111';
v_data date;
g_datai date default to_date ('15-SEP-05','DD-MON-YY');
g_codsef number(2) default 2;
v_pretnou rindcom.pret%type;
BEGIN
v_data:=to_date ('15-SEP-05','DD-MON-YY');
SELECT data INTO v_data FROM comenzi where nrcom=100;
SELECT max(pret)*1.1 INTO v_pretnou FROM rindcom WHERE
trim(codprodus)=g_codp;
END;
/
Blocurile anonime se pot imbrica. Se utilizeaza etichete pentru a delimita fiecare bloc:

<<eticheta bloc1>>
BEGIN
------
<<eticheta bloc2>>
DECLARE
-------
BEGIN
-------
END bloc2;
END bloc1;

2. Subprograme
Sunt blocuri pl/sql care au nume si pot fi proceduri sau functii.
Ele se pot stoca la nivel de Oracle server (proceduri/functii stocate) sau de aplicatie
(Developer Suite). Subprogramele se pot grupa in pachete.

Structura unei proceduri este:

CREATE [OR REPLACE] PROCEDURE nume_procedura


(PARAMETRU IN|OUT|IN OUT TIP_DATA,….)
IS|AS
--declarare variabile locale
BEGIN
--comenzi
[EXCEPTION]

2
--exceptii
END [nume_procedura];
/

Structura unei functii este:

CREATE [OR REPLACE] FUNCTION nume_functie


RETURN TIP_DATA
(PARAMETRU IN TIP_DATA,….)
IS|AS
--declarare variabile locale
BEGIN
--comenzi
RETURN VALOARE
[EXCEPTION]
--exceptii
END [nume_functie];
/

Pachetele –sunt obiecte care grupeaza un ansamblu de prelucrari efectuate asupra


aceluiasi domeniu sau obiect (modularizare). Pachetul este compus dintr-o parte publica
declarativa (PACKAGE SPECIFICATION) si o parte privata executabila (PACKAGE
BODY).
Definirea se face prin comanda CREATE PACKAGE in care se specifica cele 2 parti ale
pachetului.
El poate contine proceduri, functii, variabile, cursoare, tranzactii.

Structura unui pachet:

CREATE PACKAGE nume_pachet IS /*parte publica*/


PROCEDURE P1;
PROCEDURE P2;
Nume_variabila NUMBER;
END;

CREATE PACKAGE BODY nume_pachet IS /*parte privata*/


PROCEDURE P1 IS
BEGIN
…….
END;
PROCEDURE P2 IS
BEGIN
……..
END;
……..
END;

Apelul se face indicand numele pachetului si numele subprogramului si eventual


parametrii utilizati.

3
3.Triggeri

Se pot realiza in doua modalitati:


La nivelul bazei de date este asociat cu o tabela si va fi lansat in executie cand are loc o
comanda DML;
La nivel de aplicatii este asociat cu un evenimen din videoformate: deplasare mouse,
apasarea unui buton, inchiderea unei ferestre, etc.

Structura unui trigger creat pe baza de date:


CREATE [OR REPLACE] TRIGGER NUME_TRIGGER
[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON TABELA
[FOR EACH ROW][WHEN CONDITIE]
CORP_TRIGGER;
END;

Apelul blocurilor PL/SQL


Se poate face din SQL sau cu precompilatoarele.
 Din SQL: se ruleaza fisierul cu extensia .sql in care s-a salvat anterior blocul
PL/SQL.
 Cu precompilatoare:
1. Programul in limbajul gazda contine:
EXEC SQL EXECUTE
Nume_bloc PL/SQL
END_EXEC terminator de instructiune din limbajul gazda
2. Variabila gazda
Se declara cu:
EXEC SQL BEGIN DECLARE SECTION;
……..
EXEC SQL END DECLARE SECTION;
Se folosesc in limbaj gazda ca atare sau in blocul PL/SQL precedate de
caracterul :
3. Programul sursa se precompileaza si rezulta un fisier care se va compila, link-
edita si executa normal.

Exemple:
1. Să se calculeze media a două numere. Numerele se vor introduce de la tastatură.

variable v_rezultat number


accept p_num1 prompt 'Introduceti primul numar:'
accept p_num2 prompt 'Introduceti al doilea numar:'
declare
v_num1 number(9,2):=&p_num1;
v_num2 number(9,2):=&p_num2;
begin
:v_rezultat:=(v_num1+v_num2)/2;
end;
/
print v_rezultat

2. Să se afişeze salariul mărit cu un procent. Salariul şi procentul se dau de la tastatură

4
Set serveroutput on
accept p_sal prompt 'Introduceti salariul:'
accept p_procent prompt 'Introduceti procentul:'
declare
v_sal number:=&p_sal;
v_procent number:=&p_procent;
begin
dbms_output.put_line(to_char(nvl(v_sal,0)*(1+nvl(v_procent,0)/100)));
end;
/

3. Să se încarce în două variabile valorile pentru data încheierii şi termen de livrare


pentru o anumita comanda şi să se afişeze. Numarul comenzii se dă de la tastatură

set serveroutput on
accept p_nrcom prompt 'Introduceti nr comanda:'
declare
v_data comenzi.data%type;
v_termenliv rindcom.termenliv%type;
v_nrcom comenzi.nrcom%type;
begin select c.nrcom, c.data, max(rc.termenliv) into v_nrcom, v_data, v_termenliv from
comenzi c, rindcom rc where c.nrcom=rc.nrcom and c.nrcom=&p_nrcom group by
c.nrcom, c.data;
dbms_output.put_line ('Comanda '|| v_nrcom||' s-a incheiat la: '|| v_data||' si are termen
de livrare '|| v_termenliv);
end;
/

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