Sunteți pe pagina 1din 10

Introducere

Limbajul SQL este util pentru a face interogări asupra unei baze de date, pentru a
efectua operatii asupra inregistrarilor cum ar fi insert, update, delete, creare/
modificare/stergere tabele.
De obicei, o aplicaţie (PHP, Java, C# etc.) are nevoie să facă mai multe astfel de
interogări ale bazei de date pentru a funcţiona corect.
Aceste date preluate de către aplicaţie necesită o anumită prelucrare (fără ca
utilizatorul să intervină) după care trebuie să fie scrise înapoi în baza de date. În
cazul în care interogările ce trebuie făcute depind una de cealaltă, timpul de
transfer a datelor între aplicaţia PHP şi serverul SQL poate deveni prea mare.
Fiind un limbaj de scripting ce poate fi executat direct de către serverul Oracle
SQL, limbajul PL/SQL vine în soluţionarea acestei probleme .

Arhitectura
 Unitatea de executie este blocul care contine atat cereri SQL cat si
instructiuni PL/SQL. Ele sunt executate astfel:
o Cererile SQL sunt trimise pentru a fi executate de serverul Oracle
o Instructiunile PL/SQL sunt executate de Procedural Statement
Executor aflat in Motorul PL/SQL (PL/SQL Engine).
 Motorul PL/SQL este prezent in:
o Serverul Oracle
o Tool-uri Oracle (Developer/2000 compus din Oracle Forms, Oracle
Reports si Oracle Graphics) care contin propriul lor motor PL/SQL.
PL/SQL este folosit pentru a scrie:
 Blocuri anonime (Anonymous blocks)
 Proceduri si functii stocate (Stored procedures/functions)
 Proceduri si functii folosite in aplicatii (Application procedures/functions)
 Triggeri pentru baza de date (Database triggers)
 Triggeri folositi in aplicatii (Application triggers)
 Pachete (Packaged procedures)

Avantajele PL/SQL
 Integrare:
o Prezenta motorului PL/SQL atat in serverul Oracle cat si in uneltele
Oracle
o Bibliotecile comune (shared libraries) cu proceduri si functii scrise in
PL/SQL pot fi utilizate de toate aplicatiile dezvoltate si pot fi accesate
local sau la distanta
o Tipurile de date din SQL pot fi folosite si in PL/SQL.
o In cazul uneltelor Oracle avand incorporat motor PL/SQL, executorul
de instructiuni procedurale proceseaza date locale aplicatiei (client)
reducand incarcarea serverului si necesarul de memorie pentru
acesta.

 Imbunatatirea performantelor:
o Un bloc care poate contine mai multe instructiuni SQL este trimis o
singura data serverului reducandu-se traficul pe retea.
o Marirea performantelor uneltelor Oracle prin adaugarea facilitatilor
procedurale ale PL/SQL.

 Dezvoltare modulara a programelor:


o Un program PL/SQL (PL/SQL unit) este format din unul sau mai multe
blocuri – proceduri, functii si blocuri anonime. Un bloc poate contine
in interiorul sau alte blocuri.
o Un program complex poate fi divizat in module logice distincte
implementate prin blocuri.

 Portabilitate:
o Este acelasi pentru orice platforma Oracle, indiferent de sistemul de
operare sau platforma hardware folosita.

 Este procedural:
o Se pot defini variabile, cursori, exceptii (tratarea erorilor). Variabilele
pot fi scalare, referinta, compuse sau de tip obiect mare (large object
- LOB). Acestea pot fi definite si dinamic pe baza structurii tabelelor
din baza de date si a coloanelor acestora.
o Exista instructiuni de decizie, cicluri, parcurgere (pentru liniile unui
rezultat de cerere SQL de tip SELECT).
o Permite tratarea erorilor aparute in executia cererilor SQL de catre
serverul Oracle (erorile se numesc in acest context exceptii) prin
rutine asociate diverselor tipuri de erori care pot apare.

o Se pot declara de catre utilizator conditii suplimentare de eroare si


asocia rutine de tratare.

Blocul PL/SQL

Blocul PL/SQL conține 3 secțiuni


 secțiunea declarativă (opțională)
o constante și variabile
o tipuri de date locale cursoare
o excepții definite de utilizator
o subprograme locale (vizibile doar în bloc)
 secțiunea executabilă (obligatorie)
o instrucțiuni SQL pentru prelucrarea datelor
o instrucțiuni PL/SQL
o trebuie să conțină măcar o instrucțiune
 secțiunea de tratare a excepțiilor (opțională)
o instrucțiuni efectuate atunci când apare a numită excepție/eroare

Tipurile de date
Tipurile de date scalare nu au componente interne (contin valori atomice).
Tipurile de date compuse au componente interne care pot fi prelucrate individual.
Sistemul ofera programatorului doua tipuri de date compuse: înregistrare
(RECORD) si colectie (INDEX-BY TABLE, NESTED TABLE, VARRAY).
Tipurile LOB (large object) sunt acele tipuri de date ale caror valori specifica
locatia unor obiecte de dimensiuni mari, adica blocuri de date nestructurate, cum
ar fi texte, imagini grafice, clipuri video si sunete. Ele cuprind tipurile: CLOB
(Character Large Object), BLOB (Binary Large Object), NCLOB (National Language
Character Large Object) si BFILE (Binary File).
Tipurile de date referinta (REF CURSOR, REF obiect) sunt tipuri de date ale caror
valori, numite pointer-i, fac referinta catre obiecte din program. Pointer-ii contin
locatia de memorie (adresa) a unui element si nu elementul în sine. Tipul REF
CURSOR este folosit pentru a face referinta la un cursor explicit.

IF

Structura IF ne permite sa executam sau sa trecem peste o secventa de


intructiuni, in functie de conditie. IF are 3 forme.

Daca avem mai multe niveluri de nested IF, codul va fi mult mai greu de citit si de
mentinut, si prin urmare e mai bine sa le evitam.

LOOP
LOOP executa setul de instructiuni din body si returneaza controlul la inceputul
loop-ului. In mod normal, corpul contine cel putin un EXIT sau EXIT WHEN pentru
a termina bucla. Altfel ea devine infinita.
E bine sa folosim LOOP atunci cand:
 atunci cand vrem sa executam setul de instructiuni cel putin o data
 nu stim cu siguranta de cate ori vrem sa executam bucla

FOR LOOP

Se executa secventa de instructiuni de un numar specific de ori.


Index este o variabila implicita, locala pentru for loop, aceasta insemnand ca nu o
putem accesa in afara loop-ului.
In interior, ne putem adresa variabilei, dar nu ii putem schimba valoarea.
Atat lower_bound cat si upper_bound sunt numere sau expresii evaluate ca
numere, atunci cand incepe setul de instructiuni. Daca modificam una din cele
doua valori in interior, aceasta modificare nu va avea niciun efect, fiindca cele 2
sunt evaluate o singura data.
In mod normal, lower_bound e mai mica decat upper_bound – in acest caz, index
ia valoarea lui lower_bound, se executa setul, si controlul revine la inceput, index
este incrementat cu 1, din nou se executa setul. Atunci cand index este mai mare
decat upper_bound, se termina loop si controlul se duce dupa for loop.
In cazul in care cele 2 sunt egale, se executa setul o singura data.

WHILE LOOP
Se executa setul de instructiuni atat timp cat conditia este evaluata ca si
adevarata.
PL/SQL evalueaza conditia din clauza While inainte de fiecare iteratie. In cazul in
care este adevarata, atunci se executa bucla. In caz de FALSE sau NULL, se termina
bucla.
Daca conditia este falsa inainte de intrarea in loop, acesta nu se executa deloc.
Pentru a termina bucla in mod premature, vom folosi EXIT sau EXIT WHEN.

Exceptii

PL/SQL trateaza toate erorile care pot apare intr-un bloc anonym, procedura sau
functie ca si exceptie. Ele pot avea cause diferite, cum ar greseli de codare, bugs
sau chiar esecuri de tip hardware.
Intrucat nu e posibil sa anticipam toate exceptiile, totusi putem scrie cod care sa
le trateze astfel incat codul sa functioneze normal in continuare.
Mesajul de excepție PL / SQL este alcătuit din trei părți.
1) Tip de excepție
2) Un cod de eroare
3) Un mesaj
Când se ridică o excepție, Oracle caută un handler de excepție corespunzător în
secțiunea de excepții.
Deoarece nu este posibil să se determine toate erorile de execuție posibile în
timpul testării codului, excepția "WHEN Others" este utilizată pentru a gestiona
excepțiile care nu sunt tratate în mod explicit.

