PL/SQL este limbajul procedural al mediului Oracle si reprezinta o extensie a limbajului SQL Oracle. PL/SQL este un limb'aj cu structura de bloc; acesta da posibilitatea programatorilor sa codifice proceduri, functii si blocuri anonime (nenominalizate) care combina instructiuni SQL cu instructiuni procedurale. Procedurile, functiile si cursoarele care formeaza o unitate logica pot fi grupate si stocate împreuna în pachete (packages). Acestor pachete le pot fi furnizati parametri, ceea ce permite procedurilor si functiilor sa primeasca si sa returneze valori.
PL/SQL este complet compatibil cu comenzile limbajului de manipulare a datelor ANSI/ISO SQL si cu tipurile de date ale limbajului SQL. Datele complexe sunt manipulate usor cu tipul boolean de 22222m129w date si cu tipurile compuse ale limbajului PL/SQL.
Cu ajutorul blocurilor, puteti grupa declaratii si instructiuni care formeaza o unitate logica. Declaratiile sunt locale în'bloc si îsi înceteaza existenta dupa încheierea executiei blocului. Blocurile PL/SQL pot aparea oriunde pot sa apara blocuri SQL.
Limbajul PL/SQL este procesat de propriul "motor" PL/SQL. Acest motor este încorporat în urmatoarele produse Oracle:
Oracle Server with Procedural Option
SQL*Forms
SQL*Menu
SQL*Report Writer
Oracle Graphics
PL/SQL este un limbaj complet de procesare a tranzactiilor, care prezinta urmatoarele avantaje:
PL/SQL este compatibil cu SQL. SQL este un limbaj neprocedural, ceea ce înseamna ca serverul Oracle stabileste metoda optima de executie a instructiunilor acestuia. PL/SQL suporta instructiunile SQL de manipulare a datelor, cele referitoare la controlul cursoarelor si instructiunile de gestionare a tranzactiilor.
PL/SQL îmbunatateste performantele serverului prin reducerea numarului de apeluri dintre aplicatie si programul Oracle.
Aplicatia dumneavoastra poate transmite catre mediul Oracle mai multe instructiuni SQL simultan, ceea ce îmbunatateste traficul în retea.
întregul cod PL/SQL este compatibil cu orice sistem de operare si cu orice platforma pe care ruleaza sistemul Oracle.
Se reduce numarul de recompilari deoarece pachetele nu trebuie recompilate atunci când redefiniti procedurile din interiorul pachetului.
Se reduce numarul de operatii de I/O cu discul deoarece functiile si procedurile care formeaza o unitate logica sunt stocate împreuna.
PL/SQL ofera structuri de control conditionale, iterative si secventiale, ceea ce permite o formidabila flexibilitate în programare.
Este încurajata modularizarea programelor, deoarece PL/SQL va permite sa împartiti aplicatia în module logice bine definite si usor de gestionat.
Se simplifica depistarea si tratarea erorilor.
În lipsa limbajului PL/SQL, serverul Oracle ar trebui sa proceseze fiecare instructiune SQL separat. Aceasta ar duce la o reducere drastica a performantelor, datorata apelului suplimentar pentru fiecare instructiune.
Cu PL/SQL poate fi transmis dintr-o data serverului Oracle un întreg bloc de instructiuni, ceea ce are ca efect reducerea traficului în retea, între aplicatia dumneavoastra si serverul Oracle. De asemenea, instrumentele Oracle, cum ar fi Developer 2000, beneficiaza de pe urma caracteristicilor de procesare procedurala a PL/SQL, ceea ce le îmbunatateste performantele.
Limbajul PL/SQL este compus din blocuri, structuri de control, atribute, variabile si cursoare. Paragrafele urmatoare furnizeaza informatii în legatura cu utilizarea limbajului procedural PL/SQL, care reprezinta o extensie a limbajului SQL.
PL/SQL este un limbaj axat pe blocuri, cu caracteristici de procesare procedurala si de tratare a erorilor. Aceste blocuri sunt compuse din proceduri, functii si blocuri anonime care sunt grupate la un loc din punct de vedere logic, în vederea rezolvarii unei probleme specifice.
Un bloc PL/SQL este compus din trei parti:
Declaratie - Toate obiectele blocului trebuie declarate
Executie - Obiectele sunt definite în vederea manipularii datelor
Exceptii - Aici sunt plasate rutinele de tratare a erorilor
Figura 22.1 Ilustreaza un bloc PL/SQL generic.
Figura 22.1. Formatul unui bloc PL/SQL generic |
|
PL/SQL este în acelasi timp o tehnologie si o parte integranta a sistemului Oracle. El poseda propriul motor de procesare care executa blocurile si subprogramele PL/SQL. Acest motor poate fi instalat pe server sau în oricare dintre instrumentele de dezvoltare, cum ar fi SQL*Forms. Daca programul gazda nu poseda un motor PL/SQL, blocurile de cod sunt transmise serverului Oracle în vederea procesarii. Figura 22.2 ilustreaza motorul PL/SQL ca parte integranta a serverului Oracle 7.2. Acest motor executa instructiunile procedurale si transmite instructiunile SQL serverului Oracle spre a fi executate de executorul de instructiuni SQL al acestuia.
Atunci când instrumentele Oracle dispun de motorul PL/SQL, ele proceseaza direct blocurile PL/SQL. Figura 22.3 ilustreaza modul în care instrumentul SQL*Form proceseaza direct blocurile PL/SQL cu propriul motor PL/SQL si transmite serverului Oracle instructiunile SQL în vederea procesarii.
Figura 22.2. Motorul PL/SQL al serverului Oracle |
|
Figura 22.3. Procesarea blocurilor PL/SQL de catre instrumentul SQL'Form. |
|
PL/SQL nu poseda facilitati de introducere si afisare interactiva a datelor, în consecinta, aveti nevoie de un instrument cum'ar fi 'SQL*Plus sau de medii OCI (Oracle Caii Interface) pentru a putea utiliza PL/SQL.
In SQL*Plus puteti folosi PL/SQL pentru a efectua urmatoarele:
Introducerea, stocarea si rularea blocurilor PL/SQL
Crearea, încarcarea si rularea unui script continând blocuri PL/SQL
Apelarea unei proceduri rezidente
Fiecare bloc PL/SQL începe cu cuvintele rezervate declare sau begin. Cuvântul begin este utilizat drept punct de început al unui bloc daca acesta nu contine nici o declaratie, începerea unui bloc indica programului SQL*Plus sa goleasca tamponul SQL, sa intre în modul introducere si sa ignore semnele punct si virgula (;). Daca blocul se încheie cu punct, el va fi stocat în tamponul SQL.
Puteti salva continutul tamponului cu comanda s ave. Pentru a salva un bloc pe care l-ati editat, folositi comanda save cu clauza replace.
Pentru a citi si a încarca în tampon un bloc PL/SQL salvat anterior, folositi comanda get. Instructiunea urmatoare citeste si încarca în memorie scriptul PL/SQL articole_lunare:
SQL> GET articole_lunare
Pentru a executa un bloc PL/SQL rezident în tamponul SQL*Plus, folositi comenzile / sau run.
De exemplu, instructiunea urmatoare ilustreaza ambele moduri de executare a blocului rezident în tampon:
SQL> RUN
sau
SQL> /
Prin definitie, limbajul PL/SQL reprezinta extensia procedurala a limbajului SQL. PL/SQL suporta toate comenzile limbajului de manipulare a datelor (DML) ale limbajului SQL (cu exceptia comenzii explain plan), precum si comenzile pentru controlul tranzactiilor, functiile, pseudo-coloanele si operatorii SQL. Limbajul PL/SQL nu suporta comenzile de definire a datelor, comenzile pentru controlul sesiunii si comenzile pentru controlul sistemului ale limbajului SQL.
PL/SQL este asemanator cu oricare alt limbaj de programare prin faptul ca poseda propria structura, sintaxa si semantica. Paragrafele urmatoare trateaza diverse aspecte ale limbajului PL/SQL.
Puteti sa definiti variabile si constante si sa le utilizati în instructiuni SQL si în instructiuni procedurale oriunde poate fi folosita o expresie. Singura exceptie o constituie faptul ca nu sunt permise referintele anticipate. Acest lucru înseamna ca trebuie sa declarati toate variabilele si constantele înainte de a face referire la ele în alte instructiuni.
Limbajul PL/SQL prevede aceleasi tipuri de date ca si limbajul SQL, si anume, char, number, long, date si varchar2. In plus, PL/SQL poseda câteva tipuri proprii, printre care se numara tipurile boolean si binary_integer. Exemplul urmator ilustreaza definirea variabilelor si a constantelor:
nr_art VARCHAR2(15); inreg_articol BOOLEAN;
Puteti atribui valori variabilelor cu operatorul de atribuire (: =). Variabila apare în stânga operatorului de atribuire, iar expresia apare în dreapta acestuia:
pret := cant * (cost*2.5); inreg_articol := TRUE;
A doua metoda de a atribui o valoare unei variabile este sa folositi instructiunea select pentru a prelua o valoare într-o variabila. Exemplul urmator selecteaza o valoare si o atribuie variabilei nume_art:
SELECT lst.articole.nume_articol INTO nume_art WHERE nr_articol = cod_articol;
Pentru a declara o constanta, includeti cuvântul cheie constant în instructiunea de declarare a variabilei. Instructiunea urmatoare defineste constanta cost_plus:
cost_plus := CONSTANT REAL:= 2.5;
Fiecarei variabile si constante PL/SQL îi sunt asociate doua atribute. Aceste atribute reprezinta proprietati ale variabilei sau ale constantei la care puteti face referire. Iata descrierea atributelor PL/SQL:
%type |
Descrie tipul variabilei, constantei sau coloanei tabelului. Puteti declara o variabila folosind atributul %type ca în instructiunea urmatoare: nr_art := lst_articole.cod_articol%TYPE; În acest exemplu, variabila nr_art este de acelasi tip ca si coloana cod_articol din tabelul LST_ARTICOLE. |
% rowtype |
Descrie o înregistrare care reprezinta o linie a unui tabel. Exemplul urmator creeaza o înregistrare numita inreg_articol ale carei câmpuri au aceleasi nume si tipuri ca si coloanele care apar în tabelul LST_ARTICOLE: DECLARE inreg_articol lst_articole%ROWTYPE; În continuare, puteti folosi notatia cu punct pentru a accesa orice câmp al înregistrarii de tip rowtype. Instructiunea urmatoare atribuie valoarea câmpului nume_articol variabilei descriere_articol: descriere articol := inreg artîcol.nume articol; |
Setul de caractere al limbajului PL/SQL include urmatoarele:
Alfabetul, cu majuscule si litere mici în limbajul PL/SQL nu se face distinctie între majuscule si litere mici decât în cazul în care acestea apar în siruri de caractere.
Numerele de la O la 9
Spatii, caractere de tabulare, retururi de car
Simboluri speciale: ( ) +- _ * / & ^ % $ # @ ! ; : " ' [ ] ? / < > !
Fiecare propozitie a unui text PL/SQL este structurata pentru a fi mai usor lizibila si pentru a asigura respectarea sintaxei PL/SQL. Ca exemplu, sa analizam instructiunea urmatoare:
SELECT nume_articol FROM lst_articole WHERE pret_articol >= (cost_art*2.5);
-- numele articolelor cu valoare maxima
Aceasta propozitie PL/SQL contine urmatoarele:
Simboluri - Simbolurile * si >= au semnificatii predefinite în limbajul PL/SQL
Etichete si identificatori - nume_articol, lst_articole, pret_articol si cost_art sunt numele unor obiecte ale programului sau ale bazei de date.'
Expresii literale - 2 . 5 este o expresie literala
Comentarii - Tot ce urmeaza dupa indicatorul de comentariu (--) este considerat comentariu
Fiti precaut atunci când folositi cuvintele rezervate ale limbajului PL/SQL. De exemplu, în instructiunea urmatoare este folosit incorect un cuvânt rezervat al limbajului PL/SQL:'
DECLARE values
NUMBER
Cuvântul rezervat values nu poate fi folosit într-o declaratie. Toate cuvintele rezervate au o semnificatie sintactica predefinita si nu pot fi redefinite.
Comentariile reprezinta o parte foarte importanta a unui program. Ele asigura lizibilitatea si inteligibilitatea programului. Comentariile sunt destinate oamenilor, nu calculatoarelor. Programul Oracle ignora comentariile. Ele se afla acolo numai pentru dumneavoastra.
Comentariul mono-linie începe cu o dubla cratima (--). Acest indicator de comentariu poate sa apara oriunde într-o linie si marcheaza drept comentariu tot ce urmeaza pâna la sfârsitul liniei respective. Iata un exemplu de comentarii mono-linie:
DECLARE
descriere_articol VARCHAR2(50) - numele generic al articolului -- începe procesarea
SELECT
Comentariile multi-linie încep cu /* si se termina cu * /. Aceste comentarii se pot întinde pe mai multe linii.
În exemplul urmator, este ilustrat un comentariu multi-linie:
/* Selecteaza numele articolelor cu valoare ridicata folosind pretul de cost înmultit cu un coeficient Daca doriti sa utilizati metoda WIP pentru calculul valorii articolelor, folositi tabelul lst_inventar */
SELECT nume_articol FROM lst_articole WHERE pret_articol >= (cost art*2. 5) ;
Utilizarea comentariilor face obiectul urmatoarelor restrictii:
Comentariile nu pot fi imbricate
Nu pot fi folosite comentarii mono-linie daca blocul urmeaza sa fie procesat dinamic de un program de precompilare
în limbajul PL/SQL, la crearea variabilelor si constantelor, acestora trebuie sa li se declare tipul. Tipul specifica formatul de memorare, restrictiile si un domeniu valid de valori, în lista urmatoare sunt enumerate tipurile de date ale limbajului PL/SQL:
Tipuri scalare:
binary_integer
dec
decimal double precision
float
int
integer
string
natural number
numeric
positive
real
smallint
char
character
long
long raw
raw
rowid
string
varchar
varchar2
date
boolean
Tipuri compuse:
Record
table
Tipurile scalare nu au componente interne, în timp ce tipurile compuse au componente interne pe care le puteti manipula. Tipurile scalare sunt similare tipurilor SQL. Consultati Capitolul 4, "Tipuri de date", pentru o descriere a tipurilor scalare.
Limbajul PL/SQL prevede doua tipuri compuse: table si record. Tipul record este pentru a accesa liniile tabelelor ca pe niste matrice. Tipul table este asemanator, dar nu identic cu o baza de date.
Tipul record este asemanator cu o înregistrare a unui tabel cu exceptia faptului ca numele coloanelor sunt proprii fiecarei înregistrari.
Oracle va permite sa încapsulati blocuri PL/SQL în programe scrise în oricare dintre urmatoarele limbaje: C, COBOL, FORTRAN, Ada, Pascal si PL/I. Dupa ce scrieti programul în oricare dintre aceste limbaje, trebuie sa precompilati codul sursa. Prin precompilare sunt detectate erorile si este generat un fisier continând codul sursa modificat, care poate fi compilat, legat si executat.
Pentru a încapsula un bloc PL/SQL în programul dumneavoastra, trebuie sa precedati blocul cu instructiunea exec SQL execute. Blocul PL/SQL trebuie sa se termine cu instructiunea end-exec. Exemplul urmator ilustreaza sintaxa pentru încapsularea unui bloc PL/SQL într-un limbaj de nivel înalt:
exec SQL execute
begin
end
end-exec
Folositi variabilele programului gazda pentru a transfera valori în ambele sensuri între programul sursa si blocul PL/SQL. Domeniul variabilelor declarate în interiorul blocului PL/SQL este global.
Toate referirile la variabilele programului gazda care apar într-un bloc PL/SQL trebuie prefatate cu semnul doua puncte (:). Aceasta notatie ajuta precompilatorul sa faca distinctia între variabilele programului gazda si variabilele blocului PL/SQL.
Oracle va permite sa folositi o variabila indicator facultativa atunci când faceti referire la o variabila a programului gazda. Aceasta variabila indicator este o variabila întreaga care indica valoarea sau starea unei variabile gazda. Variabila indicator este folosita pentru detectarea valorilor nule, pentru trunchierea variabilelor gazda returnate si pentru a atribui valori nule variabilelor de intrare.
Pentru variabilele de iesire, variabilei indicator îi pot fi atribuite urmatoarele valori:
Indica programului gazda faptul ca valoarea variabilei este nula. Evident, programul gazda trebuie sa posede rutine adecvate pentru detectarea situatiilor de acest gen. |
|
Oracle returneaza programului gazda valoarea variabilei fara modificari. |
|
> 0 |
Oracle atribuie o valoare trunchiata variabilei gazda. |
Pentru variabilele de intrare, variabilei indicator îi pot fi atribuite urmatoarele valori: |
|
Oracle ignora valoare variabilei gazda si îi atribuie valoarea nula. |
|
>= 0 |
Oracle accepta valoarea variabilei gazda fara modificari. |
Variabila indicator trebuie declarata ca întreg de doi octeti. La utilizarea într-o instructiune SQL, variabila trebuie prefatata cu (:) si adaugata variabilei gazda.
/* Urmeaza un bloc PL/SQL */
EXEC SQL EXECUTE
BEGIN
SELECT cant_articol, pret_articol, nume_articol
INTO :cant_art, :cant__ind, :pret_art, :nume_art
FROM lis_articole;
END;
end-exec
/* Urmeaza rutina programului gazda */
if cant_ind = -1
then
else
Serverul Oracle si motorul PL/SQL genereaza un mesaj de eroare la fiecare eroare de executie sau defectare a echipamentelor. Formatul mesajului de eroare PL/SQL este
PLS-00000 mesaj de eroare
Codul de eroare este prefatat de literele PLS si este urmat de un numar unic. Cu ajutorul acestui numar, puteti gasi definitia erorii, fie în manualul utilizatorului PL/SQL, fie în manualul de mesaje si coduri al sistemului Oracle, în aceste manuale, gasiti lista completa a mesajelor si codurilor de eroare. Iata un mesaj de eroare PL/SQL pe care 1-ati putea întâlni:'
PLS-00111 end-of-file in comment
Asemeni majoritatii limbajelor de programare, un program PL/SQL îsi înceteaza de obicei executia la detectarea unei erori interne de executie, cu exceptia cazului în care utilizati caracteristicile de tratare a exceptiilor ale programului PL/SQL. în acest caz, programul nu trebuie sa-si înceteze executia atunci când survine o eroare. Puteti include rutine care sa trateze erorile astfel încât procesarea sa continue si dupa detectarea erorilor de executie.
Limbajul PL/SQL permite utilizatorului sa-si defineasca propriile exceptii. Aceste exceptii definite de utilizator trebuie sa fie declarate si trebuie generate în mod explicit cu comanda raise.
Pentru informatii suplimentare în legatura cu mecanismul PL/SQL de tratare a exceptiilor, consultati Capitolul 36, "Tratarea exceptiilor de executie în limbajul PL/SQL".
Într-o aplicatie client-server, se întâmpla deseori ca unele blocuri PL/SQL sa se gaseasca atât în partea de aplicatie rezidente în server cât si în cea rezidenta la client. Pentru a proteja portiunea aplicatiei rezidenta la client, programul Oracle permite scrierea blocurilor PL/SQL în format binar, protejând astfel codul sursa împotriva modificarii si a utilizarii gresite.
Limbajul PL/SQL reprezinta extensia procedurala a limbajului SQL al programului Oracle. Aceasta extensie permite programatorilor sa încorporeze functii, proceduri, cursoare si rutine de tratare a exceptiilor în instructiuni procedurale grupate din punct de vedere logic.
Limbajul PL/SQL prezinta numeroase avantaje atât pentru programatori, cât si pentru utilizatori. Printre acestea se numara si reducerea traficului în retea deoarece limbajul PL/SQL va permite sa procesati un întreg bloc de instructiuni odata în loc sa transmiteti serverului instructiunile individuale, una câte una.
În acest capitol, au fost prezentate diversele aspecte legate de crearea blocurilor de instructiuni PL/SQL. De asemenea, a fost prezentat mediul în care opereaza si cu care interactioneaza limbajul PL/SQL.
|