Documente Academic
Documente Profesional
Documente Cultură
Introducere
Perl este un limbaj de programare de nivel nalt orientat spre prelucrarea i
formatarea textelor. Se remarc n primul rnd prin uurina de dezvoltare a aplicaiilor
(mai ales a celor care prelucreaz text) dispunnd de funcii puternice de prelucrare
precum recunoaterea de expresii regulate, indeci asociativi etc. n plus, Perl dispune
de module care realizeaz o multitudine de funcii, de la operaii cu stive, cozi, pn la
sortare, generare automat de grafice, operaii cu socket-uri TCP/IP i acces la baze de
date. Este un limbaj interpretat care se aseamn cu shell-ul UNIX, combinnd n el i
funcii ale altor utilitare UNIX precum sed, cut, awk. Limbajul Perl le extinde ns i le
combin cu puterea expresiilor i operatorilor C, precum i cu faciliti puternice de
programare orientat pe obiecte. Dei este un limbaj interpretat, prin folosirea
funciilor sale foarte puternice se pot obine programe destul de rapide pentru nevoile
obinuite.
Perl are o utilizare foarte larg n dezvoltarea aplicaiilor web, fiind potrivit i
folosit pentru creerea paginilor dinamice (CGI-uri), att n medii de tip Unix (este o
component standard n distribuiile de Linux) ct i n medii Windows. Datorit
funciilor sale care le nglobeaz pe cele oferite de shell-ul Unix, Perl este folosit si in
aplicatiile de administrare ale sistemului de operare Linux.
De cele mai multe ori o aplicaie web dinamic folosete o baz de date, de
unde extrage la cerere anumite date, le formateaz i le afieaz ca o pagin web. Alte
pagini au formulare de culegere de informaii (informaiile respective urmnd s fie
stocate tot ntr-o baz de date). Prin modulul su de accesare a bazelor de date (DBI)
Perl devine o alegere foarte nimerit pentru astfel de aplicaii, avnd avantajul
simplitii n dezvoltare i al portabilitii. Operaiile cele mai complexe (cutri n
baza de date) sunt executate de SGBD, Perl avnd avantajul unui timp de dezvoltare
mai redus decat in cazul unor limbaje de programare compilate, poate putin mai rapide.
Interogarea bazelor de date din Perl
Limbajul Perl poate asigura interogarea unui numr mare de tipuri de baze de
date, de la simplul MsAcces (sau orice alt ODBC) i MySQL pn la Sybase i Oracle.
Fiecare baz de date este diferit. Unele baze de date sunt accesate prin reea,
peste un protocol ca TCP/IP sau IPX, altele sunt accesate local, prin fiiere. Majoritatea
bazelor de date noi sunt accesibile prin reea, prin TCP/IP. De obicei cnd se
ordie"Numampututconectalabazadedate:".DBI>errstr;
my$sth=$dbh>prepare('
SELECT*
FROMangajati
WHERElastname=?
')
ordie"Nuampututparsaqueryul:".$dbh>errstr;
my@data;
print"Introducetinumele:";
while($lastname=<>){#Citescinputulutilizatorului
chomp$lastname;
$sth>execute($lastname)#Executaqueryul
ordie"Nupotexecutaqueryul:".$sth>errstr;
#Citescinregistrarilecareaufacutmatchsileafisez
while(@data=$sth>fetchrow_array()){
my$firstname=$data[1];
my$id=$data[2];
print"\t$id:$firstname$lastname\n";
}
if($sth>rows==0){
print " Nu a fost gasita nici o persoana cu numele
`$lastname'.\n\n";
}
$sth>finish;
print"\n";
print"Introducetinumele:";
}
$dbh>disconnect;
Pentru accesarea din Perl a unei baze de date trebuie n primul rnd ncrcat
modulul DBI. Aceast directiv este comunicat interpretorului Perl prin linia:
useDBI;
Urmtorul pas foarte important este conectarea la baza de date. Pentru aceasta
se folosete metoda connect a obiectului DBI. Aceasta este o funcie care realizeaz
conectarea la baza de date. Orice aplicaie Perl care interogheaz o baz de date trebuie
s conin un astfel de apel.
my$dbh=DBI>connect('DBI:Oracle:personal')
ordie"Numampututconectalabazadedate:".DBI>errstr;
print"Introducetinumele:";
Este necesar apoi un ciclu while pentru a se cere n mod repetat utilizatorului
s introduc un nume spre cutare. Urmatoarea secven realizeaz citirea de la
terminal a unei linii. Simbolul format din caracterele <si> alaturate reprezint
linia curent din buffer-ul de citire de la terminal. n cazul n care citirea eueaz, bucla
while se termin.
while($lastname=<>){
ordie"Nupotexecutaqueryul:".$sth>errstr;
my$id=$data[2];
n final trebuie instruit modulul DBI s informeze baza de date c toate datele
au fost citite i se pot elibera resursele alocate. n cazul n care se face o singur
interogare se poate sri peste acest pas, resursele dealocndu-se la sfritul
programului. Este totui recomandabil s se foloseasc metoda finish, pentru o
date inconsistent. Sa se realizeze o functie Perl care sa realizeze introducerea unui nou
angajat in baza de date in mod atomic sa nu poata apare situatia prezentata mai sus.
Bazele de date avansate (precum Oracle) suport aa-numitele tranzacii,
adic modificri atomice ale bazei de date (care ori se realizeaz n ntregime, ori nu se
realizeaz deloc). De multe ori acest lucru este foarte necesar, modificri ale bazei de
date ntrerupte de evenimente neprevzute (cum ar fi ntreruperi ale alimentrii cu
energie electric sau blocaje ale sistemului de operare) putnd duce la inconsistene ale
bazei de date, greu de descoperit i eliminat. Soluia este ca aceste modificri critice
s se efectueze ntr-o zon separat de baza de date, urmnd ca la apelul unei funcii
commit s fie efectuate modificrile n mod atomic. Detaliile de implementare a
tranzaciilor sunt specifice fiecrei baze de date, eventual algoritmi nepublici.
Iat un exemplu de folosire a tranzaciilor, n care se valideaza modificarile
apelndu-se funcia commit n cazul n care ambele interogri se termin cu succes
sau anulndu-se modificrile facute prin functia rollback n cazul n care una dintre
ele nu se execut cu succes. De notat faptul ca n cazul n care nu se execut funcii
specifice tranzaciilor, Perl apeleaz automat la sfritul programului commit. nainte
de execuia programului este ns posibil s se apeleze rollback pentru anularea
modificrilor fcute.
subnew_employees{
#Argumente:handlerulbazeidedate,numelesiprenumele
#angajatului,IDuldepartamentului
my($dbh,$first,$last,$department)=@_;
my($insert_handle,$update_handle);
my$insert_handle=
$dbh>prepare_cached(
INSERT
INTOemployees
VALUES(?,?,?)
);
my$update_handle=
$dbh>prepare_cached(
UPDATEdepartments
SETnum_members=num_members+1
WHEREid=?
);
dieNupotpregatiqueryurilepentruexecutie
unlessdefined$insert_handle&&defined$update_handle;
my$success=1;
$success&&=$insert_handle>execute($first,$last,$department);
success&&=$update_handle>execute($department);
my$result=($success?$dbh>commit:$dbh>rollback);
unless($result){
dieNupotfinalizatranzactia.$dbh0>errstr
}
return$success;
}
Dac n cazul apariiei unei erori ceea ce se dorete este ieirea din
program, se poate instrui modulul DBI s fac asta automat, cu un apel de
genul:
my$dbh=DBI>connect(DBI:Oracle:personal,{RaiseError=>1},)
ordieNumapotconectalabazadedatecuRaiseError.DBI
>errstr
ncheiere
Acestea au fost numai cteva exemple de construire a programelor de accesare
a bazelor de date Oracle din Perl. Combinndu-le se pot creea uor programe foarte