RAISE_APPLICATION_ERROR este o procedură încorporată în oracle care este


utilizată pentru a afișa mesajele de eroare definite de utilizator împreună cu
numărul de eroare al cărui interval este între -20000 și -20999.

RAISE_APPLICATION_ERROR ridică o excepție, dar nu o rezolvă.


RAISE_APPLICATION_ERROR este folosit din următoarele motive,
a) pentru a crea un id unic pentru o excepție definită de utilizator.
b) pentru a face ca excepția definită de utilizator să semene cu o eroare Oracle.

Cursori
Un cursor este o zonă de lucru temporară creată în memoria sistemului când se
execută o instrucțiune SQL.
Un cursor conține informații despre o instrucțiune selectată și despre rândurile de
date accesate de ea.
Cursoare implicite
Acestea sunt create în mod implicit atunci când se execută instrucțiuni DML cum
ar fi, INSERT, UPDATE și DELETE. Ele sunt, de asemenea, create atunci când o
instrucțiune SELECT care returnează un singur rând este executată.

Cursori expliciți
Acestea trebuie să fie create atunci când executați o instrucțiune SELECT care
returnează mai mult de un rând.

Atât cursorii impliciți, cât și cei explicit, au aceeași funcționalitate, dar diferă în
modul în care sunt accesați.

FOR LOOP
Cursorul FOR LOOP executa corpul loop-ului o data pentru fiecare rand returnat al
cursorului asociat.
Ne permite sa aducem fiecare inregistrare a cursorului fara ciclul obisnuit de
executie cu OPEN FETCH si CLOSE.
PROCEDURI
O procedura este un bloc PL / SQL care efectuează una sau mai multe sarcini
specifice.

O procedura incepe cu un header care specifica numele si optional o lista de


parametri.
Fiecare parametru poate fi IN, OUT, or INOUT, specificand astfel daca poate citit
sau scris.
IN
Un parametru IN este read-only, lui nu I se schimba valoarea. IN este valoarea de
default
OUT
Un parametru OUT poate fi scris

INOUT – poate fi si citit si scris, el se poate modifica

In mod similar cu blocurile anonime, corpul procedurii are 3 parti. Partea


executabila este obligatorie, pe cand cea declarative si partea de exceptii sunt
optionale.
Partea declarativa: se pot declara variabile, constante, cursori. Spre deosebire de
blocuri, ea nu incepe cu DECLARE
Partea executabila: contine una sau mai multe instructiuni care implementeaza
logica
Partea de tratare a exceptiilor

Functii
Cuprind un header si un body.
Headerul are numele functiei si o clauza RETURN care specifica ce tip de data va fi
valoarea returnata.

Corpul functiei este asemanator ca si la procedure, si contine 3 sectiuni.


Partea declarative este intre IS si BEGIN – aici se declara variabile, constante,
cursori, si tipuri de date definite de utilizatori.
Partea executabila este intre BEGIN si END – aici e nevoie sa avem o instructiune
de tip RETURN

Pachetele

Pachetele sunt utilizate pentru a organiza mai multe proceduri, funcţii, variabile,
constante, exceptii, cursoare care fie sunt interdependente fie sunt utilizate în
acelaşi scop.
In mod normal, un pachet contine o specificatie si un corp. Specificatia este
obligatorie,in timp ce body poate fi optional.
Specificatia declara obiectele publice care sunt accesibile din afara pachetului.
Body contine implementarea cursoarelor sau subprogramelor declarate, precum
si exception handling.
Avantajele utilizarii de pachete:
 ne permit sa incapsulam tipurile, variabilele, constantele, cursoarele,
subprogramele ce au legatura intre ele in module. In felul asta pachetele
devin mai usor de folosit, de manevrat, de citit.
 Ne permit sa aratam functionalitatea prin intermediul specificatiilor, si sa
ascundem detaliile implementarii in body
 Oracle incarca pachetul in memorie atunci cand apelam un subprogram. La
urmatoarele apelari ale altor subprograme, nu mai este nevoie de
memorie. In acest fel se imbunatateste performanta.

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