Sunteți pe pagina 1din 193

Cuprins:

1. INTRODUCERE

2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB LIMBAJUL HTML

2.1. Scurt istoric al apariiei Internetului i funcionarea sa. Reeaua WWW. Conceptul de Hipertext..........8
2.2. Despre website-uri...................................................................................................................................10
2.3. HTML standard limbaj descriptiv al unei pagini WEB........................................................................11

2.3.1 Scrierea de cod HTML. Editoare specializate i validatoare HTML..............................................................12


2.3.2. Structura de baz a unei pagini.......................................................................................................................12
2.3.3. Paragrafe. Atribute ale unui tag......................................................................................................................13
2.3.4. Elemente care permit formatarea textului.......................................................................................................14
2.3.5. Liste................................................................................................................................................................17
2.3.6. Imagini............................................................................................................................................................19
2.3.7. Specificarea culorilor n HTML.....................................................................................................................22
2.3.8. Tabele.............................................................................................................................................................23
2.3.9. Leg turi (link-uri)...........................................................................................................................................26
2.3.10. Elemente de structur (HTML, HEAD, BODY)..........................................................................................29
2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME)....................................................................................31
2.3.12. Bare de separare (HR)..................................................................................................................................35
2.3.13. Formulare......................................................................................................................................................36

2.4. Extinderi ale limbajului HTML standard: HTML dinamic, script-uri.....................................................41


2.4.1. CSS (Cascading Style Sheets)........................................................................................................................41
2.4.2. JavaScript........................................................................................................................................................45
2.4.3. DOM (Document Object Model)....................................................................................................................47

3. LIMBAJUL PHP FACILIT

I ALE ACESTUIA

3.1. Introducere scurt istoric al apariiei limbajului PHP; facilit i i mod de funcionare; similitudini ntre
limbajele PHP i C++...............................................................................................................................51
3.2. Cerine tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii asupra instal rii............52
3.3. Testarea instal rii. Structura unui fiier PHP...........................................................................................53
3.4. Constante. Variabile. Operatori. Afiarea datelor....................................................................................58
3.5. Instruciuni ale limbajului PHP................................................................................................................62
3.5.1. Instruciunea expresie.....................................................................................................................................62
3.5.2. Instruciunea bloc (se mai numete i compus )............................................................................................62
3.5.3. Instruciunea if................................................................................................................................................63
3.5.4. Instruciunea while.........................................................................................................................................63
3.5.5. Instruciunea do...while..................................................................................................................................64
3.5.6. Instruciunea for.............................................................................................................................................64

3.6. Transmiterea datelor prin intermediul formularelor.................................................................................65


3.7. Funcii n PHP..........................................................................................................................................71
3.8. Prelucrarea irurilor de caractere.............................................................................................................74
3.9. iruri (masive) n PHP.............................................................................................................................77
3.10. Programare grafic utiliznd PHP..........................................................................................................80
3.11. Upload de fiiere via PHP......................................................................................................................85
3.12. Variabile cookie.....................................................................................................................................87
3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP
3.13.1. Introducere n MySQL.................................................................................................................................89
3.13.2. Testarea instal rii MySQL. Configurarea bazei de date..............................................................................89
3.13.3. Crearea unei baze de date.............................................................................................................................91
3.13.4. Tabele...........................................................................................................................................................91
3.13.5. Tipuri de date n MySQL.............................................................................................................................93
3.13.6. Operatori utilizai n MySQL. Variabile......................................................................................................96
3.13.7. Funcii predefinite n MySQL......................................................................................................................99
3.13.8. Coloane calculate prin intermediul unei interog ri....................................................................................101
3.13.9. Valoarea NULL..........................................................................................................................................102
3.13.10. Valori implicite pentru coloanele unei tabele...........................................................................................102
3.13.11. Cheie primar i cheie unic .....................................................................................................................103
3.13.12. Coloane cu valori de tip autoincrementare...............................................................................................104
3

3.13.13. Sortarea datelor.........................................................................................................................................105


3.13.14. Filtrarea datelor........................................................................................................................................106
3.13.15. Actualizarea datelor..................................................................................................................................106
3.13.16. Funcii agregate........................................................................................................................................107
3.13.17. Subinterog ri............................................................................................................................................108
3.13.18. Gruparea datelor.......................................................................................................................................109
3.13.19. Uniuni de tabele........................................................................................................................................111
3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP...................................................115
3.13.21. Elementele de baz ale limbajului SQL*PLUS .......................................................................................118
3.13.22. Crearea unei baze de date prin comenzi SQL ..........................................................................................163

Bibliografie:
1. Tudor Sorin i Vlad Huanu, Crearea i programarea paginilor WEB,
Bucureti, L&S Infomat, 2004;
2. Vlad Huanu i Carmen Popescu, Manual de Informatic Intensiv pentru clasa a XII-a,
Bucureti, L&S Infomat, 2007;
3. Bogdan P tru, Internet pentru nceptori,
Bucureti, Teora, 1998;
4. Traian Anghel, Programarea n PHP. Ghid practic,
Iai, Polirom, 2005;
5. Julie C. Meloni, nva singur PHP, MySQL i APACHE,
Bucureti, Corint, 2005;
6. Larry Ulman, PHP i MySQL pentru site-uri web dinamice,
Bucureti, Teora, 2006;

Bibliografie Internet :
7. http://wikipedia.org enciclopedia liber ;
8. http://www.php.net pagina oficial a grupului de lucru pentru dezvoltarea limbajului PHP;
9. http://www.w3schools.com set gratuit de tutoriale i documentaii pentru programarea paginilor we.b.

1. INTRODUCERE

ncepnd cu anii 95, Internetul, sub aspectul s u cel mai popular, i anume al paginilor web,
a cunoscut o amploare greu de imaginat.
Dac la nceput, paginile web aveau un coninut simplu i oarecum stngace, n zilele
noastre aspectul acestora s-a schimbat radical. Dup doar 10 ani, n paralel cu evoluia tehnicii de
calcul, au evoluat i tehnicile de programare a acestora. Primele pagini permiteau doar navigarea
prin coninutul lor, pe cnd n zilele noastre ele au o utilizare foarte larg , de la jocuri i aplicaii
grafice dinamice la comer pe Internet.

Limbajul PHP este un limbaj de programare destinat n primul rnd Internetului, aducnd
dinamic unei pagini web. Este unul dintre cele mai importante limbaje de programare web
open-source (codul surs este public, fiind accesibil tuturor) i server-side (rularea sa nu se face pe
calculatorul celui care vizualizeaz pagina, ci pe server-ul care o conine).
Este unul dintre cele mai folosite limbaje de programare server-side. Statisticile arat c la 1
mai 2008, suportul PHP este prezent pe 20 de milioane dintr-ul total de 70 de milioane de
website-uri active din lumea ntreag .
Popularitatea de care se bucur acest limbaj de programare se datoreaz urm toarelor sale
caracteristici:

Familiaritatea sintaxa limbajului este foarte uoar , fiind foarte la ndemn n

special pentru programatorii care cunosc limbajul C;

Simplitatea sintaxa limbajului este destul de liber . Nu este nevoie de includere de

biblioteci sau de directive de compilare, codul PHP inclus ntr-un document fiind trecut ntre nite
marcaje speciale;

Securitatea PHP-ul pune la dispoziia programatorilor un set flexibil i eficient de

m suri de siguran ;
5

Flexibilitatea fiind ap rut din necesitatea dezvolt rii web-ului, PHP a fost
modularizat pentru a ine pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit
server web, PHP-ul a fost integrat pentru numeroasele servere web exitente: Apache, IIS, Zeus, etc.

Gratuitatea este, probabil, cea mai important caracteristic a PHP-ului. Dezvoltarea

PHP-ului sub licena open-source a determinat adaptarea rapid

a sa la nevoile web-ului,

eficientizarea i securizarea codului.

n capitolul al II-lea al acestei lucr ri (Fundamente teoretice ale paginilor WEB limbajul
HTML) mi-am propus o parcurgere ceva mai am nunit , sub forma unui tutorial, a limbajului
HTML standard, descriind tag-urile cele mai importante i exemplificnd aceste descrieri cu mici
aplicaii. Capitolul se ncheie cu o trecere n revist , n care exist cteva exemple comentate, a
tehnicilor de programare dinamice ale unei pagini web, care r mn ns tot pe domeniul HTML.
Acest capitol este mai mult dect necesar, din cauz c PHP nu face altceva dect s ruleze
programe n urma c ruia este generat cod HTML. Nu putem aadar vorbi de limbajul PHP f r a
cunoate HTML
n capitolul al III-lea (Limbajul PHP facilit i ale acestuia) am f cut, la fel ca i n
capitolul al II-lea, o parcurgere mai am nunit

a elementelor limbajului PHP, cu exemple.

Totodat , n acest capitol exist i cteva detalii tehnice despre instalarea pachetelor software
necesare rul rii.

De remarcat faptul c transcrierea algoritmilor propriu-zii n PHP r mne foarte similar


limbajului C++. Principalul element care face diferena este dat de interfaa acestora, lucru normal
de altfel, deoarece aplicaiile PHP sunt destinate n primul rnd utiliz rii lor pe Internet, deci de
c tre public foarte larg. Este motivul pentru care interfaa trebuie s prezinte un grad ridicat de
interactivitate (adesea vorbim de "interfa inteligent ") astfel nct s permit o comunicare ct mai
simpl dintre utilizator i aplicaie.

2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB LIMBAJUL HTML


2.1. Scurt istoric al apari iei Internetului i func ionarea sa. Re eaua WWW.
Conceptul de Hipertext.

Istoria Internetului ncepe cu anul 1968, cnd guvernul S.U.A. inteniona s interconecteze
universit ile, departamentele militare i de ap rare ale rii, astfel nct ele s coopereze n cadrul
unor proiecte de cercetare comune. Astfel, s-a format o agenie numit Advanced Research Projects
Agency (ARPA). Una din cheile proiectului punea n discuie faptul c , stocarea tuturor informaiilor
pe un singur calculator nu ar fi fost deloc sigur , fie din cauz c acesta ar putea fi int vulnerabil
a unui eventual atac, fie pur i simplu din cauz c acestea ar putea fi pierdute n cazul unei
defeciuni tehnice majore. O metod de a face fa unei asemenea situaii ar fi de a copia i distribui
informaiile pe mai multe calculatoare, n ntreaga ar , folosind o reea.
n 1975, cteva dintre limbajele sau protocoalele pe care calculatoarele le foloseau pentru a
comunica ntre ele s-au standardizat. Majoritatea universit ilor importante i a departamentelor de
ap rare din S.U.A. s-au legat mpreun ntr-o reea numit

DARPANET, toate calculatoarele

folosind acelai protocol pe care ast zi l cunoatem sub denumirea de TCP/IP. Reeaua, cu timpul,
a fost nlocuit de mai multe reele, care ast zi mpnzesc globul p mntesc.
ncepnd cu anul 1980, mai multe colegii i universit i au fost conectate la Internet. Acest
lucru a permis universit ilor s -i mpart informaii despre cercet rile lor, programe i tiri
recente. n anii 90 Internetul s-a deschis i n scopuri comerciale. n curnd, multe alte c i de
utilizare a informaiilor transmise prin intermediul acestei gigantice reele au fost dezvoltate.
n prezent, este posibil s foloseti Internetul pentru a trimite scrisori electronice pe ntregul
glob n doar cteva secunde. Poi c uta informaii despre orice subiect doreti. Expresia World
Wide Web (WWW) definete o colecie de documente care se ntinde n cteva sute de milioane de
calculatoare.
Principiul de baz al funcion rii Internetului const n faptul c dou sau mai multe
calculatoare pot comunica ntre ele. Pentru ca acest lucru s fie posibil este necesar s existe un
protocol, adic un ansamblu de norme care trebuie respectate de calculatoare (deci de programele
care ruleaz pe ele) pentru ca schimbul de date s poat avea loc.
Normele se refer la:

g sirea calculatorului destinatar al transferului de date;


transmiterea efectiv a datelor;

modalit i prin care expeditorul comunic faptul c au fost transmise toate datele, iar

destinatarul comunic faptul c le-a recepionat;


8

compresia datelor: prin aplicarea anumitor algoritmi matematici, datele care urmeaz s fie
expediate sunt prelucrate de aa natur , nct s fie memorate prin utilizarea unui spaiu ct mai mic
de memorie. Prin urmare, transmiterea lor dureaz

mai puin. Invers, la destinaie sunt

decompresate prin utilizarea acelorai algoritmi matematici;

identificarea erorilor care pot interveni n transmiterea datelor: i aici exist mai muli

algoritmi care permit identificarea i corectarea erorilor.


Standardul care s-a impus n ceea ce privete Internetul, const n protocolul TCP/IP.
Numele este de fapt, numele comun al unei familii de protocoale utilizate pentru transferul datelor
n reea. Orice calculator conectat la Internet are o adres , numit adres IP (Internet Protocol
Address). O adres IP este alc tuit din 4 numere ntre 0 i 255, prin urmare o astfel de adres
ocup 4 octei. Cum transmiterea datelor la un moment dat se face ntre dou calculatoare, datele se
transmit de la o adres IP la alta.

Protocolul IP (Internet Protocol) reglementeaz transmiterea datelor de la o adres IP la alta.


Datele sunt transmise divizate n pachete. n acest fel, se prentmpin monopolizarea transmisiei n
reea doar de c tre un singur utilizator.

Protocolul TCP (Transmission Control Protocol): de la plecare, un program TCP mparte


informaia de transmis n mai multe pachete IP. Acestea sunt transmise la destinaie prin
intermediul reelei. O dat ajunse la destinaie, un alt program TCP asambleaz i aranjeaz n
ordinea corect pachetele IP de date primite. Firete, din cauza unor probleme hardware, unele
pachete se pot pierde pe drum. Protocolul TCP se ocup i de acest lucru. Astfel, cnd mpacheteaz
datele ntr-un plic IP, protocolul TCP al expeditorului adaug i un num r (numit sum de
control) care va permite destinatarului s se asigure de faptul c datele primite sunt corecte.
Receptorul recalculeaz suma de control i o compar cu cea transmis de emi tor. Dac ele nu
sunt identice, nseamn c a ap rut o eroare n timpul transmisiei, motiv pentru care protocolul TCP
anuleaz acel pachet, cernd retransmiterea sa.

Bazele World Wide Web (WWW) au fost puse n 1989 la Centrul European de Cercet ri
Nucleare (CERN) n Geneva (Elveia). Propunerea iniial de creare a unei colecii de documente
avnd leg turi ntre ele a fost f cut de Tim Berners-Lee n martie 1989. Aceast propunere a ap rut
n urma problemelor de comunicare pe care le ntmpinau echipele de cercet tori ce foloseau
centrul, chiar i folosind pota electronic .

Primul server web folosit de Tim Berners-Lee a ap rut nu mult nainte de decembrie 1991,
cnd s-a f cut prima lui demonstraie public . Studiul a fost continuat prin apariia primei aplicaii
grafice Mosaic, n februarie 1993, realizat

de cercet torul Marc Andreessen de la centrul

universitar National Center for Supercomputing Applications (NCSA) din oraul UrbanaChampaign din statul federal Illinois, SUA. Ulterior WWW-ul a evoluat pn la ceea ce este ast zi,
un serviciu integrativ i multimedial, avnd ca suport fizic Internetul.
Practic, WWW este un sistem de documente i informaii de tip hipertext legate ele ntre ele,
care pot fi accesate prin reeaua mondial de Internet. Documentele, care rezid n diferite locaii pe
diverse calculatoare-server, pot fi reg site cu ajutorul unei adrese unice. Hipertextul este prelucrat
cu un ajutorul unui program de navigare n web numit browser care descarc paginile web de pe un
server web i le afieaz pe un terminal.
Prin conceptul de hipertext se nelege o form de document electronic, o metod de
organizare a informaiilor n care datele sunt memorate ntr-o reea de noduri i leg turi, putnd fi
accesat prin intermediul programelor de navigare interactiv , i manipulat de un editor structural.
Conceptul de baz

n definirea hipertextului este "leg tura" (link-ul), fie n cadrul aceluiai

document, fie c tre alt document. Leg tura de tip link permite organizarea neliniar a informaiilor.
Un sistem hipertext permite autorului s u s creeze aa-numite "noduri", s le lege ntre ele, iar unui
cititor navigarea de la un nod la altul. Astfel un nod reprezint un concept putnd conine orice fel
de informaie: text, grafic , imagini, animaii, sunete, etc. Nodul surs al unei leg turi se numete
"referin " iar cel destinaie "referent" sau ancor , punctele de leg tur din respectivele noduri fiind
marcate. Activarea marcajelor unei leg turi duce la vizualizarea nodurilor. Asocierea cu unele
elemente mediale a dus la extinderea noiunii de hipertext c tre "hipermedii".

2.2. Despre website-uri.


Noiunea de website (sau pur i simplu site, ori site web) desemneaz o grup de pagini
web multimediale (coninnd texte, imagini fixe, imagini mic toare i chiar sunete), accesibile n
Internet n principiu oricui, de obicei pe o tem anume, i care sunt conectate ntre ele prin aanumite hyperlinkuri. Diversele situri web pot fi oferite de c tre o companie, un proiect, o reea de
utilizatori, o persoan particular , o administraie public i multe altele.

10

Pentru crearea paginilor web s-a impus limbajul HTML (HyperText Markup Language) un
limbaj de marcare, al c rui scop const n prezentarea ntr-un anumit format a informaiilor:
paragrafe, tabele, fonturi, culori, .a.m.d.
Calculatorul pe care se g sete site-ul se numete server, iar calculatoarele care acceseaz
coninutul site-ului se numesc client.
Orice calculator client trebuie s dispun de un program specializat, numit browser, cu
ajutorul c ruia s se poat interpreta i deci vizualiza fiierele HTML.
Pe server trebuie s se g seasc un program care r spunde cererilor browser-ului aflat pe
calculatorul client. Cererea efectuat

de c tre browser i r spunsul server-ului se fac prin

respectarea unui anumit protocol. Acest protocol se numete HTTP (HyperText Transfer Protocol).

2.3. HTML standard limbaj descriptiv al unei pagini WEB.

HTML este un limbaj de marcare orientat c tre prezentarea documentelor text pe o singura
pagin .
Utiliznd un software de redare specializat, numit agent utilizator HTML (cel mai bun
exemplu de astfel de software fiind browserul web) HTML furnizeaz

mijloacele prin care

coninutul unui document poate fi adnotat cu diverse tipuri de metadate i indicaii de redare.
Indicaiile de redare pot varia de la decoraiuni minore ale textului (cum ar fi specificarea faptului
c

un anumit cuvnt trebuie subliniat sau c

o imagine trebuie introdus ) pn

la scripturi

sofisticate, h ri de imagini i formulare. Metadatele pot include informaii despre titlul i autorul
documentului, informaii structurale despre cum este mp rit documentul n diferite segmente,
paragrafe, liste, titluri etc. i informaii cruciale care permit ca documentul s poat fi legat de alte
documente pentru a forma astfel hiperlink-uri.
HTML este un format text proiectat pentru a putea fi citit i editat de oameni utiliznd un
editor de text simplu. Totui scrierea i modificarea paginilor n acest fel solicit cunotine solide
de HTML i este consumatoare de timp. Editoarele grafice cum ar fi Macromedia Dreamweaver sau
Microsoft FrontPage permit ca paginile web sa fie tratate asem n tor cu documentele Word, dar cu
observaia c aceste programe genereaz un cod HTML care este de multe ori de proast calitate.
HTML se poate genera direct utiliznd tehnologii de codare din partea serverului cum ar fi
PHP, JSP sau ASP.

11

2.3.1 Scrierea de cod HTML. Editoare specializate i validatoare HTML.


Crearea unui fiier HTML este foarte simpl , putnd fi f cut cu ajutorul oric rui editor de
text. Totui, pentru a avea un control ridicat asupra corectitudinii codului scris, este recomandat s
utiliz m un editor specializat, care s pun n eviden diversele elemente de marcare (TAG-uri,
numite i elemente sau etichete) sau, mai mult, s poat verifica i detecta erorile.
Din categoria editoarelor care pun n eviden

diferitele elemente face parte editorul

Notepad++, iar din categoria validatoarelor face parte CSE HTML Validator Lite, ambele fiind
gratuite i putnd fi desc rcate de pe Internet.

2.3.2. Structura de baz a unei pagini.

Structura de baz a unei pagini HTML este urm toarea (apl001.html):

Iat i modul n care pagina de mai sus este vizualizat n Internet Explorer:

Din analiza exemplului observ m c :

O pagin ncepe cu tag-ul <HTML> i se termin cu tag-ul </HTML>;

O pagin conine un antet (HEAD) i corpul propriu-zis (BODY);

Antetul este cuprins ntre etichetele <HEAD> i </HEAD>;


Corpul este cuprins ntre etichetele <BODY> i </BODY>;

12

Opional, antetul poate conine titlul paginii, cuprins ntre tag-urile <TITLE> i </TITLE>. Titlul
apare pe bara de titlu a ferestrei afiate n browser.

Corpul poate conine texte i/sau imagini. n exemplu, pagina conine textul Acesta este primul
exemplu de pagina...

Comentariile, care nu sunt afiate de c tre browser, pot fi scrise ntre tag-urile <!-- i -->.

Numele tag-urilor nu sunt case sensitive, deci pot fi scrise att cu litere mici ct i cu litere mari.
n continuare, pentru a le pune n eviden , le vom scrie cu litere mari.

2.3.3. Paragrafe. Atribute ale unui tag.

n general, textele coninute de o pagin se pot g si n mai multe paragrafe. Un paragraf se


introduce ntre tag-urile <P> ... </P>.
La afiare, dou paragrafe consecutive vor fi separate printr-o linie goal .
Tag-ul </P> poate lipsi; un nou paragraf poate fi detectat prin tag-ul <P>.
n cadrul unui fiier HTML, Enter-ul nu are nici un efect. De asemenea, dac dou cuvinte
ale unui paragraf sunt separate prin mai multe spaii sau alte caractere albe (enter-uri, tab-uri),
browser-ul afieaz doar un singur spaiu.

Majoritatea tag-urilor li se pot specifica atribute. Acestea determin comportamentul mai


am nunit al elementului respectiv.

Un atribut se specific nainte de nchiderea parantezei unghiulare a tag-ului (>) prin


nume_atribut=valoare.

n cazul paragrafului, atributul align controleaz alinierea textului din cadrul paragrafului.
Dac acest atribut nu este prezent, alinierea este f cut n mod implicit la stnga. Acest atribut poate
lua una dintre valorile center, left, right, justify, ca n exemplul de mai jos
(apl002.html):
<HTML>
<HEAD>
<TITLE>Alinierea paragrafelor</TITLE>
</HEAD>
<BODY>
<P align="center">Aliniat in centru</P>
<P align="right">Aliniat la dreapta</P>
<P align="left">Aliniat la stinga</P>
<P align="justify">Paragraful acesta este aliniat la ambele margini</P>
</BODY>
</HTML>
13

Iat pagina al c rei cod tocmai a fost prezentat, vizualizat n Internet Explorer:

2.3.4. Elemente care permit formatarea textului.


<BR> : Are ca efect forarea afi rii a ceea ce urmeaz pe rndul urm tor. Acest tag nu
creeaz un nou paragraf (s ne reamintim c ntre dou paragrafe este automat l sat o linie vid )

<B>...</B> : Are rolul de a afia bold (ngroat) textul cuprins ntre cele dou tag-uri ale

sale. Un tag sinonim al lui <B> este: <STRONG>...</STRONG>

<I>...</I> : Are rolul de a afia italic (nclinat) textul cuprins ntre cele dou tag-uri ale

sale. Tag-uri sinonime ale lui <I> sunt: <EM>...</EM>, <DFN>...</DFN>,<CITE>...</CITE>.

<U>...</U> : Are rolul de a afia subliniat textul cuprins ntre cele dou tag-uri ale sale. Un

tag sinonim al lui <U> este: <INS>...</INS>

<S>...</S> : Are rolul de a afia t iat (cu o linie orizontal ) textul cuprins ntre cele dou

tag-uri ale sale. Un tag sinonim al lui <S> este: <DEL>...</DEL>

<BIG>...</BIG> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai

mare dect textul n care este cuprins.

<SMALL>...</SMALL> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale

mai mic dect textul n care este cuprins.

<SUP>...</SUP> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai

sus (ca o putere)

<SUB>...</SUB> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai

sus (ca un indice)

14

<TT>...</TT> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai sus
monospaiat (toate caracterele ocup aceeai lungime practic, se folosete fontul Courier New)
n cod-ul HTML de mai jos g sii toate aceste tag-uri exemplificate (apl003.html):
<HTML>
<HEAD>
<TITLE>Formatarea textului</TITLE>
</HEAD>
<BODY>
<P>
<B>Acest text este afisat folosind tag-ul B</B> <BR>
<STRONG>Acest text este afisat folosind tag-ul STRONG</STRONG> <BR>
<I>Acest text este afisat folosind tag-ul I</I> <BR>
<DFN>Acest text este afisat folosind tag-ul DFN</DFN> <BR>
<EM>Acest text este afisat folosind tag-ul EM</EM> <BR>
<U>Acest text este afisat folosind tag-ul U</U> <BR>
<INS>Acest text este afisat folosind tag-ul INS</INS> <BR>
<S>Acest text este afisat folosind tag-ul S</S> <BR>
<DEL>Acest text este afisat folosind tag-ul DEL</DEL> <BR>
Normal <BIG>Mai mare</BIG> Normal <BR>
Normal <SMALL>Mai mic</SMALL> Normal <BR>
Iata si un <SUP>exponent</SUP> <BR>
iar acum un <SUB>indice</SUB> <BR>
<TT>Acest text este monospatiat</TT>
</P>
</BODY>
</HTML>

Acest cod vizualizat n browser arat n felul urm tor:

Pentru scrierea titlurilor se utilizeaz

tag-urile <H1>...<H1>, <H2>...<H2>, . . . ,

<H6>...<H6>. Practic, n funcie de num rul de dup H m rimea fontului difer (<H1> utilizeaz

fontul de dimensiune maxim , <H6> fontul de dimensiune minim ) iar textul care apare ntre tag-uri
este scris ngroat (bold).

Pentru stabilirea font-ului se folosete tag-ul <FONT>...<FONT>. Atributele acestuia sunt:


- face indic numele font-ului
- size indic m rimea (trebuie s fie un num r cuprins ntre 1 i 7. Implicit este 3)

15

- color permite specificarea culorii. Aceasta se specific fie prin intermediul


constantelor predefinite ale HTML-ului (numele englezesc al culorii) fie prin componentele sale de
Rou, Verde i Albastru exprimate n hexazecimal, de forma #RRGGBB (vom detalia aceste
constante de culoare ceva mai ncolo).
Iat un exemplu de utilizare al lor (apl004.html):
<HTML>
<HEAD>
<TITLE>Exemplificare titluri si font</TITLE>
</HEAD>
<BODY>
<P>
<H1>Acesta este un titlu de tip H1</H1>
<H2>Acesta este un titlu de tip H2</H2>
<H3>Iar acesta este un titlu de tip H3</H3>
<FONT face="arial" color="blue" size="4">
Acest text este scris cu fontul Arial, albastru, dimensiune 4
</FONT><BR>
Iar acest text este scris normal<BR>
</P>
<P>
Iata si culorile cucubeului, scrise cu font-ul Comic Sans MS,
bold, dimensiune 7:<br>
<B>
<FONT face="Comic Sans MS" size="7" color="red">R</FONT>
<FONT face="Comic Sans MS" size="7" color="orange">O</FONT>
<FONT face="Comic Sans MS" size="7" color="yellow">G</FONT>
<FONT face="Comic Sans MS" size="7" color="green">V</FONT>
<FONT face="Comic Sans MS" size="7" color="blue">A</FONT>
<FONT face="Comic Sans MS" size="7" color="darkblue">I</FONT>
<FONT face="Comic Sans MS" size="7" color="magenta">V</FONT>
</B>
</P>
</BODY>
</HTML>

Vizualizat n browser:

Aa cum am v zut, dac n cadrul unui text din cadrul documentului HTML apare un grup de mai
multe spaii, n browser va fi afiat doar unul singur. Dac dorim forarea afi rii unui spaiu, se
folosete identificatorul special &nbsp; (ultimul caracter, ;, face parte din identificator)

16

2.3.5. Liste.
Acestea permit ca anumite enunuri (texte, elemente) s fie numerotate sau marcate ntr-un
anumit fel. O astfel de organizare poart numele de liste.
n HTML distingem 3 feluri de liste:

Liste ordonate (Ordered Lists): sunt liste n care elementele sunt numerotate.
Inserarea lor n cadrul documentului HTML se face prin tag-urile <OL>...</OL>, elementele
(itemii) lor fiind introduse ntre aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfrit nefiind
obligatoriu). Implicit, numerotarea se face cu numere arabe (1, 2, 3, ...). Ea poate fi modificat prin
folosirea atributului type n cadrul tag-ului OL. Acesta poate lua una dintre valorile:
- a : numerotarea se va face cu litere mici (a, b, c, ...)
- A : numerotarea se va face cu litere mari (A, B, C, ...)
- i : numerotarea se va face cu numere romane mici (i, ii, iii, iv ...)
- I : numerotarea se va face cu numere romane mari (I, II, III. IV, ...)
- 1 : (implicit) numerotarea se va face cu numere arabe obinuite (1, 2, 3, ...)
Iat un exemplu de cod i vizualizarea sa n browser (apl005.html):
<HTML>
<HEAD>
<TITLE>Liste</TITLE>
</HEAD>
<BODY>
<P>
Iata o lista ordonata implicita:
<OL>
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</OL>
Iata si o alta lista, cu numere romane
<OL type="i">
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</OL>
</P>
</BODY>
</HTML>

Liste neordonate (Unordered Lists): sunt liste n care elementele nu sunt numerotate, ci n
dreptul fiec ruia este afiat un marcator.
Inserarea lor n cadrul documentului HTML se face prin tag-urile <UL>...</UL>, elementele
(itemii) lor fiind introduse ntre aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfrit nefiind
obligatoriu).
Implicit, marcarea lor se face prin cerculee pline. Ea poate fi modificat prin folosirea
atributului type n cadrul tag-ului UL. Acesta poate lua una dintre valorile:
17

- disc : marcarea se face cu cerculee pline (implicit)


- square : marcarea se face cu p tr ele
- circle : marcarea se face cu cerculee goale
Iat

un

exemplu

de

cod

vizualizarea

sa

browser

(apl006.html):
Iata o lista neordonata implicita:
<UL>
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</UL>
Iata si o alta lista, marcata cu patratele
<UL type="square">
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</UL>
Si alta, marcata cu cerculete goale
<UL type="circle">
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</UL>

Liste de definiie (Definition Lists): au rolul de a descrie o list de definiii.

Inserarea lor n cadrul documentului HTML se face prin tag-urile <DL>...</DL>. Elementele
lor sunt de dou tipuri:
- Termenul care este definit: este introdus ntre tag-urile <DT>...</DT> (tag-ul de
sfrit nefiind obligatoriu).
- Definiia propriu-zis : este introdus ntre tag-urile <DD>...</DD> (tag-ul de sfrit
nefiind obligatoriu).
Iat un exemplu de cod i vizualizarea sa n browser (apl007.html):
Iata o lista de definitie:
<DL>
<DT>Leontopodium Alpinum</DT>
<DD>Este numele stiintific al florii de colt.
Este o planta ocrotita. Creste la altitudini
mari, in locuri stancoase</DD>
<DT>Dianthus Callizonus</DT>
<DD>Este numele stiintific al Garofitei
Pietrei Craiului. Este o planta ocrotita.
Fiind un endemism, este o planta unica in
lume. Practic, aceasta specie de garofita,
in afara de locul sau de origine, si anume
masivul Piatra Craiului din apropierea
Brasovului, nu se mai intilneste in nici un
alt loc de pe planeta</DD>
<DT>Aconitum Napellus</DT>
<DD>Este numele stiintific al Omagului.
Este o planta otravitoare. Totusi, in cantitati
foarte mici contine o substanta activa din care
este preparat un medicament contra tusei</DD>
</DL>

18

2.3.6. Imagini.

Tag-ul utilizat pentru inserarea unei imagini n documentul HTML este <IMG>. Forma
general a acestui element este <IMG atribute>. Acest tag nu are i form de nchidere.
Atributele sale sunt:

src identific fiierul efectiv de pe disc, ce conine imaginea respectiv . Dac imaginea
se afl n directorul curent, se specific doar numele i extensia sa. Dac se afl ntr-un subdirector,
acesta se specific naintea numelui i extensiei imaginii, separat prin caracterul /. Imaginile
recunoscute de majoritatea browser-elor internet sunt de tip .jpg, .gif, .png

align specific tipul de aliniere al imaginii n raport cu textul n cadrul c ruia se afl .

Acesta poate lua una dintre valorile urm toare:


- right : imaginea se aliniaz n dreapta, iar textul care urmeaz este scris n locul
r mas liber, n stnga acesteia;
- left : imaginea se aliniaz n stnga, iar textul care urmeaz este scris n locul
r mas liber, n dreapta acesteia;
- top : doar latura de sus a imaginii se aliniaz cu rndul de text n cadrul c ruia se
afl ; urm torul rnd de text va fi afiat dup imagine, ocupnd ntreaga l ime a ecranului;
- middle : rndul de text n cadrul c ruia se afl imaginea se aliniaz la jum tatea
n imii acesteia; urm torul rnd de text va fi afiat dup imagine, ocupnd ntreaga l ime a
ecranului;
- bottom : doar latura de jos a imaginii se aliniaz cu rndul de text n cadrul c ruia
se afl ; urm torul rnd de text va fi afiat dup imagine, ocupnd ntreaga l ime a ecranului;

Dac dorim ntreruperea unei alinieri de imagine de tip right sau left nainte ca textul s fi

umplut spaiul liber din stnga, respectiv dreapta acesteia, putem folosi tag-ul br, c ruia i ad ug m
unul dintre atributele clear=left sau clear=right sau clear=all, dup caz.

atributul alt=text permite specificarea unui text alternativ ce va fi afiat fie dac

meninem cursorul de mouse asupra imaginii, fie n locul imaginii propriu-zise, n cazul n care
imaginea nu poate fi nc rcat din cauza unei probleme de conexiune.
Iat cteva exemple, cu tot cu vizualizarea lor n browser:
1) Exemplu la folosirea atributului align=right i a atributului
alt=text :(apl008.html)
<P>Acest text este asezat inaintea imaginii<br>
<IMG SRC="dog.jpg" align="right" alt="catelus">
In schimb, acest text este aliniat in stinga imaginii,
deoarece am folosit atributul align="right" in momentul
in care am inserat imaginea in pagina noastra web prin
intermediul tag-ului src.
</P>
19

2) Exemplu la folosirea opiunii align=right mpreun cu tag-ul <br clear=right>


(apl009.html):
<P>
Acest text este asezat inaintea imaginii<br>
<IMG SRC="dog.jpg" align="right" alt="catelus">
Acest text, aliniat in stinga imaginii, il
intrerupem fortat AICI
<BR clear="right">
In acest fel, restul textului se va alinia
in mod obisnuit, sub imagine, restul spatiului
din stinga raminind liber.
</P>

3) Exemplu la folosirea opiunii

align=top

(apl010.html):
<P>
Acest text este asezat inaintea imaginii <br>
Se observa ca
<IMG SRC="dog.jpg" align="top" alt="catelus">
doar primul rind al textului este aliniat cu
latura de sus a imaginii, restul textului
fiind afisat dupa imagine
</P>

4) Exemplu la folosirea opiunii

align=middle

(apl011.html):
<P>
Acest text este asezat inaintea imaginii <br>
Se observa ca
<IMG
SRC="dog.jpg"
align="middle"
alt="catelus">
doar primul rind al textului este aliniat la
jumatatea inaltimii imaginii, restul textului
fiind afisat dupa imagine
</P>

5) Exemplu la folosirea opiunii align=bottom


(apl012.html):
<P>
Acest text este asezat inaintea imaginii <br>
Se observa ca
<IMG SRC="dog.jpg" align="top" alt="catelus">
doar primul rind al textului este aliniat cu
latura de jos a imaginii, restul textului
fiind afisat dupa imagine
</P>

atributele height i width permit specificarea altor dimensiuni pentru imagine, dect
cele reale ale acesteia. Evident, dac dimensiunile nu sunt proporionale cu cele reale, imaginea va
fi deformat . Totodat , dac specific m dimensiuni mai mari dect cele reale, imaginea se va vedea
mai puin clar. n realitate, imaginea este transferat de pe server la dimensiunile sale originale,
redimensionarea avnd loc doar la nivelul calculatorului pe care este vizualizat pagina.
20

Iat un exemplu de folosire al celor dou tag-uri, i vizualizarea


acestui exemplu n browser (apl013.html):
<P>
Imaginea originala are dimensiunile 200x150:
<BR>
<IMG src="dog.jpg">
<BR>
Iat-o redimensionata proportional la 100x75:
<BR>
<IMG src="dog.jpg" width="100" height="75">
<BR>
Iat-o si deformata:<BR>
<IMG src="dog.jpg" width="50" height="100">
sau
<IMG src="dog.jpg" width="150" height="50">
<BR>
</P>

atributul border permite stabilirea grosimii unui chenar care


va nconjura poza. Implicit, valoarea acestui atribut este 0, ceea ce
nseamn c imaginea nu este nconjurat de chenar (apl014.html):
<P>
Imaginea este inconjurata
de un chenar
de dimenisiune 10<br>
<IMG src="dog.jpg" border="10">
</P>

atributele hspace=nr.pixeli respectiv vspace=nr.pixeli permit stabilirea


distantei minime care separa imaginea de celelalte obiecte pe vertical , respectiv pe orizontal
(apl015.html):
<P>
Iata o aliniere a imaginii
de tip "right", aliniere
<IMG src="dog.jpg" align="right">
in cadrul careia nu am modificat
nici unul dintre cele doua
atribute care controleaza
spatierea dintre imagine
si restul elementelor, pe
orizontala respeciv pe
verticala
<BR clear="all"><BR>
Iata acum o aliniere a imaginii
tot de tip "right", aliniere
<IMG src="dog.jpg" align="right"
hspace="15" vspace="20">
in cadrul careia am modificat
ambele atribute care controleaza
spatierea dintre imagine
si restul elementelor, stabilind
valorile de 20 pe verticala
respeciv de 15 pe orizontala
<BR clear="all">
</P>

21

2.3.7. Specificarea culorilor n HTML.

O serie de elemente din HTML permit utilizarea de atribute de culoare. Acestea pot fi
specificate n dou moduri:

prin constanta HTML ce reprezint numele culorii (n englez , bineneles). Exist 216

astfel de constante recunoscute de majoritatea browser-elor. Ne vom limita n a le enumera doar pe


cele 16 care sunt considerate de baz , exemplificndu-le pe fiecare:

O serie dintre culori (ns nu toate) au i constante n variantele dark (nchis) respectiv
light (deschis). De exemplu: darkred sau lightblue.

prin constanta de tip RGB (Red, Green, Blue):


Principiul de baz al red rii electronice ale unei imagini n culori se bazeaz pe amestecarea

n proporii diferite ale culorilor Rou, Verde i Albastru. n acest mod, se poate obine orice
culoare se dorete. n cazul culorilor pe care le poate reda un browser HTML, fiecare dintre aceste
componente de culoare poate avea 256 de st ri posibile: de la 0, care nseamn c respectiva culoare
lipsete cu des vrire, pn la 255, care nseamn c respectiva culoare este folosit la intensitatea
maxim . n acest fel, prin amestecuri diferite, putem obine 2563, deci aproximativ 16 milioane de
nuane diferite.
Componentele de culoare n HTML se specific folosind numere hexazecimale. Astfel, fiecare
dintre numerele dintre 0 i 255 se codific n hexazecimal printr-un num r ntre 00 i FF. Constanta
HTML pentru specificarea unei culori are forma general #RRGGBB, n care RR, GG respectiv BB
reprezint cte un num r hexazecimal cuprins ntre 00 i FF.
Iat cteva exemple de culori obinute folosind constante de forma celei de mai sus:

22

2.3.8. Tabele.

Tabelele reprezint un element foarte important al unei pagini web. n foarte multe cazuri,
tabele cu chenare invizibile sunt folosite ca i schelet al paginii, pentru a putea realiza alinieri
complexe ale elementelor acesteia.

Tag-ul pentru descrierea unui tabel este <TABLE>...</TABLE>. n cadrul acestora trebuie
descrise liniile (rndurile) tabelului, n cadrul fiec rui rnd trebuind descrise celulele acestuia.

Descrierea unui rnd se face ntre tag-urile <TR>...</TR>. La rndul lor, celulele din cadrul
rndului se descriu ntre <TD>...</TD>. Att tag-ul </TR> ct i tag-ul </TD> pot fi omise.
Un prim atribut al tag-ului <TABLE> este border=grosime_pixeli. Dac acest atribut
este omis, tabelul va avea un chenar invizibil. Dac se specific doar atributul, omind grosimea,
aceasta va fi luat , implicit, ca fiind 1.

Iat un exemplu de cod pentru definirea unui tabel (apl016.html):


<TABLE border>
<TR>
<TD>Rindul
<TD>Rindul
<TR>
<TD>Rindul
<TD>Rindul
</TABLE>

1, celula 1
1, celula 2
2, celula 1
2, celula 2

Atribute ale tag-ului <TABLE>


cellpadding=nr_pixeli permite stabilirea unui spaiu care va fi l sat, n fiecare
celul a tabelului, ntre coninutul celulei i marginile acesteia. Dac nu se specific acest atribut, el
este n mod implicit considerat 0

cellspacing=nr_pixeli permite stabilirea spaiului care va fi l sat ntre chenarele

celulelor vecine n tabel (i inclusiv ntre ele i chenarul exterior al tabelului). Dac nu se specific
acest atribut, el este n mod implicit considerat 2.
Coninutul unei celule poate fi ct se poate de general: de la text i imagini pn la alte
tabele (se pot deci construi chiar i tabele imbricate), ca n exemplul urm tor (apl017.html):

23

<TABLE border="1" cellspacing="4" cellpadding="5">


<TR>
<TD>
Poza cu catelus<BR>
<IMG src="dog.jpg">
<TD>
Tabel cu baieti
<TABLE border cellspacing="0">
<TR><TD>Mihai
<TR><TD>Costel
<TR><TD>Alin
</TABLE>
<TD>
Tabel cu fete
<TABLE border cellspacing="0">
<TR><TD>Mihaela
<TR><TD>Costina
<TR><TD>Alina
</TABLE>
</TABLE>

width=lime poate stabili ct de lat s fie tabelul. L imea poate fi dat n procente,
caz n care se va calcula ca i procent din l imea ferestrei browser-ului (ex: width=50%) sau n
pixeli (ex: width=500);

height=nlime poate stabili ct de nalt s fie tabelul. L imea poate fi dat , la fel

ca i n cazul atributului width, n procente sau n pixeli;

align determin alinierea tabelului n pagin . Poate la una dintre valorile left, right

sau center. Dac , pe lng tabel, mai scriem i text, acesta se va poziiona fa de tabel n acelai
mod n care se poziioneaz i fa de imagini;

bgcolor=culoare permite stabilirea culorii de fundal a tuturor celulelor tabelului;

bordercolor=culoare permite stabilirea culorii chenarului (deopotriv cel interior


ct i cel exterior)

Atribute ale tag-ului <TR>


align determin , pentru toate celulele de pe linie, modul alinierii coninutului pe
orizontal , n interiorul celulelor. Poate la una dintre valorile left, right, center sau justify;
valign determin , pentru toate celulele de pe linie, modul alinierii coninutului pe
vertical , n interiorul celulelor. Poate la una dintre valorile top, bottom sau middle;
bgcolor determin , pentru toate celulele de pe linia respectiv , culoarea de fundal.

Atribute ale tag-ului <TD>


width i height determin , pentru celula respectiv , l imea i n limea. Poate fi dat n
procente sau pixeli. Dac e specificat n procente, se va lua din l imea, respectiv n limea
24

tabelului. Modificarea l imii i a n limii unei celule va avea efect i asupra celorlalte celule,
pentru ca tabelul s fie aliniat;

align i valign stabilesc, la fel ca i n cazul lui <TR>, modul n care este aliniat

coninutul n interiorul celulei, pe orizontal respectiv pe vertical , fiind prioritare fa de alinierea


la nivel de linie

colspan=n stabilete ntinderea celulei respective n dreapta cu n coloane

(echivalentul operaiei Merge Cells din Word, n cazul n care unim celule adiacente pe orizontal );

rowspan=n stabilete ntinderea celulei respective n jos cu n linii (echivalentul

operaiei Merge Cells din Word, n cazul n care unim celule adiacente pe vertical );

bgcolor determin , pentru celula respectiv , culoarea de fundal. Evident, este prioritar

fa de acelai atribut la nivel de linie.


Exemplu (apl018.html):
<TABLE border="1" cellspacing="0" cellpadding="5">
<TR bgcolor="#c0c0ff">
<TD>Ziua
<TD>09h00 - 11h00
<TD>11h00 - 13h00
<TD>13h00 - 15h00
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Luni</B>
<TD colspan="2">Mecanica
<TD bgcolor="#ffd0d0">Termodinamica
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Marti</B>
<TD>Electrostatica
<TD>Optica
<TD>Atomica
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Miercuri</B>
<TD rowspan="2" bgcolor="#ffd0d0">Termodinamica
<TD>Optica
<TD>Electrostatica
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Joi</B>
<TD>Mecanica
<TD>Optica
</TABLE>

Tag-ul <TH>...</TH> poate nlocui <TD>...</TD>. Atributele sunt aceleai. Singura


diferen este c textele de dup tag-ul <TH> sunt, n mod implicit, tip rite ngroat (Bold) iar
alinierea lor se face pe centru;

Tag-ul <CAPTION>...</CAPTION> permite scrierea unui titlu pentru tabel. Acest tag

trebuie s se g seasc imediat dup </TABLE>. Acest tag suport atributul align. Acesta poate lua
una dintre valorile: left (titlul va fi poziionat n stnga sus), right (poziionare dreapta sus), top
(poziionare pe centru sus), bottom (poziionare pe centru jos);

25

Exemplu (apl019.html):
<H3>Colegiul National "Andrei Saguna"</H3>
<TABLE border="1" cellspacing="0"
cellpadding="5" align="left">
<CAPTION align="bottom">
Scorul pe echipe</CAPTION>
<TR><TH>Echipa<TH>Punctaj
<TR><TD>clasa a 9-a A<TD align="right">87
<TR><TD>clasa a 10-a B<TD align="right">80
<TR><TD>clasa a 12-a B<TD align="right">91
</TABLE> <FONT color="blue">
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
</FONT>

2.3.9. Legturi (link-uri).

Aa cum am v zut n partea introductiv a acestui capitol, noiunea de www este strns
legat de documentele de tip hipertext.
Tot ceea ce am prezentat din limbajul HTML pn n momentul de fa , reprezint doar
partea descriptiv a acestuia, cu ajutorul c reia putem crea un coninut static.
Link-urile reprezint mecanismul prin care:

putem face ca un vizitator al paginii, prin executarea unui click, s poat accesa o alt
pagin , la care dorim s -i cre m posibilitatea unui acces rapid i, dac acesta dorete, s poat
reveni n pagina iniial prin ap sarea butonului Back al browser-ului de Internet;

putem face ca un vizitator al paginii noastre s primeasc un anumit fiier, de orice tip,

care se g sete pe site-ul nostru (download);

putem face ca un vizitator al paginii noastre s poat asculta un mesaj sonor sau chiar s

poat viziona un film;

putem ca, printr-un click, s putem vizualiza o pagin (inclusiv cea curent ) doar dintr-un

anumit loc, f r a folosi barele de derulare;

putem ca, prin accesarea unui click, cel care viziteaz pagina s ne poat trimite un e-mail.

Pentru toate acestea, vom folosi tag-ul <A>...</A>, numit i Ancor .

26

Ancore de leg tur c tre alte pagini

Acestea permit ca un anumit element din document s conin leg tura c tre o alt pagin .
Elementul care face leg tura este de obicei un text sau o imagine. De regul , elementul legat i
schimb aspectul fa de cel clasic: textul va fi subliniat i colorat altfel, iar imaginea va avea un
chenar colorat. n momentul n care ducem cursorul deasupra elementului legat, acesta cap t forma
unei mini, indicndu-ne astfel c este vorba de un link pe care l putem utiliza. Printr-un simplu
click, acces m pagina c tre care este f cut leg tura.
Acest tip de leg tur se realizeaz practic folosind atributul href, ca n exemplul de mai jos
(a se remarca modul n care, elementul legat, este inclus ntre tag-urile <A href=...> i </A> :
apl020.html):
<p> Prin executarea unui click
<A href="http://mail.yahoo.com">
pe acest text </A>
poti accesa direct pagina de mail yahoo.
</p>

Dup cum se observ , atributul href primete adresa complet a paginii c tre care dorim s
facem leg tura. Dac e vorba de un fiier local, din acelai director cu pagina din care facem
leg tura, la href este suficient s scriem numele i extensia (de ex: href=pagina.htm)

Ancore de leg tur c tre fiiere (pentru download)

Se realizeaz n mod analog cu cele c tre alte pagini, la atributul href trebuind specificat
adresa fiierului respectiv (dac este n acelai director cu pagina din care facem leg tura, e
suficient s -i scriem numele i extensia).
Ex: n cazul n care fiierul pentru download este local:
Pentru download arhiva executa un click
<A href="arhiva.zip">aici</A>

Ex: n cazul n care fiierul pentru download se afl la alt adres :


Pentru a descarca subiectele de bacalaureat la disciplina informatica, da un click
<A href="http://subiecte2008.edu.ro/bacalaureat/subiecte/E_informatica_c.zip">aici</A>

Leg turile c tre fiiere de tip sunet sau film se fac absolut n aceeai manier . n funcie de extensia
lor (.wav, .mid, .mp3, .avi) n momentul execut rii unui click asupra obiectului care face leg tura
c tre ele, acestea vor fi deschise automat c tre browser cu programul corespunz tor.

27

Leg turi relative la con inutul documentului (paginii)

Sunt acele ancore care permit accesarea direct a unei pagini web ntr-un anumit loc, f r a
mai folosi barele de derulare pentru a ajunge n acel loc.
Pentru aceasta, locul respectiv trebuie marcat. Acest lucru se face tot cu ajutorul tag-ului
<a>, ns

folosind atributul id, care va denumi locul respectiv printr-un identificator, ca n

exemplul de mai jos (a se observa c ntre tag-ul de deschidere i cel de nchidere putem s nu
punem nici un element):
<A id=capitolul2></A>

Accesarea direct a acestui loc cu ajutorul unui link se poate face astfel:
a) Din interiorul aceleii pagini: specificnd la atributul href identificatorul respectiv (cel
de la id) nainte de care se pune de caracterul #, ca n exemplul urm tor:
<A href=#capitolul2>Salt direct la capitolul 2</A>

b) Din alt pagin : specificnd la atributul href adresa paginii accesate (a fiierului html)
urmat de caracterul #, ca n exemplul urm tor:
<A href=http://www.myserver.ro/document.html#capitolul2>Deschide documentul extern,
direct la capitolul 2</A>

Ancor de leg tur pentru trimiterea unui e-mail

Acestea permit ca, atunci cnd o persoan ne viziteaz site-ul, dac dorete, s ne poat
trimit un e-mail f cnd un simplu click pe leg tura respectiv . Totui, pentru ca acest lucru s fie
funcional, cel care viziteaz site-ul trebuie s aib configurat pe calculatorul s u un client de e-mail
(cel mai frecvent este Outlook Express).
Iat un exemplu pentru o astfel de ancor :
<ADDRESS>
Click <A href=mailto:somebody@someserver.com>aici</A> pentru a trimite un e-mail
</ADDRESS>

(tag-ul <ADDRESS>...</ADDRESS> nu face altceva dect s afieze textul din cadrul s u italic)

Dup cum se observ , pentru trimiterea unui e-mail, dup atributul href trebuie specificat
mailto: urmat de adresa de e-mail a destinatarului.

28

2.3.10. Elemente de structur (HTML, HEAD, BODY).

Dup cum am v zut n partea introductiv , orice document html este cuprins ntre tag-urile
<HTML> i </HTML>. El este alc tuit dintr-un unic antet (HEAD) i un unic corp (BODY). Aceste 3

elemente au rolul de a defini structura documentului. Din acest motiv ele se mai numesc i elemente
de structur .

Tag-ul BODY poate conine urm toarele atribute:

background=fiier_imagine permite specificarea unei imagini de fundal. Aceasta


se va repeta att pe orizontal ct i pe vertical , pn cnd se acoper ntreaga suprafa necesar
corpului;

bgcolor=culoare permite specificarea unei culori de fond;

text=culoare permite specificarea culorii ntregului text cuprins n pagin ;


link=culoare permite specificarea culorii unui link nevizitat;

alink=culoare permite specificarea culorii unui link activ; un link este considerat
activ n timpul vizit rii i imediat dup aceasta;

vlink=culoare permite specificarea culorii unui link vizitat, care nu mai este activ.

Con inutul sec iunii <HEAD>

n cadrul acestei seciuni putem ntlni diverse alte tag-uri. Despre tag-ul <TITLE> am
discutat deja, el permind scrierea unui titlu pentru pagin .
n afar de acestea, vom aminti nc alte 3 tag-uri:

<BASE> permite stabilirea unei adrese de baz pentru resurse. Acest tag se folosete n
special atunci cnd resursele (sau, n fine, o mare parte a acestora) se g sesc n alt director dect cel
n care se afl documentul curent. n acest fel, folosirea fiierelor din directorul specificat n BASE
se poate face direct prin numele i extensia lor. Specificarea se face prin:
<BASE href=adresa resurse>

<META> este folosit pentru a furniza informaii motoarelor de c utare. Unele dintre acestea
viziteaz doar antetul pentru a obine informaii. Informaiile coninute de acest element nu sunt
afiate de browser, ns este important s l folosim pentru ca informaiile coninute n site-ul nostru
s fie accesibile. Locul tag-ului <META> este n antet (<HEAD>).
29

Atributele tag-ului <META> sunt name i content. Folosirea lor este ceva mai particular ,
rezultnd din exemplele urm toare:
- pentru a specifica autorul unui document:
<META name=Author content=Prenume NUME>

- pentru a specifica titlul unui document:


<META name=TITLE content=Metode de programare>

- pentru a preciza cuvintele cheie dup care s fie reg sit site-ul:
<META name=KEYWORDS content=backtracking, divide et impera,
greedy, programare dinamica>

- pentru a specifica limba n care este scris site-ul:


<META name=LANGUAGE content=RO>

Exist i alte atribute ale elementului META, ns cele dou deja prezentate sunt suficiente.
<STYLE> este utilizat pentru introducerea stilurilor. Acestea permit stabilirea mai
am nunit a modului n care apar, implicit, diferitele elemente din document. Valorile se trec ntre
<STYLE>...</STYLE>.

Exemplu:
<STYLE>
P {font-family:Comic Sans MS; font-size:14pt;}
</STYLE>

Prin specificarea lui P nainte de paranteza acolad , stabilim ca modul implicit de afiare al
paragrafelor (s ne reamintim c <P> este tag-ul pentru paragraf) s fie cel descris ntre parantezele
acolade, deci, n cazul exemplului de fa font-ul folosit s fie Comic Sans MS, iar dimensiunea
caracterelor s fie de 14.
<SCRIPT> este utilizat pentru introducerea anumitor secvene de program n cadrul
paginilor web. Exist

mai multe limbaje (numite de scriptare) care permite scrierea acestor

secvene, cum ar fi JavaScript, VBscript. Specificarea limbajului n care este codat scriptul se face
cu ajutorul atributului language, ca n exemplul de mai jos (apl021.html):
<SCRIPT language="JavaScript">
function calcul()
{ s=0; for(i=1;i<=10;i++)
s+=i;
alert("suma nr. de la 1 la 10 este: "+s);}
</SCRIPT>
...
<BODY onload="calcul();"> ... </BODY>

Acest exemplu definete n antetul paginii o funcie JavaScript capabil s calculeze suma
numerelor de la 1 la 10 ntr-o variabil s i-apoi s afieze valoarea obinut prin intermediul unei
ferestre de dialog. Funcia este apelat automat (atributul onload) la nc rcarea paginii.
30

2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME).

Utilizarea frame-urilor permite ca, n cadrul aceleiai ferestre ale browser-ului s fie afiate
simultan mai multe documente HTML (sau alte resurse).
Tag-ul <FRAMESET> are rolul de a mp ri fereastra n mai multe cadre. n fiierul HTML,
el nlocuiete tag-ul <BODY>. Iat cteva atribute ale lui FRAMESET:

rows descrie liniile n care este mp rit seciunea FRAMESET respectiv

cols descrie coloanele n care este mp rit seciunea FRAMESET respectiv

descrierile pentru rows, respectiv cols, pot fi de forma:


<FRAMESET rows=30%, 50%, 20%>
<FRAME ...>
<FRAME ...>
<FRAME ...>
</FRAMESET>

n acest exemplu, se definesc 3 cadre orizontale (linii) de n limi 30%, 50% respectiv 20% din
n limea ferestrei.

Un alt exemplu, n care n limea cadrelor este definit proporional:


<FRAMESET rows=3*, 1*, 2*>...

aici se definesc 3 cadre orizontale, proporionale cu 3, 1 i 2 dintr-o n lime de 3+2+1=6


(deci cadrele vor fi 3/6, 1/6 respectiv 2/6 din n limea ferestrei)

Un alt exemplu, n care n limea cadrelor este definit n pixeli:


<FRAMESET rows=100, 200, *>...

aici se definesc trei frame-uri: unul de n lime de 100 de pixeli, altul de 200 de pixeli, al treilea
fiind alocat cu spaiul r mas.

Tag-ul <NOFRAMES>...</NOFRAMES> reprezint coninutul care va fi afiat unui vizitator,


n cazul n care browser-ul s u nu poate afia cadre (n prezent, nu prea mai este cazul unor
asemenea browsere).

Fiecare tag <FRAMESET>...</FRAMESET> trebuie ca, dup definirea aspectului (cu ajutorul
unuia dintre atributele cols sau rows) s conin descrierile fiec ruia dintre cadrele definite. Acest
lucru se face cu ajutorul tag-ului <FRAME> prin intermediul atributelor:

src adresa fiierului HTML sau a imaginii care se va nc rca iniial n cadru;

marginheight marginile (n pixeli sau procent) fa de partea de sus i cea de jos;

marginwidth marginile (n pixeli sau procent) fa de partea din stnga i din dreapta;

31

frameborder poate lua valorile 1 (implicit ), care nseamn c acest cadru este separat
de celelalte printr-un chenar, respectiv 0, care nseamn c acest cadru nu mai este separat de
celelalte printr-un chenar.

scrolling trateaz afiarea barei de scroll (derulare). Poate lua trei valori:
auto valoarea implicit . Bara de scroll este prezent numai dac este cazul
yes bara de scroll este totdeauna prezent
no bara de scroll nu va fi niciodat afiat

noresize dac atributul acesta este prezent (el se folosete f r a i se atribui nici o
valoare) atunci vizitatorului paginii nu i se va permite s redimensioneze cadrul. Prezena acestui
atribut pentru un cadru nu permite nici redimensionarea cadrelor vecine.

name este un atribut foarte important. Prin intermediul s u va putea fi identificat

frame-ul respectiv. Acest lucru este foarte important, deoarece dintr-un cadru se poate comanda
coninutul oric rui alt cadru.
Deschiderea unei pagini ntr-un anumit cadu, prin intermediul ancorelor, se poate specifica
prin folosirea atributului target=nume cadru imediat dup folosirea atributului href n
cadrul tag-ului <A href=... .. >.

Iat un exemplu prin care definim o pagin cu dou frame-uri verticale. Frame-ul din stnga
va conine numele a 3 zile ale s pt mnii (pe limba romn ). Accesarea fiec ruia va produce
deschiderea n frame-ul drept a unei pagini care va conine traducerea numelui zilei respective n 4
limbi.
n total vom avea de construit 5 fiiere:
- un fiier pentru pagina iniial , cea care definete scheletul paginii cu frame-uri
- un fiier cu cele 3 zile ale s pt mnii, pe fiecare dintre ele fiind pus cte un hyperlink care va
deschide traducerea numelui s u n cel lalt frame
- 3 fiiere cu traducerilor numelor zilelor n 4 limbi str ine.

Pagina iniial (apl022pagframe.html):


<HTML>
<HEAD>
<TITLE>Pagina cu frames</TITLE>
</HEAD>
<FRAMESET cols="30%,*">
<FRAME name="stinga" src="apl022zile.html" noresize>
<FRAME name="dreapta" src="apl022luni.html">
</FRAMESET>
<NOFRAMES>
Browser-ul tau nu este capabil sa afiseze pagini cu frame-uri
</NOFRAMES>
</HTML>

32

De remarcat faptul c aceast fiier HTML nu conine dect scheletul cadrelor, ele urmnd a
fi populate iniial, dup cum remarcai din codul surs , cu fiierele apl022zile.html pentru
primul cadru (cel din stnga) respectiv cu fiierul apl022luni.html pentru cel de-al doilea cadru.
Observai modul n care au fost definite cadrele n cadrul tag-ului FRAMESET:
cols="30%,*". Acest lucru semnific prezena a dou cadre verticale (coloane) dintre care primul

va ocupa 30% din l imea ferestrei, iar al doilea restul (lucru semnificat de caracterul * care
nchide irul de definiie al cadrelor).
De asemenea, atributul noresize n cadrul primului tag FRAME mpiedic redimensionarea
cadrelor de c tre utilizator. n cazul n care acest atribut nu ar fi fost prezent, utilizatorul, printr-un
simplu drag and drop ar fi putut trage bara care separa cele dou frame-uri, dndu-i orice poziie
ar fi dorit.
Dac nc rc m n browser-ul de internet documentul creat n acest stadiu, f r ca pe disc s
existe vreunul dintre celelalte patru fiiere planificate, am obine urm torul rezultat:

Acesta era i de ateptat, de altfel, deoarece el demonstreaz existena frame-urilor i lipsa


coninutului.
Iat i coninutul celorlalte fiiere, pe care le vom pune n acelai director cu documentul de
mai sus (n dreptul fiec ruia vom ar ta i vizualizarea sa n browser):
Fiierul apl022zile.html:
<HTML>
<HEAD> <TITLE>Zilele</TITLE> </HEAD>
<BODY>
<br>
<A href="apl022luni.html" target="dreapta">Luni</A><br><br>
<A href="apl022marti.html" target="dreapta">Marti</A><br><br>
<A href="apl022miercuri.html" target="dreapta">Miercuri</A><br><br>
</BODY>
</HTML>

De remarcat modul n care am realizat link-urile asupra celor 3 cuvinte: folosind i atributul
target n cadrul ancorei (<A ...>) am specificat browser-ului ca paginile respective s fie

deschise n cadrul frame-ului al c rui nume apare dup target.


33

Fiierul apl022luni.html:

Fiierul apl022marti.html:

Fiierul apl022miercuri.html:

<HTML><BODY>
<H2>Luni</H2>
FR: Lundi<BR>
IT: Lunedi<BR>
GE: Montag<BR>
EN: Monday<BR>
</BODY></HTML>

<HTML><BODY>
<H2>Marti</H2>
FR: Mardi<BR>
IT: Martedi<BR>
GE: Dienstag<BR>
EN: Tuesday<BR>
</BODY></HTML>

<HTML><BODY>
<H2>Miercuri</H2>
FR: Mercredi<BR>
IT: Mercoledi<BR>
GE: Mittwoch<BR>
EN: Wednesday<BR>
</BODY></HTML>

Iat cum arat vizualizarea final n browser (dup crearea celor 4 fiiere de mai sus):

Evident, la efectuarea unui click asupra leg turilor (luni, marti, miercuri) din partea stng ,
se va produce deschiderea paginii corespunz toare n frame-ul drept.

Tag-ul <IFRAME> este un element care nu a fost prezent n primele versiuni ale limbajului
HTML, ci a ap rut ceva mai nou. Actualmente, folosirea sa este preferat de majoritatea celor care
programeaz pagini web, deoarece se comport ceva mai flexibil dect cadrele clasice. Totodat ,
motoarele de c utare nu indexeaz coninutul paginilor cu frame-uri obinuite, pe cnd cele care
conin iframe-uri sunt indexate.
Prin intermediul s u, este permis crearea unui cadru n corpul unui documente HTML,
cadrul care se comport asem n tor unei imagini.
Atributele lui IFRAME sunt:

name la fel ca i la FRAME, acest atribut permite identificarea IFRAME-ului (pentru a

putea comanda coninutul s u din orice link)

height, width n limea, respectiv l imea. Pot fi specificate att n pixeli, ct i n

procente, relativ la dimensiunile ferestrei browser-ului

frameborder poate lua valoarea 0 sau 1, la fel ca la elementul FRAME

src adresa resursei care va fi nc rcat iniial n IFRAME

marginwidth, marginheight, scrolling la fel ca i la FRAME

align poate lua una dintre valorile left, right, top, bottom, middle,

comportndu-se ntocmai ca i n cazul imaginilor

34

Iat reluarea aceleiai idei structurale ca i la aplicaia de dinainte (cu frame-uri clasice) ns
folosind un element de tipul IFRAME. Fiierele apl022luni.html, apl022marti.html
respectiv apl022miercuri.html le p str m nemodificate. Practic, mai cre m doar un singur
fiier HTML, cu coninutul urm tor, i avem grij s copiem n acelai director i cele 3 fiiere de
mai sus (apl023.html):
<HTML>
<HEAD><TITLE>Elementul IFRAME</TITLE></HEAD>
<BODY>
<IFRAME name="cadru" width="140"
height="160" align="right" src="apl022luni.html">
</IFRAME>
<BR>
<A href="apl022luni.html" target="cadru">
Luni</A><BR><BR>
<A href="apl022marti.html" target="cadru">
Marti</A><BR><BR>
<A href="apl022miercuri.html" target="cadru">
Miercuri</A><BR><BR>
</BODY>
</HTML>

2.3.12. Bare de separare (HR).


Bara de separare, al c rei tag este <HR> reprezint un element decorativ. De obicei se
folosete pentru a separa anumite seciuni ale paginii web.
Atributele sale sunt:

width permite specificarea lungimii sale. Poate fi dat n pixeli sau n procente. Dac
acest atribut lipsete, atunci lungimea sa va fi maxim (din marginea stng i pn marginea
dreapt a ferestrei);

size permite specificarea n limii barei. Se specific n pixeli;

color permite specificarea culorii sale.

Exemplu (apl024.html):
<BODY>
O linie clasica:
<HR>
<CENTER>O linie de lungime 50%</CENTER>
<HR width="50%">
<CENTER>O linie de lungime 200 de pixeli,
grosime 10 pixeli, de culoare rosie</CENTER>
<HR width="200" size="10" color="red">
</BODY>

35

2.3.13. Formulare.

Formularele sunt elemente ale limbajului HTML. Ele reprezint o grupare de componente
care permit trimiterea de date i de comenzi c tre un server. Acesta trebuie s fie mai mult dect un
clasic server HTTP, trebuind s aib instalat i o component capabil de a r spunde comenzilor i
a prelucra datele. Cea mai popular astfel de component , foarte larg utilizat n ultimii 10 ani n
programarea pe Internet este limbajul PHP, de care ne vom ocupa pe larg n capitolul al III-lea al
acestei lucr ri.
Pentru moment ne vom concentra asupra componentelor unui formular i a aspectului
acestora.

Un formular este descris prin intermediul tag-ului <FORM>...</FORM>. Atributele acestuia


sunt:

action=adresa acest atribut specific adresa script-ului care se va ocupa de a

r spunde la comenzi i de a prelucra datele.

method acest atribut specific modul n care datele vor fi transmise c tre server.

Distinge, dou valori pe care le poate lua acest atribut, i anume:


- get datele sunt la vedere acest lucru nseamn c , n momentul trimiterii lor
c tre server, ele vor ap rea scrise n clar, n bara de adres , ntr-un anumit format standard. De
exemplu, dac formularul trimite c tre pagina test.php o variabil a care este egal cu 5, n bara de
adres a browser-ului ne va ap rea http://.../test.php?a=5. Un dezavantaj major al acestei
metode de trimitere a datelor este c volumul acestora este limitat (datorit irului de caractere din
adres , care este limitat n cazul fiec rui browser).
- post datele nu mai apar n mod explicit utilizatorului. Totui, ele nu sunt
criptate practic, un program r uf c tor le poate intercepta.

Pe lng componentele specifice, un formular poate conine orice fel de alte elemente valide
de HTML tabele, imagini, text, bare de separare ...
n continuare vom prezenta cteva din componentele unui formulare, prin intermediul c rora
utilizatorul poate introduce date i trimite apoi aceste date c tre server. Un atribut foarte important
al oric ruia dintre aceste componente este name, deoarece prin intermediul s u, server-ul care va
primi datele va ti despre care dintre controale este vorba.

36

Cmpuri text

Permit utilizatorului s introduc date ntr-un cmp de tip edit (pe o singur linie).
Aceste se specific prin tag-ul
<INPUT type=text ...>

Atributele sale sunt:

size specific l imea (n num r aprox. de caractere) cmpului text; Dac acest
parametru este omis, este implicit considerat ca fiind 20;

maxlength specific num rul maxim de caractere ce pot fi scrise n cmpul text. Acest

atribut poate primi o valoare mai mare dect cea scris la size, caz n care, textul va defila n control
(stnga dreapta) n cazul n care scriem mai multe caractere dect cte ncap n poriunea vizibil .
Omiterea acestui atribut va permite introducerea unui num r foarte mare de caractere (limita difer
de la un browser la altul);

name numele cmpului text (prin care server-ul va identifica acest cmp, pentru a prelua

datele din el);

value poate specifica o valoare care s fie iniial (la nc rcarea paginii) deja scris n

cadrul controlului. Dac omitem acest atribut, cmpul text va fi gol.

Butoane de tip submit

Aceasta componenta se prezint sub forma unui buton. Prin ap sarea sa are loc trimiterea
tuturor datelor din formular c tre script-ul de pe server-ul care le va prelucra.
Un control de tip submit se specific prin tag-ul:
<INPUT type=submit ...>

Atributele sale sunt:

name numele de identificare a componentei. Putem omite acest atribut. El se folosete n


cazul n care aceluiai formular dorim s -i ata m mai multe butoane de acest tip, iar ap sarea
fiec ruia s produc o aciune diferit ;

value textul care va fi scris pe buton. De altfel, aceasta va fi i valoarea pe care server-

ul o va primi pentru acest control.

37

Cmpuri de tip password


Se comport identic cu cmpurile de tip text. Singura deosebire este c , la scrierea de text n
ele, acesta nu va fi vizibil, ci n locul caracterelor introduse se vor afia asterisc-uri. Totodat , textul
dintr-un astfel de control nu poate fi luat cu copy/paste.
Controalele de acest fel se specific prin tag-ul:
<INPUT type=password ...>

Atributele sunt identice cu cele de la <INPUT type=text ...>


Cmpuri de tip butoane radio
Sunt controalele care permit ca, dintr-o serie de opiuni posibile, utilizatorul s aleag una
singur . Controalele de acest fel se specific prin tag-ul:
<INPUT type=radio ...>

Atributele sale sunt:

name numele de identificare al componentei. Este obligatoriu ca toate butoanele care


aparin aceluiai grup (deci seria de opiuni din care trebuie aleas doar una singur posibil ) s
poarte acelai nume de identificare;

value valoarea pe care o va ntoarce butonul respectiv, dac el a fost cel ales;

checked dac acest atribut este prezent, butonul respectiv va fi ales n mod implicit, la

nc rcarea paginii. Este recomandabil ca, dintre toate butoanele care aparin aceluiai grup, exact
unul singur s conin acest atribut.
Iat i un exemplu care combin controalele prezentate pn acum (apl025.html):
<FORM action="nefunctional.php" method="post">
Introdu numele tau de familie
<INPUT type="text" size="10" maxlength="20"
name="numele">
<BR><BR>Alege-ti si o parola
<INPUT type="password" size="10" maxlength="20"
name="parola">
<BR><BR>
Alege ce fel de studii ai:<BR><BR>
<INPUT type="radio" name="studii" value="scprim">
Doar scoala primara<BR>
<INPUT type="radio" name="studii" value="8clase">
Scoala primara si cea generala (8 clase)<BR>
<INPUT type="radio" name="studii" value="medii"
checked>
Studii medii (liceul si eventual un curs postliceal)
<BR>
<INPUT type="radio" name="studii" value="univ">
Studii universitare<BR><BR>
<INPUT type="submit" value="Trimite datele">
</FORM>

Evident, acest exemplu este nefuncional, n sensul c datele din formular nu sunt prelucrate.
Acest lucru va face obiectul capitolului urm tor, i anume preluarea datelor dintr-un formular prin
intermediul limbajului php.
38

Cmpuri de tip checkbox


Sunt controale care permit bifarea sau tergerea bif rii unei c sue. Din punct de vedere
practic, ele permit utilizatorului s marcheze una, nici una, sau mai multe opiuni.
Controalele de acest fel se specific prin tag-ul:
<INPUT type=checkbox ...>

Atributele sale sunt:

name numele de identificare al componentei;

value valoarea pe care o va ntoarce controlul respectiv;

checked dac acest atribut este prezent, atunci controlul va fi bifat la nc rcarea paginii.
Exemplu (apl026.html):
<FORM action="nefunctional.php" method="post">
Alege din lista de mai jos limbile
pe care le cunosti:<BR><BR>
<INPUT type="checkbox" name="rom" value="1" checked>
Limba romn<BR>
<INPUT type="checkbox" name="eng" value="2">
Limba engleza<BR>
<INPUT type="checkbox" name="fr" value="3">
Limba franceza<BR>
<INPUT type="checkbox" name="germ" value="4">
Limba germana<BR><BR>
<INPUT type="submit" value="Trimite datele">
</FORM>

Cmpuri ascunse (de tip hidden)

Aceste componente permit trimiterea de valori c tre server (o dat ce butonul submit a fost
ap sat) f r ca acestea s fie vizibile n cadrul form-ului. Practic, aceste componente se specific
doar n cadrul codului HTML:
<INPUT type=hidden name=nume value=value>

Aa cum se observ n tag-ul de mai sus, cu ajutorul atributului name specific m numele
controlului, iar cu ajutorul atributului value specific m valoarea care va fi trimis c tre server.

Controlul de tip TEXTAREA

Este o component care se utilizeaz pentru a introduce un text mai lung, care se poate
ntinde pe mai multe linii.
Tag-ul s u este: <TEXTAREA>...</TEXTAREA>.

39

Atributele sale sunt:

name numele de identificare al componentei;

rows num rul de linii pe care se ntinde componenta (implicit 2);

cols num rul de coloane pe care se ntinde componenta (implicit 20);


Dac dorim ca la nc rcarea paginii s ne apar un text deja scris n cadrul controlului, acest
text se va scrie ntre tag-ul de deschidere i cel de nchidere al lui TEXTAREA.
Exemplu (apl027.html):
<FORM action="nefunctional.php" method="post">
Scrie-ti parerea despre spectacol:<BR>
<TEXTAREA rows="3" cols="30" name="parerea"></TEXTAREA>
<BR>
<INPUT type="submit" value="Trimite datele">
</FORM>

Controlul de tip SELECT

Acest control este utilizat pentru afiarea unei liste din care utilizatorul poate s aleag unul
sau mai multe opiuni.
Tag-ul prin care se utilizeaz aceast component este <SELECT>...</SELECT>.
Atributele sale sunt:

name numele de identificare al componentei;

multiple dac acest atribut este prezent, utilizatorul poate alege mai multe opiuni din

list , innd ap sat tasta control sau shift n timp ce d click pe acestea.

size num rul de opiuni care sunt afiate. Implicit este 1, n cazul listelor care nu sunt

de tip multiple. n acest caz, lista se prezint sub forma unei liste de tip drop-down;

Fiecare opiune din list se specific printr-un tag <OPTION>...</OPTION>. Acestea, la


rndul lor, au urm toarele atribute:

value reprezint valoarea care va fi ntoars de controlul SELECT n cazul n care va fi

selectat opiunea respectiv ;


selected dac

acest atribut este prezent, opiunea respectiv

va fi selectat

la

nc rcarea paginii
Textul efectiv al opiunii se scrie ntre tag-ul de deschidere i cel de nchidere. Tag-ul de
nchidere este opional, el putnd fi omis.

40

Iat un exemplu de folosire al controlului de tip select (apl028.html):


<FORM action="nefunctional.php" method="post">
Alege din lista de mai jos ce fel de studii ai:
<BR>
<SELECT name="studii">
<OPTION value="prim">Scoala primara (4 clase)
<OPTION value="gen">Scoala generala (8 clase)
<OPTION value="lic" selected>Studii medii (12 clase)
<OPTION value="univ">Studii universitare
</SELECT>
<INPUT type="submit" value="Trimite datele">
</FORM>

2.4. Extinderi ale limbajului HTML standard: HTML dinamic, script-uri.

Dei HTML-ul clasic permite redactarea unor documente hypertext de un nivel foarte nalt
i elaborat, o dat cu evoluia limbajelor de programare vizuale, a nceput s devin mai puin
atractiv dect a fost la nceput.
Din acest motiv, a fost pus la punct ceea ce numim DTHML (Dynamic HTML) care nu
este un limbaj n sine, ci un termen prin care sunt desemnate tehnicile utilizate pentru a face
paginile web ct mai dinamice i ct mai interactive.
Pe lng HTML-ul propriu-zis, noile unelte recunoscute de browser-ele din ultima generaie
sunt CSS (Cascading Style Sheets), JavaScript i DOM (Document Object Model).
Scopul acestei lucr ri nu este studiul am nunit al acestora, de aceea le vom trece doar n
revist , folosind mici exemple comentate pentru fiecare dintre ele.

2.4.1. CSS (Cascading Style Sheets).

Noiunea de stil este, pentru un document HTML, asem n toare cu formatarea


documentului, spre exemplu, pentru un document Word. Exis o mulime de atribute prin care se
pot stabili font-urile, caracteristicile de aliniere a textului, forma elementului, culorile de fond i ale
literelor, marginile, poziia elementelor, etc.
Pentru a putea gestiona ct mai eficient stilurile, a fost pus la dispoziia programatorilor de
pagini web un limbaj prin care se poate realiza acest lucru. Acest limbaj este cunoscut sub numele
de CSS (actualmente, vorbim de versiunea CSS2).
Leg tura dintre HTML i CSS se realizeaz prin intermediul tag-ului <STYLE>...</STYLE>
care trebuie aezat ntre <HEAD> i </HEAD>.

41

n cadrul tag-ului STYLE vom stabili modul n care dorim s arate elementele paginii.
Fiecare element al HTML-ului pe care l-am studiat este identificat, n cadrul CSS-ului de tag-ul care
l gestioneaz . Spre exemplu, identificatorul CSS pentru paragrafe este P, pentru table este TABLE,
pentru imagini este IMG, .a.m.d.
Folosind aceti identificatori n cadrul unui <STYLE>...</STYLE>, putem face ca toate
elementele de acelai fel din cadrul unui document s arate la fel. Astfel suntem scutii de a scrie o
gr mad de cod care s-ar repeta n cazul fiec rui element de acelai fel.
De exemplu, dac dorim ca, n cadrul paginii noastre, absolut toate paragrafele s fie scrise
cu fontul Comic Sans MS, caractere de 14, culoare albastr , pe fond galben, n loc de a scrie aceti
parametri la fiecare paragraf din document, este suficient s

definim urm torul STYLE

(apl029.html):
<HTML><HEAD>
<TITLE>Utilizare STYLE in HEAD</TITLE>
<STYLE>
P {
background:yellow;
color:blue;
font-family:"Comic Sans MS";
font-size:14pt;
}
HR {
text-align:left;
width:50%;
height:5px;
color:red;
}
</STYLE>
</HEAD>
<BODY>
<P>Iata un paragraf formatat asa cum am anuntat</P>
<HR>
Acesta este un text care nu se afla in paragraf
<HR>
<P>Acest text este din nou in cadrul unui paragraf</P>
</BODY></HTML>

De remarcat faptul c ambele paragrafe, i de asemenea ambele linii orizontale (HR) din

cadrul lui BODY nu conin nici un fel de referin de formatare. Cu toate acestea, definirile lui P i
ale lui HR n cadrul lui STYLE au predefinit modul n care vor ar ta toate paragrafele respectiv
toate liniile orizontale ale documentului.
Sintaxa definiiei este de felul urm tor: Se ncepe cu identificatorul elementului dorit a fi
formatat (n cazul nostru P tag-ul pentru paragraf, respectiv HR) ntre acolade trecndu-se
specificatorii de format (acetia in de limbajul CSS) dorii a fi modificai. n cazul de fa , avem
de-a face cu:
background = culoarea de fundal;

color = culoarea scrisului;

font-familiy = numele font-ului;

font-size = dimensiunea caracterelor;

text-align = alinierea n cadrul unui text;

width = l imea;

height = n limea.
42

O alt

form

de utilizarea a CSS-ului const

n definirea stilurilor cu ajutorul unor

identificatori proprii, care se pot aplica ulterior unui anumit paragraf. n acest caz, n cadrul unui
style putem defini proprii identificatori, precedndu-i de caracterul #. Aplicarea ulterioar a lor
asupra unui element, se face specificnd un nou atribut, i anume id=identificator unde
identificator este cel propriu, definit n cadrul lui STYLE (cel precedat de #)

Ex: dac inser m n codul de mai sus secvena urm toare (tot n cadrul lui STYLE, dup
definiia lui HR, adic cea scris cu rou nchis):
#alt_paragraf {
color:green;
font-weight:bold;
}

iar nainte de </BODY> mai inser m urm torul paragraf:


<P id="alt_paragraf">Acesta este un paragraf personalizat</P>

vom obine urm torul rezultat:

Remarcai faptul c au fost aplicai doar cei doi specificatori de format definii n noul stil, i
anume culoarea fontului i faptul c scrisul este bold. Celelalte caracteristici (font-ul i culoarea
galben de fundal) au r mas cele definite tot n STYLE, n cadrul lui P.

n loc de a defini stilurile n cadrul antetului (HEAD), aa cum am ar tat mai sus, ele pot fi
scrise separat, ntr-un fiier text cu extensia .css, exact n aceeai manier n care le-am fi scris ntre
cele dou tag-uri prezentate, <STYLE>...</STYLE>.
Includerea efectiv a acestui fiier n cadrul HTML-ului se face tot n seciunea <HEAD>,
prin intermediul urm torului tag:
<LINK rel="stylesheet" type="text/css" href="fisier_stil.css">

43

Iat un exemplu:
1) Coninutul fiierului css, pe care l-am numit apl30stil.css:
TABLE {
border-width:2px;
border-style:ridge;
border-collapse:collapse;
}
TD {
border-style:ridge;
border-width:2px;
padding:5px;
}
TH {
border-style:ridge;
border-width:2px;
background:#7fffff;
padding:5px;
}
TR {
background:#ffff7f;
}
#TR1 {
background:#00ff00;
}

Dup cum se observ , am definit n cadrul s u formatele implicite pentru un tabel, rndurile
i celulele sale (TABLE, TR, TD, TH) precum i un identificator propriu, #TR1.
Iat i fiierul HTML care va folosi acest .css (apl030.html):
<HTML>
<HEAD>
<TITLE>Utilizare css</TITLE>
<LINK rel="stylesheet" type="text/css" href="apl30stil.css">
</HEAD>
<BODY>
<TABLE>
<TR><TH>Numar<TH>Nume
<TR><TD>1<TD>Ion
<TR><TD>2<TD>Pop
<TR><TD>3<TD>Top
<TR id="TR1"><TD>4<TD>Ivan
</TABLE>
</BODY>
</HTML>

Iat , n continuare, n partea stng , cum arat HTML-ul, datorit includerii acestui fiier CSS, iar
n partea dreapt cum ar fi ar tat acelai HTML, f r a specifica nici un fel de format n CSS:

44

2.4.2. JavaScript.
JavaScript este un limbaj de programare orientat pe obiecte. n ciuda numelui i a unor
oarecare similarit i n sintax , ntre JavaScript i Java nu exist nici o leg tur .
JavaScript are o sintax apropiat de cea a C-ului; din acest motiv un programator care
cunoate C poate cu uurin s nvee JavaScript.
Dei acest limbaj are o plaj mai larg de extindere, cel mai des ntlnit este n scriptarea
paginilor web. Programatorii web pot ngloba n paginile HTML script-uri pentru diverse activit i,
cum ar fi verificare datelor introduse de utilizatori, sau crearea de meniuri ori de alte efecte animate.
Browser-ele rein n memorie o reprezentare a paginii web sub forma unui arbore de obiecte,
punnd aceste obiecte la dispoziia JavaScript-ului, care le poate citi i manipula. Acest arbore de
obiecte, de care ne vom ocupa n paragraful urm tor, poart numele de DOM (Document Object
Model).
Pentru moment, vom da cteva exemple comentate de script-uri JavaScript, care nu folosesc
DOM (pentru familiarizarea cu sintaxa), n cadrul unor documente HTML.
1) Calculul sumei cifrelor unui num r natural (apl031.html):
<HTML><HEAD>
<TITLE>JavaScript</TITLE>
</HEAD>
<BODY><HR>
<!--Vom scrie secventa de cod direct in cadrul paginii.
A se remarca faptul ca, va aparea mai intii primul HR,
se va rula codul din tag-ul SCRIPT iar apoi va aparea
cel de-al doilea HR-->
<SCRIPT language="JavaScript">
v_text=prompt("Introdu un numar intreg cu maxim 9 cifre:","");
//functia prompt deschide o fereastra de dialog prin intermediul
//careia utilizatorul poate sa introduca date de tip string. Al doilea parametru
//(irul vid "") reprezint valoarea care se va gsi implicit scris n fereastra
//de dialog. Evident, dac nu dorim nici o valoare implicit, se folosete irul vid ("")
//String-ul obtinut l-am atribuit variabilei v_text
nr=parseInt(v_text);//am facut conversia de la variabila text
//la un numar intreg
s=0;//in s calculam suma cifrelor lui nr
do//procedam intocmai ca in limbajul C:
{
r=nr%10;
s+=r;
nr=parseInt(nr/10);//in JavaScript impartirea NU mai respecta
//regulile din C, deoarece operatorul / face impartire cu
//zecimale. Pentru a obtine citul intreg, am facut conversia la
//intreg cu acelasi parseInt
}while(nr);
alert("Suma cifrelor este "+String(s));
//functia alert(mesaj_de_tip_string) produce afisarea unei ferestre
//de dialog ce contine mesajul respectiv. A se remarca modul in care
//am concatenat mesajul cu valoarea variabilei s, convertita la string
//cu ajutorul functiei String.
</SCRIPT>
<HR>
</BODY></HTML>

A se remarca locul n care am pus script-ul (n cadrul paginii). n exemplele urm toare nu
vom mai da tot codul, ci doar secvena efectiv a script-ului.
45

2) Sortarea unui ir de numere (apl032.html):


<SCRIPT language="JavaScript">
v_text=prompt("Introdu un sir de numere pe care le separi prin spatii:","");
x=v_text.split(" ");//functia split, aplicata lui v_text (cu parametrul " ")
//va extrage substringurile din v_text care sunt separate de spatii si va crea
//un sir de string-uri, pe care i-l atribuie variabilei x. Acestea vor fi
//x[0], x[1], ... Numarul total de elemente din sirul x se obtine prin x.length
n=x.length;//obtinem acest numar in variabila n
for(i=0;i<n;i++)
x[i]=parseInt(x[i]);//in acest fel transformam toate componentele sirului
//x din string-uri in intregi. In C acest lucru nu ar fi fost posibil.
//acum sortam sirul obtinut:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(x[i]>x[j])
{ aux=x[i];x[i]=x[j];x[j]=aux;}
//si afisam sirul final. Pentru asta, formam tot mesajul de afisat intr-un string
s="Iata sirul final, sortat:\n";
for(i=0;i<n;i++)
s=s+String(x[i])+" ";
alert(s);
</SCRIPT>

3) Descompunerea unui num r n factori primi (apl033.html):


<SCRIPT language="JavaScript">
v_text=prompt("Introdu nr. intreg pe care doresti sa-l descompui in factori primi:","");
s="Iata descompunerea in factori primi:\n";
//pregatim string-ul in care vom afisa rezultatul final, pentru ca la acest string
//vom tot concatena noile date obtinute
n=parseInt(v_text);
f=2;
while(n!=1)
{
p=0;
while(n%f==0)
{
n=parseInt(n/f);
p++;
}
if(p)
s+="Factor="+String(f)+" putere="+String(p)+"\n";
//fiecare nou factor si putere obtinute le concatenam la stringul
//care va fi in final afisat
f++;
}
alert(s);
</SCRIPT>

46

2.4.3. DOM (Document Object Model).


DOM reprezint o interfa independent fa de orice limbaj de programare i platform ,
care permite programelor informatice i script-urilor s aib acces sau s actualizeze coninutul,
structura sau stilurile unui document. Documentul poate fi apoi prelucrat, iar rezultatele acestor
prelucr ri pot fi reincorporate n document atunci cnd acesta este prezentat.
nainte de standardizarea DOM-ului, fiecare navigator dispunea de propriul s u model. Dac
limbajul de baz destinat manipul rii documentelor web a fost repede standardizat n jurul lui
JavaScript, nu acelai lucru se poate spune i despre funciile specifice de utilizat i maniera de a
parcurge documentul. Cele dou mari browser-e care s-au impus (Netscape Navigator i Internet
Explorer) denumeau n moduri diferite o serie de componente. n practic , acest lucru obliga
programatorul s scrie cel puin dou versiuni ale fiec rui script, dac dorea ca site-ul s u s fie
accesibil pentru ct mai mult lume.
Prima ncercare de standardizare (DOM 1) a avut loc de-abia n 1998. Ultimul nivel de
standardizare (DOM 3) a avut loc n 2004.

Din punct de vedere dinamiz rii paginilor web, limbajul JavaScript reprezint doar o unealt
de lucru (ai remarcat n paragraful anterior similitudinea dintre acesta i limbajul C). Pentru ca
limbajul JavaScript s acioneze asupra coninutului paginii, ei bine, acest lucru l face tocmai prin
intermediul DOM.
Prin intermediul DOM putem accesa orice obiect al paginii web i l putem face s se
comporte exact n felul n care dorim noi.
Ca i n cazul program rii vizuale, DOM permite interceptarea anumitor evenimente (poziia
mouse-ului, click-uri, etc.) i tratarea lor difereniat .
Vom da n continuare, cteva exemple comentate, n care oper m cu JavaScript + DOM.

1) Schimbarea unei imagini atunci cnd trecem cu cursorul peste ea: Pentru aceasta aplicaie
avem nevoie de doua fiiere imagine, care s fie, de preferabil, identice ca i dimensiuni, i obinute
una dintr-alta printr-un procedeu de genul negativ sau trecere la alb-negru.
Iat fiierele imagine pe care am testat script-ul urm tor:

dog.jpg:

dogneg.jpg

(negativul)
47

apl034.html:
<HTML><HEAD>
<TITLE>Schimbare de imagini</TITLE>
<SCRIPT language="JavaScript">
function schimba_negativ()
{//in momentul apelului, aceasta functie obtine
//in variabila dp o referinta catre obiectul img
//din pagina principala, gratie id-ului sau, si
//anume 'poza'
dp=document.getElementById("poza");
//dupa care imaginea sursa a sa este schimbata,
//folosind imaginea din fisierul dogneg.jpg (cea negativa)
dp.src="dogneg.jpg";
}
function revine_normal()
{//exact la fel ca functia precedenta, insa
//se foloseste alta imagine, si anume cea initiala,
//dog.jpg
dp=document.getElementById("poza");
dp.src="dog.jpg";
}
</SCRIPT>
</HEAD>
<BODY>
<!--elementului img ii stabilim id-ul 'poza'
pentru a-l putea folosi apoi in cadrul script-ului
de asemenea, programam ca elementul img sa reactioneze
la cele doua evenimente:
- onmouseover (cind mouse-ul intra deasupra imaginii)
se va apela functzia care schimba imaginea originala cu
cea pe negativ
- onmouseout (cind mouse-ul iese de deasupra imaginii)
se va apela functzia care pune la loc imaginea originala-->
<IMG src="dog.jpg" id="poza"
onmouseover="schimba_negativ();"
onmouseout="revine_normal();">
</BODY>
</HTML>

2) Schimbarea culorii de fundal a unui tabel, culoare pe care o compunem cu ajutorul a 3


valori pentru componentele R, G, B (ntre 0 i 255) pe care le scriem n nite zone text. Cele 3
valori le vom valida (apl035.html):
<HTML><HEAD><TITLE>Exemplu de JavaScript</TITLE>
<SCRIPT laguage="JavaScript">
function toHex(numar)
{//aceasta functie converteste numarul parametru din zecimal
//in hexazecimal. Ne bazam ca este cuprins intre 0 si 255
c1=parseInt(numar/16);
c2=numar%16;
//in c1 si c2 am obtinut cele 2 cifre hexazecimale
if(c1>9) c1=String.fromCharCode(65+c1-10);
//daca c1 este mai mare decit 9, o inlocuim cu litera corespunzatoare (A=10, B=11, ...,
// F=15) adunind la codul ASCII al lui A (65) diferenta corespunzatoare. Conversia, in
//JavaScript, de la codul ASCII la caracter se face prin
//String.fromCharCode(codul ascii al caracterului)
if(c2>9) c2=String.fromCharCode(65+c2-10);
return String(c1)+String(c2);
}
function rgb(red,green,blue)
{//aceasta functie genereaza constanta HTML de tip culoare plecind de la valorile lui
//red, green, blue, numere cuprinse intre 0 shi 255.Ea se foloseste de functia de mai sus
return "#"+toHex(red)+toHex(green)+toHex(blue);
}
48

function coloreaza()
{//aceasta functie se apeleaza la apsarea butonului definit in cadrul lui BODY. In primul
//rind testam daca valorile sunt intregi. Observati ca am folosit identificatorii dati la
//atributul id pentru a extrage valorile din cimpurile text. In primul rind, pentru a
//accesa obiectele de tip <input type="text" id="..."> va trebui sa ne folosim de o
//functie speciala DOM, si anume document.getElementById. Aceasta functie ne intoarce
//o variabila prin intermediul careia putem accesa in continuare obiectul cu ID-ul
//respectiv.
//In cazul nostru, obtinem variabilele r, g si b pe baza cimpurilor text cu ID-urile
//rr, gg si bb definite in cadrul sectiunii <body>, mai jos.
//Pe baza variabilelor de tip obiect r, g si b, cimpul "value" ne va intoarce taman
//valoarea scrisa in acestea
r=document.getElementById("rr");
g=document.getElementById("gg");
b=document.getElementById("bb");
nr=parseInt(r.value);ng=parseInt(g.value); nb=parseInt(b.value);
if(nr!=r.value)//daca valoarea convertita la intreg nu coincide
//cu cea neconvertita, inseamna ca nu este inteaga, deci dam un mesaj
{alert("Valoarea lui r nu este corecta!");
return;}//si iesim fortat (ca in C) cu return
//procedam analog pentru celelalte doua
if(ng!=g.value)
{alert("Valoarea lui g nu este corecta!");return;}
if(nb!=b.value)
{alert("Valoarea lui b nu este corecta!");return;}
//acum verificam sa fie cuprinse intre 0 si 255
if(nr<0||nr>255)
{ alert('Valoarea lui r nu este cuprinsa intre 0 si 255');return;}
if(ng<0||ng>255)
{ alert('Valoarea lui g nu este cuprinsa intre 0 si 255');return;}
if(nb<0||nb>255)
{ alert('Valoarea lui b nu este cuprinsa intre 0 si 255');return;}
//in fine, daca am trecut de aceste filtre, valorile lui r, g si b sunt corecte
// si putem, in fine, stabili culoarea de fundal a celuilalt tabel (caruia i-am dat
//id-ul tabel) la cea pe care o obtinem din combinatia r, g, b introdusa.
tbl=document.getElementById("tabel");
//La fel ca mai sus, getElementById ne intoarce o variabila prin intermediul
//careia putem accesa obiectul cu id-ul respectiv
tbl.style.backgroundColor=rgb(nr,ng,nb);
//apoi, prin intermediul variabilei intoarse, si anume tbl,
//stabilim culoarea de fundal a tabelului. Pentru intoarcerea culorii
//in formatul recunoscut de HTML, adica #RRGGBB apelam functia
//rgb scrisa tot de noi, mai sus
}
</SCRIPT>
<BODY>
Introdu componentele de culoare (numere intre 0 si 255):<BR><BR>
<!--In tabelul de mai jos am folosit 3 input type="text" fara a ne afla intr-un form.
Este posibil si asa ceva, deoarece continutul lor il vom prelua cu ajutorul unui script
JavaScript. In cadrul acelui script ne vom folosi de aceste controale prin intermediul
atributului id pe care l-am stabilit, deci rr, gg si bb-->
<TABLE border="1" cellspacing="0" cellpadding="5">
<TR><TD>Rosu<TD>
<INPUT type="text" id="rr" maxlength="3" size="3">
<TR><TD>Verde<TD>
<INPUT type="text" id="gg" maxlength="3" size="3">
<TR><TD>Albastru<TD>
<INPUT type="text" id="bb" maxlength="3" size="3">
</TABLE><BR>
<!--Mai jos am folosit o componenta de tip BUTTON. Aceastei componente i-am folosit
atributul onclick. Acestui atribut ii specificam practic ce functie JavaScript trebuie
apelata in momentul in care se da click pe buton -->
<BUTTON onclick="coloreaza();">Testeaza</BUTTON>
<BR><BR>
<!--acestui tabel i-am utilizat atributul id, pentru a-l putea mai usor accesa
prin modelul DOM in cadrul codului JavaScript-->
<TABLE width="50%" height="50%" id="tabel" border="1">
<TR><TD align="center" valign="middle">TEST AREA
</TABLE>
</BODY></HTML>
49

3) n aplicaia urm toare, prin intermediul unui control de tip input type=text vom
cere utilizatorului s introduc un num r x ntre 4 si 20. Pe baza acestui num r (pe care-l valid m)
vom genera, ntr-un element de tipul iframe, un tabel cu x linii i x coloane, n care punem numerele
de la 1 la x2 i ale c rui celule le color m alternativ, la fel ca pe o tabl de ah.
Pe lng codul surs am pus i o captur a ferestrei, in urma rul rii cu n=7 (apl036.html):
<HTML><HEAD><SCRIPT language="JavaScript">
function genereaza()
{
n=document.getElementById("nn");
nr=parseInt(n.value);
if(nr!=n.value)//verificam daca in n este un numar intreg
{alert('Numarul introdus nu este intreg');return;}
else if(nr<4||nr>20)//verificam si daca este intre 4 si 20
{alert('Numarul trebuie sa fie intre 4 si 20');
return;}
d=document.getElementById("ifr").contentWindow.document;
//obtinem in variabila d referinta DOM catre documentul din iframe
d.open();//deschidem acest document pentru rescriere
d.write('<TABLE border="1" cellspacing="0" cellpadding="5">');
k=0;//si generam, prin script, in cadrul sau, codul HTML
//care creeaza tabelul anuntat
for(i=1;i<=nr;i++)
{
d.write('<TR>');
for(j=1;j<=nr;j++)
{
d.write('<TD align="center" ');
if((i+j)%2)//in functie de paritatea lui i+j
//coloram intr-un fel sau intr-altlul fundalul celulei
d.write('bgcolor="#ffff7f">');
else
d.write('bgcolor="#7fffff">');
++k;
d.write(String(k));
}
}
d.write('</TABLE>');
d.close();
}
</SCRIPT></HEAD><BODY>
Introdu un numar natural cuprins intre 4 si 20:
<!--prin intermediul input type="text" scriem o valoare
care este apoi preluata de JavaScript. Acesta are id-ul
"nn" -->
<INPUT type="text" id="nn" size="2" maxlength="2">
<BR><BR>
<!--prin intermediul metodei "onclick()" a butonului
apelam functia care generaza codul HTML al tabelului
in documentul din iframe-->
<BUTTON onclick="genereaza();">Genereaza tabelul</BUTTON>
<BR><BR>
<IFRAME id="ifr" width="70%" height="500">
</IFRAME><HR></BODY></HTML>

De reinut din aceast

ultim

parte, c

script-urile, dei reprezint

o automatizare i

dinamizare foarte important a unei pagini web, nu sunt rulate pe server-ul HTML (de altfel, pn
n momentul de fa am lucrat cu toate fiiere n mod local, ele fiind deschise automat de c tre
browser-ul de internet) ci ele sunt rulate de c tre browser pe calculatorul clientului care acceseaz
pagina ce le conine.

50

3. LIMBAJUL PHP FACILIT

I ALE ACESTUIA

3.1. Introducere scurt istoric al apari iei limbajului PHP; mod de func ionare.

PHP este un limbaj de programare destinat n primul rnd Internetului, aducnd dinamic
unei pagini web. Este unul dintre cele mai importante limbaje de programare web open-source (este
gratuit i, n plus, utilizatorii pot aciona liber asupra procesului de dezvoltare) i server-side (codul
surs nu se ruleaz pe calculatorul celui care vizualizeaz pagina, ci pe serverul web).
Numele s u este un acronim recursiv: Php este un Hypertext Processor. Limbajul a fost
nceput n 1994 ca o extensie a limbajului server-side Perl, i apoi ca o serie de CGI-uri compilate,
de c tre Rasmus Lerdorf, pentru a genera un curriculum vitae i pentru a urm ri num rul de
vizitatori ai unui site. A evoluat apoi n PHP/FI 2.0, dar proiectul open-source a nceput s ia
amploare dup ce Zeev Suraski i Andi Gutmans au lansat o nou versiune a interpretorului PHP n
vara anului 1998, aceast versiune primind numele de PHP 3.0. Tot ei au schimbat numele n
acronimul recursiv amintit mai sus, pn atunci PHP-ul fiind cunoscut ca Personal Home Page
tools. n prezent este utilizat versiunea 6 a acestui limbaj.
Prin CGI (Common Gateway Interface) se nelege o interfa a unui server de web, care
extinde funcionalit ile acestuia. CGI nu se refer la un anumit limbaj de programare, ci definete
un modul standardizat, prezent n cadrul unui server HTTP. Prin intermediul acestui modul se
stabilesc regulile prin care server-ul va pasa datele primite de la un utilizator c tre o aplicaie scris
ntr-un anumit limbaj de programare, pentru ca apoi s ntoarc rezultatele acestei aplicaii napoi la
utilizator.
Limbajul PHP, n marea majoritate a cazurilor, se folosete sub form de secvene de cod
inserate n cadrul unui document HTML. Din acest motiv, vom prefera termenul de script PHP
celui de program PHP. Structura unui script PHP este foarte asem n toare cu cea a unui cod scris n
limbajul C, mai ales n sensul n care structurile de programare au aceeai sintax i aceeai
funcionalitate.
Rolurile de baz ale unui script PHP constau n aceea c scipt-ul poate prelua date trimise de
c tre o pagin web de la un client (n general, datele pot fi trimise de c tre o pagin web prin
intermediul formularelor) i de a executa o secven de program n urma c reia va rezulta un cod
HTML, cod pe care clientul l va primi sub forma unei pagini web. Clientul nu va avea acces la
codul efectiv al script-ului, ci, prin faptul c acesta se afl pe server i se ruleaz tot pe acesta, va
primi direct HTML-ul generat de script.

51

3.2. Cerin e tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii
asupra instal rii.

Dup cum am v zut n capitolul precedent, PHP nu este un limbaj de programare de


sine-st t tor (cum ar fi C++, spre exemplu) ci se folosete n simbioz n primul rnd cu HTML, i
deci pentru a rula, are nevoie neap rat de un server de web (http server).
Practic, pentru a face ca pe calculatorul nostru s poat rula fiiere php, avem nevoie s
instal m, pe lng limbajul PHP, i un server de web, i de a face leg tura dintre cele dou .
Acest lucru se poate face separat, ns sunt necesare o serie de set ri foarte minuioase i
greoaie.
Din acest motiv, pentru testarea aplicaiilor pe care le vom studia, vom folosi un pachet
gratuit, disponibil pe Internet, numit XAMPP. Acest pachet, foarte simplu de instalat, conine mai
multe aplicaii. Cele care ne vor interesa pe noi sunt serverul Apache (pentru http), un server de
MySQL, i suport pentru limbajul PHP. Cerinele tehnice pentru rularea n bune condiii sunt
minimale: practic, pe orice calculator care este capabil s ruleze Windows 2000, XP sau Vista,
pachetul XAMPP va rula f r probleme.
Dei instalarea sa poate fi f cut n mai multe feluri, cel mai la ndemn este s folosim o
versiune de tip Installer a sa.
Adresa de unde poate fi desc rcat pachetul gratuit este:
http://www.apachefriends.org/en/xampp-windows.html

1. Downloadai executabilul installer-ului: derulai pagina pn

cnd dai de seciunea

Download, accesnd primul link Installer, ca n figura de mai jos:

52

La momentul scrierii lucr rii de fa , ultima versiune public a XAMPP-ului este 1.6.7.
Fiierul executabil al installer-ului acestei versiuni este xampp-win32-1.6.7-installer.exe

2. Lansai n execuie installer-ul. Vom alege instalarea n limba englez . L s m nemodificat


directorul propus pentru instalare (c:\xampp). n fereastra urm toare vom bifa toate cele 3 c sue
care ne propun instalarea server-elor Apache, Mysql respectiv Filezilla (acesta din urm fiind de
fapt un server de FTP) ca i servicii.
3. La sfritul instal rii, server-ul de web este deja funcional, avnd inclus att suport php ct i
baza de date MySQL. Prin intermediului panoului de control XAMPP putem vedea care este starea
curent a server-elor instalate, i le putem de asemenea gestiona.
4. Pentru a testa efectiv funcionalitatea server-ului web, deschidem un browser de internet, scriind
la adres : http://localhost.
Dac instalarea a fost f cut cu succes, ne apare o pagin din care suntem invitai s alegem
limba de operare, dup care suntem dui n pagina HOME a instal rii f cute.
Directorul r d cin al documentelor web este c:\xampp\htdocs.
n vederea test rii aplicaiilor PHP pe care le vom studia n continuare, vom crea n acest
director un alt subdirector phpapps.
Dup ce l-am creat, putem testa existena sa deschiznd browser-ul de internet n care
scriem adresa: http://localhost/phpapps
n browser trebuie s ne apar un director gol.
n mod implicit, toate fiierele i subdirectoarele pe care le punem n acesta vor fi vizibile
prin intermediul server-ului de http. Numele index.htm, index.html respectiv index.php
sunt rezervate: dac denumim vreun fiier n acest mod, la intrarea n directorul care l conine, n
loc de a ne ar ta ceea ce se g sete n acest director, serverul web ne va ar ta direct pagina coninut
de fiierul respectiv.

3.3. Testarea instal rii. Structura unui fiier PHP.

Spre deosebire de fiierele .html care o dat create pe discul local cu un editor de texte pot
fi deschise imediat tot local, direct n browser-ul de Internet, pentru a rula codul PHP este absolut
necesar ca fiierele s fie puse n directorul n care rezid documentele serverului web, iar

53

vizualizarea lor s fie f cut prin intermediul acestuia. n mod implicit, un fiier care conine un
script PHP trebuie s fie salvat cu extensia .php.
S

cre m primul nostru script PHP. Vom descrie operaiile necesare acestui lucru,

bazndu-ne pe instalarea pachetului XAMPP descris n capitolul anterior. Astfel, toate scripturile
pe care le vom crea le vom pune n directorul c:\xampp\htdocs\phpapps .
Cu ajutorul unui editor de texte (de exemplu Notepad, Notepad++) creai urm torul fiier, pe
care l salvai n directorul de mai sus sub numele apl037.php (codul de mai jos este preluat aa
cum apare vizualizat n editorul Notepad++. Numele fiierelor aplicaiilor continu num r toarea
din capitolul precedent):

Observai structura absolut identic celei a unui fiier HTML. Noutatea este adus de
scriptul PHP, care este inserat ntre tag-urile colorate n rou: <?php i ?>.
Instruciunea echo cuprins ntre acestea este o instruciune specific limbajului PHP, ea
avnd rolul de a scrie n pagina web textul ce urmeaz dup , cel cuprins ntre ghilimele.
S vizualiz m acum pagina rezultat n urma acestui fiier. Pentru aceasta, deschidei
browser-ul de Internet, scriind urm toarea adres : http://localhost/phpapps.
Dac XAMPP a fost corect instalat, vei obine urm toarea pagin :

54

n pagin v este ar tat coninutul directorului n care am creat fiierul apl037.php, aa


cum este vizualizat prin intermediul serverului de web.
n aceast pagin facei un click pe fiierul apl037.php, pentru a-l vizualiza prin
intermediul serverului web. Dac totul este n regul , coninutul afiat n browser trebuie s fie
urm torul:

Remarcai c , ceea ce vedem este rezultatul instruciunii echo din PHP. Dac se obine
altceva, nseamn c instalarea nu s-a f cut n mod corect.
Mai mult, s analiz m codul surs generat. Pentru aceasta, n browser, executai comanda de
vizualizare a sursei (n cazul lui Internet Explorer, alegei din meniul View opiunea Source). Va
trebui s obinei urm torul cod surs :
<HTML><HEAD>
<TITLE>Primul HTML continind script PHP</TITLE>
</HEAD>
<BODY>
<H2>Acesta este un titlu H2 scris normal, in afara scriptului</H2>
Acest text este scris de catre script-ul PHP</BODY>
</HTML>

Aa cum am anunat, codul PHP, ba chiar nsui faptul c n aceast pagin ar exista vreun
script, nu sunt vizibile clientului, ci acesta vede doar rezultatul obinut n urma rul rii.

S mai scriem nc un exemplu, nainte de a trece la detalierea limbajului de programare


PHP. n acelai director (c:\xampp\htdocs\phpapps) creai fiierul apl038.php, cu urm torul
coninut:

Remarcai similitudinea dintre limbajul PHP i C, n cazul instruciunilor din cadrul


scriptului: n afara faptului c variabila, care n C ar fi fost i, aici este $i, instruciunea for are
55

aceeai sintax . Sintaxa lui echo este uor de asimilat, prin analogie cu cout<< (entit ile de afiat,
n loc s mai fie separate de << sunt separate de virgule). Remarcai, de asemenea, c la fiecare
afiare echo din cadrul repetitivei for, este afiat tag-ul <br>, pentru ca, n pagina vizualizat ,
dup fiecare linie s se treac la rnd nou.
Iat rezultatul pe care trebuie s -l obinem n browser:

Din nou, vizualiznd codul primit de c tre browser, vom obine urm torul HTML:

Remarcai din nou c , ceea ce ajunge la client este doar rezultatul execuiei script-ului PHP.
Observai c , dei tag-ul <BR> produce n browser trecerea la rnd nou, n cadrul vizualiz rii sursei
obinute, codul este dezordonat, deoarece este scris una-ntr-una, f r Enter-uri.
Acest lucru, n mod normal, nu deranjeaz , atta timp ct aspectul paginii vizualizate n
browser are acelai aspect.
Totui, o aliniere este binevenit n cazul depan rii unui script, pentru c se poate urm ri
mai uor apariia unei eventuale erori sau neconcordane.
Pentru acest lucru, n cadrul unui echo putem folosi, la afiare, oricte treceri la rnd nou
dorim. Acestea se fac, la fel ca i n C, prin caracterul special \n. Dup cum tim din capitolul
precedent, Enter-urile n cadrul unui text din codul HTML nu au efect, deci afiarea de \n-uri o
folosim n special pentru structurarea ordonat a acestuia.

56

n cazul aplicaiei de fa (apl038.php) s modific m linia a 8-a a sa (afiarea cu echo)


schimbnd-o n urm toarea:

Aspectul s u n browser r mne absolut nemodificat. Totui, vizualiznd codul surs , vom
remarca alinierea acestuia:

De reinut deci, din exemplele prezentate, c :

un fiier ce conine script-uri PHP se salveaz de regul cu exensia .php, fiind localizat n

directorul n care rezid documentele serverului web;

orice script PHP este cuprins ntre tag-urile <?php i ?>;

instruciunea PHP care produce output n pagina HTML este echo;

rularea unei pagini care conine script PHP se va face ntotdeauna prin intermediul
serverului de web;

la fel ca i n C, separatorul dintre instruciunile unui script .php este caracterul ;.


O ultim observaie care trebuie f cut este aceea c , n mod implicit (deci f r a modifica

set rile de instalare) limbajul PHP, spre deosebire de C, nu este case-sensitive (deci nu face
diferena ntre literele mari i cele mici) n ceea ce privete cuvintele rezervate ale limbajului
(instruciunile) respectiv funciile (fie c e vorba de cele predefinite ale limbajului, fie c e vorba de
cele definite de c tre utilizator). n schimb, este case-sensitive n ceea ce privete numele de
variabile. Astfel, fie c scriem for fie FOR, limbajul va recunoate instruciunea repetitiv cu
contor. n schimb, dac folosim identificatorii $a respectiv $A, va fi vorba de dou variabile
distincte.

57

3.4. Constante. Variabile. Operatori. Afiarea datelor.

Constante

Constantele recunoscute de limbajul PHP sunt asem n toare cu cele ale limbajului C:
constante numerice ntregi i reale: 14, -80, 3.14, -8.25, 1e+2, 314e-2, etc.

constante de tip caracter i ir de caractere: a, \n, Ana are mere, Cici,

Mimi, etc. Spre deosebire de C, n PHP nu se mai face diferena ntre un singur caracter i un

ntreg ir de caractere din punct de vedere al constantelor. Separatorii pot fi att ghilimelele ct i
apostrofurile, rolul lor funcional fiind puin diferit vom vedea acest lucru mai ncolo. Caracterele
speciale sunt aceleai ca i n C: \n, \\, \, \ i altele.

constante de tip bool: false i true. Spre deosebire de C, rezultatul oric rei expresii

relaionale sau logice este de acest tip special de date. Totui, n cazul instruciunilor care necesit
expresii relaionale sau logice, se p streaz convenia din C, i anume c orice valoare diferit de 0
este echivalent cu true, iar orice valoare egal cu 0 este echivalent cu false.

Definirea constantelor de c tre utilizator, n sensul c prin anumii identificatori putem


folosi valori constante, se face cu ajutorul funciei define.
Forma general a acesteia este:
define(nume constanta, valoare);

Exemplu de script (apl039.php):


<?php
define("pi",314e-2);//aici am definit o constanta numerica reala
define("greeting","Buna ziua!");//iar aici o constanta de tip sir de caractere
echo greeting,"<br>";//aici afisam constanta sir de caractere
echo "Constanta pi, aproximata cu 2 zecimale este ",pi;//iar aici pe cea numerica
?>

Variabile

n PHP identificatorii rezervai variabilelor ncep cu caracterul $. n continuare, respect


aceleai specificaii din C, deci imediat dup caracterul $ trebuie s fie o liter sau liniua de
subliniere (_), iar n rest pot fi folosite i cifrele.
Spre deosebire de C, variabilele nu se declar la nceput, ci tipul lor este definit (implicit, de
c tre limbaj) atunci cnd sunt folosite. Mai mult, i pot schimba tipul n funcie de valoarea pe care
o rein.

58

Exemplu de script (apl040.php):


<?php
$a=4+5.5;//La fel ca si in C, mai intii se evalueaza expresia din dreapta.
//Rezultatul 9.5 este real. In urma atribuirii este creata variabila $a, de tip real
echo "Valoarea din variabila a este: ",$a,"<BR>\n";
$b="Ana are mere";//Se creeaza variabila $b, de tip string
$a=$b;//Modificam variabila $a, dindu-i continutul lui $b. Acesta fiind de tip
//string, se modifica si tipul variabilei $a, de la real la string.
//Acest lucru n-ar fi fost posibil in C
echo "Noua valoare din variabila a este: <B><FONT color=\"red\">",$a;
echo "\n</FONT></B>";//in plus, am mai imbogatit afisarea, folosind tag-urile
//pentru scris bold si cel pentru caractere de culoare rosie
?>

Analizai leg tura dintre codul surs de mai sus i alinierea fiierului obinut n browser
(deci afi rile de \n din cadrul instruciunilor echo) :
Valoarea din variabila a este: 9.5<BR>
Noua valoare din variabila a este: <B><FONT color="red">Ana are mere
</FONT></B>

Remarcai de asemenea i faptul c valoarea atributului color (i anume red) a trebuit a fi


scris ntre ghilimele. Textul din cadrul echo-ului n care am afiat acest atribut, fiind deja n
interiorul unor ghilimele, a trebuit s folosim caracterul special \ pentru a face aceast afiare
posibil . Dac am fi folosit, pur i simplu, ghilimele obinuite, instruciunea echo ar fi considerat
c n acel loc se ncheie stringul, iar din acest caz n-ar mai fi putut interpreta caracterele urm toare,
ceea ce s-ar fi terminat cu producerea unei erori.
n PHP este posibil i adresarea indirect . Acest lucru nseamn c , dac o variabil conine
o expresie de tip string n care este reinut numele unei variabile, putem afia direct valoarea
variabilei reinut de string. Pentru aceasta se va folosi nc o dat caracterul $ (de forma $$x).

Exemplu de script (apl041.php):


<?php
$a=5;
$x="a";
echo "Iata stringul din variabila x: ",$x,"<BR>\n";
echo "Iata valoarea variabilei din stringul x: ",$$x;
?>

Operatori

Muli dintre operatorii limbajului PHP sunt cunoscui din C++. Acesta este motivul pentru
care vom prezenta doar anumite particularit i specifice limbajului PHP.

59

Pentru nceput, i prezent m, n ordine descresc toare a priorit ilor lor:


1. ! , ++ , -- , (int) , (double) , (string) ;
2. * , % , / ;
3. < , <= , > , >= ;
4. == , != , === , !== ;
5. & ;
6. ^ ;
7. && ;
8. ?: ;
9. = , += , -= , /= , *= , %= , &= , |= , ^= ;
10. And ;
11. Xor ;
12. Or ;
13. , ;
n PHP se pot folosi operatori de conversie explicit , cunoscui din C++. Ca i n C++, ei se
aplic prefixat. Astfel, exist : (int) conversie c tre o valoare ntreag , (string) conversie
c tre ir, iar (double) conversie c tre real.
Exemplu de script (apl042.php):
<?php
$a=(int)8.65;//la fel ca si in C, se vor elimina zecimalele
echo "variabila a are valoarea: ",$a,"<BR>";
$b=(double)"3.85copac";//conversia se va face atita cit se poate, deci variabila
//b va contine valoarea 3.85, restul de caractere vor fi ignorate
echo "variabila b are valoarea: ",$b,"<BR>";
$c="1.25mere"+"3.75pere";//ba mai mult, se va face conversia explicita, adica
//limbajul va converti mai intii cele doua stringuri la numere, apoi va face adunarea
echo "variabila c are valoarea: ",$c,"<BR>";
$d=19/5;//spre deosebire de C, operatorul C face impartire reala, chiar daca
//operatorii sai sunt intregi
echo "variabila d are valoarea: ",$d,"<BR>";
//daca dorim impartire intreaga, facem conversia la int:
$e=(int)(19/5);
echo "variabila e are valoarea: ",$e,"<BR>";
?>

Exemplu de script (apl043.php):


<?php
echo "<TT>";
//operatorul == functioneaza ca si in C. Limbajul PHP fiind ceva mai larg in ceea ce
//priveste tipurile de date, verifica doar egalitatea ca valoare.
//vom folosi functia var_dump(variabila), care ne afiseaza tipul unei variabile
//si valoarea sa. Facem acest lucru, deoarece rezultatele unor comparatii in PHP
//au o valoare de tipul bool (true sau false) ce nu poate fi afisata in mod direct
$a=("3"==3);//vom obtine true, deoarece in urma conversiei, cele 2 valori sunt egale
echo 'Iata rezultatul comparatiei "3"==3 : ';//remarcati cum, de aceasta data, pentru
//ca stringul pe care dorim sa-l afisam contine ghilimele, l-am delimitat prin
//apostrofuri
var_dump($a);echo "<BR>";
60

$b=("3"==3.90);//vom obtine false


echo 'Iata rezultatul comparatiei "3"==3.90 : ';
var_dump($b);echo "<BR>";
$b=("3.90"==3.90);//vom obtine true
echo 'Iata rezultatul comparatiei "3.90"==3.90 : ';
var_dump($b);echo "<BR>";
?>

Exemplu de script (apl044.php):


<?php
echo "<TT>";
//operatorul === reprezinta o noutate fata de C. Acest operator verifica egalitatea
//atit ca valoare cit ca si tip. Evident, operatorul !== reprezinta negatia sa.
$a=("3"==3);//acesta este true, pentru ca valorile sunt egale
echo 'Iata rezultatul comparatiei "3"==3 : ';
var_dump($a);echo "<BR>";
$b=("3"===3);//acesta este false, pentru ca, desi valorile sunt egale, tipurile nu sunt
echo 'Iata rezultatul comparatiei "3"===3 : ';
var_dump($b);echo "<BR>";
$c=(1+2===3);//aceasta este true, pentru ca expresiile sunt de acelasi tip
echo 'Iata rezultatul comparatiei 1+2===3 : ';
var_dump($c);echo "<BR>";
$d=(3.0===3);//aceasta este false, pentru ca tipurile nu sunt egale
echo 'Iata rezultatul comparatiei 3.0===3 : ';
var_dump($d);echo "<BR>";
?>

Exemplu de script (apl045.php):


<?php
//Operatorul =, de atribuire, functioneaza la fel ca si in C.
//Este asadar permisa si atribuirea multipla:
$a=$b=$c=5.23;
echo "Iata variabilele a, b si c, initializate toate cu aceeasi valoare: ";
echo $a,", ",$b,", ",$c;
?>

Afiarea datelor

Dup cum am v zut deja, una dintre cele mai folosite instruciuni de afiare n PHP este
echo. Are dou forme:

a) data afiat se scrie ntre paranteze rotunde (aceast form nu poate fi folosit pentru
afiarea mai multor date): echo(Ana are mere);
b) datele afiate sunt scrise dup echo, f r a fi grupate ntre paranteze i separate prin
virgule: echo Ana are , 1+2, mere;
O alt instruciune de afiare este print. Dup ea urmeaz o singur dat , care poate fi sau
nu pus ntre paranteze. Funcioneaz ca i echo, n plus, n cazul n care folosim forma cu
paranteze, va ntoarce valoarea true dac afiarea a fost f cut cu succes, respectiv false n caz
contrar.
Alte dou instruciuni folosite n special pentru cazurile n care dorim s depan m un
program sunt:
61

var_dump(expresie) afieaz tipul expresiei urmat de valoarea sa;

print_r(variabila) n cazul unor variabile compuse (iruri, obiecte) produce o

afiare a tuturor componentelor ale acestora.


Observa ii:
Dup

cum am v zut deja prin exemplele date, n loc de ghilimele, se pot folosi i

apostrofuri. Diferena este dat de faptul c , n cazul folosirii ghilimelelor, dac irul de caractere
conine numele unor variabile, acestea vor fi evaluate, deci se va afia coninutul lor, pe cnd n
cazul apostrofurilor se va afia numele variabilei ca atare.
Nu putem folosi ghilimele incluse n cadrul altei perechi de ghilimele, i nici apostrofuri
incluse ntre alte perechi de apostrofuri, n schimb, putem include ghilimele ntr-un ir delimitat de
apostrofuri sau apostrofuri ntr-un ir delimitat de ghilimele.
Exemplu de script (apl046.php):
<?php
$a=3;$b=4;
echo "Ana are $a mere si $b mere<BR>";//aici se vor evalua atit $a cit si $b
echo 'Ana are $a mere si $b mere<BR>';//pe cind aici nu
?>

3.5. Instruc iuni ale limbajului PHP.

Instruciunile PHP sunt asem n toare cu cele din C. Din acest motiv, ne vom limita la o
scurt prezentare a lor i la cteva exemple de utilizare.

3.5.1. Instruciunea expresie.


La fel ca i n C++ se folosete n special pentru calcule i atribuiri.
Exemplu: $x=$x*10+3;

3.5.2. Instruciunea bloc (se mai numete i compus).


Are aceeai sintax i funcionalitate ca n C, i anume de a grupa mai multe instruciuni,
astfel nct acestea s joace rolul sintactic al uneia singure.
Instruciunile se scriu ntre paranteze acolade:
{ ...
...
}
62

3.5.3. Instruciunea if.


Are aceeai form i funcionalitate ca i n C:
if(expresie) instruciune1;
[else instruciune2;]

Deci, dac

expresia este evaluat

instruciune1. Dac

este fals

ca fiind adev rat

(sau diferit

de 0) se execut

(sau 0) iar ramura else este prezent , se va executa

instruciune2. La fel ca i n C, dac n loc de o singur instruciune sunt mai multe, se vor

grupa ntr-un bloc.


Exemplu de script (apl047.php) care conine un if:
<?php
//urmatorul script ia ca si parametru de intrare variabila a definita mai jos.
//Pentru ca inca nu am prezentat cum se face preluarea de date de catre PHP, ne
//vom limita sa modificam manual variabila $a de mai jos.
//Program formeaza alte doua variabile $b si $c, cu primele doua respectiv
//ultimele doua cifre ale lui $a, daca acesta are exact 4 cifre, sau scrie un
//mesaj corespunzator in caz contrar
$a=1425;
echo 'Valoarea din variabila $a este : ',$a,"<BR>";
if($a>=1000&&$a<=9999)//deci verificam sa aiba exact 4 cifre
{//in caz afirmativ se executa instructiunile din acest bloc
$b=(int)($a/100);
$c=$a%100;
echo "Primele doua cifre ale sale sunt : ",$b,"<BR>";
echo "Ultimele doua cifre ale sale sunt : ",$c,"<BR>";
}
else //iar in caz contrar afisam un mesaj corespunzator
echo "Valoarea din variabila a NU are exact 4 cifre!<BR>";
?>

3.5.4. Instruciunea while.


Are aceeai form i funcionalitate ca i n C:
while(expresie) instruciune;

Principiul de executare este urm torul:


Pasul P1: Se evalueaz expresia;
Pasul P2: Dac aceasta este adev rat (sau diferit de 0) se execut instruciunea subordonat , dup
care se revine la Pasul P1. n caz contrar se termin execuia repetitivei while, trecndu-se la
instruciunea urm toare n codul surs .
Exemplu de script (apl048.php) care conine while:
<?php
//Programul afiseaza cifrele numarului intreg din variabila a, in ordine inversa, dupa
//fiecare afisind caracterul #:
$a=1425;
echo 'Valoarea din variabila $a este : ',$a,"<BR>";
while($a)//deci cit timp valoarea din $a este nenula
{
$r=$a%10;//determinam ultima sa cifra in variabila $r
$a=(int)($a/10);//inlocuim $a cu citul impartirii sale la 10, deci
//"stergem" ultima sa cifra
echo $r,"# ";//afisam cifra curenta, obtinuta in variabila $r, urmata de un #
}
?>

63

3.5.5. Instruciunea do...while.


Are aceeai form i funcionalitate ca i n C:
do
instruciune;
while(expresie);

Principiul de executare este urm torul:


Pasul P1: Se execut instruciunea subordonat (cea de dup do);
Pasul P2: Se evalueaz expresia. n cazul n care valoarea evaluat este false (sau 0), executarea
instruciunii do...while se termin . n cazul n care este adev rat (sau nenul ) se reia executarea
pasului P1.
Exemplu de script (apl049.php) care conine do...while:
<?php
//Programul afiseaza cifrele numarului intreg din variabila a, in ordine inversa, dupa
//fiecare afisind caracterul #:
$a=1425;
echo 'Valoarea din variabila $a este : ',$a,"<BR>";
do
{
$r=$a%10;//determinam ultima sa cifra in variabila $r
$a=(int)($a/10);//inlocuim $a cu citul impartirii sale la 10, deci
//"stergem" ultima sa cifra
echo $r,"# ";//afisam cifra curenta, obtinuta in variabila $r, urmata de un #
}while($a);//deci repetam ciclarea cit timp valoarea din $a este nenula
?>

3.5.6. Instruciunea for.


Are aceeai form i funcionalitate ca i n C:
for(expresieiniializare;expresiecontinuare;expresieincrementare) instruciune;

Principiul de executare este uor de neles, datorit faptului c for-ul se poate transcrie n
mod perfect echivalent prin urm toarea secven de program:
expresieiniializare;
while(expresiecontinuare)
{
instruciune;
expresieincrementare;
}

Dei for-ul este, n limbajul C, deci i n PHP, o instruciune mult mai general dect n alte

limbaje, totui, cel mai utilizat scop al s u este de a atribui unui contor, rnd pe rnd, valori (de
regul ntregi) cuprinse ntre dou limite.
Exemplu de script (apl050.php) care conine un for:
<?php
//Programul calculeaza suma primelor $n numere naturale in variabila $s:
$n=10;
$s=0;
echo 'Valoarea din variabila $n este : ',$n,"<BR>";
for($i=1;$i<=$n;$i++)
$s+=$i;
echo "Suma primelor $n numere naturale este $s<BR>";
?>
64

3.6. Transmiterea datelor prin intermediul formularelor.


n capitolul 2 am amintit de formulare i de rolul pe care acestea l joac n dinamizarea
paginilor web.
Formularele reprezint un mecanism prin care se pot trimite date c tre serverul HTML.
Aceste date pot fi preluate de c tre script-urile PHP i n continuare folosite n cadrul programelor.
S nu uit m c formularele sunt elemente HTML. Fie urm torul unui formular, pe care l cre m n
fiierul apl051.html :
<form action="apl052.php" method="post">
Introdu o valoare numerica:
<input type="text" name="a" maxlength="4">
<br><br>
<input type="submit" value="Calculeaza patratul sau">
</form>

Atributul action al tag-ului form se refer la numele fiierului PHP care se va ocupa de
prelucrarea datelor iar atributul method de metoda prin care sunt trimise datele c tre server.
Tag-ul <input type=text...> creeaz un cmp de date de tip text. Atributul name al
acestuia specific un identificator prin care PHP-ul va prelua valoarea din acesta.
Tag-ul <input type=submit...> creeaz un buton de trimitere a datelor. Practic,
ap sarea pe acest buton permite trimiterea coninutului ntregului formular c tre server.

Preluarea datelor trimise c tre server prin intermediul metodei POST, n cadrul unui script
PHP se face prin intermediul vectorului predefinit $_POST[nume_cmp_din_formular].
Atenie la faptul c $_POST trebuie scris cu majuscule !.
De exemplu, n cazul nostru, putem recupera aceast

valoare prin intermediul lui

$_POST[a].

Analog, dac datele ar fi trimise c tre server prin intermediul metodei GET (deci n mod
vizibil, n cererea URL, de exemplu http://mypage.html?a=13), n cadrul script-ului PHP
asociat,

preluarea

lor

se

face

prin

intermediul

vectorului

predefinit

$_GET[nume_cmp_formular].

n cazul n care un anumit cmp nu exist , n momentul cererii $_POST[...] din cadrul
PHP-ului, acesta s-ar putea sa genereze un mesaj de tip atenionare (warning) n funcie de set ri.
Pentru a evita acest lucru, n faa caracterului $ (de la $_POST[...]) punem caracterul @.
Semnificaia acestuia este de a ignora mesajele de tip warning.

65

Iat i codul lui apl052.php, scriptul PHP pe care l-am anunat n atributul action al
formularului apl051.html, script care va trebui s se afle n acelai director cu apl051.html.
Scriptul preia valoarea cmpului text din form i afieaz att valoarea recuperat ct i p tratul s u:
<?php
$a=$_POST['a'];//deci, in variabila $a preluam valoarea din cimpul cu
//atributul name="a" al form-ului care a trimis datele.
echo "Iata valoarea preluata din formular: ",$a,"<br><br>";
echo "Patratul sau este ",$a*$a;
?>

Vom studia, n continuare, modul n care se preiau datele din toate tipurile de elemente care
pot s apar ntr-un formular obinuit:
- n cazul unui input de tip text, am v zut deja cum se face acest lucru. n exact acelai
mod se preiau datele dintr-un input de tip password, de tip hidden sau de tip textarea.
- n cazul unui input de tip submit, valoarea (care este de fapt textul scris pe buton) se
poate prelua doar n cazul n care, n cadrul tagului <input type=submit...> apare i
atributul name. Evident, n cazul n care formularul are un singur control de tip submit, e destul de
ilogic sa dorim sa vedem ce valoare are.
Totui, n cazul n care un formular are dou sau mai multe butoane de tip sumbit, c rora
vrem s le asign m funcii diferite, este foarte important s tim care dintre ele a fost ap sat.
Iat mai jos un astfel de exemplu:
apl053.html + apl054.php primul fiier conine un formular cu dou cmpuri text, n care

introducem valori numerice. n funcie de controlul submit pe care-l ap s m, al doilea fiier va


prelua datele i va calcula fie produsul fie suma celor dou valori numerice:
apl053.html:
<form action="apl054.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td align="right">Introdu o valoare numerica:
<td align="center">
<input type="text" name="cta" maxlength="4" size="4">
<tr><td align="right">Introdu o alta valoare numerica:
<td align="center">
<input type="text" name="ctb" maxlength="4" size="4">
<tr><td colspan="2" align="center">
<input type="submit" value="Calculeaza suma" name="operatia">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="submit" value="Calculeaza produsul" name="operatia">
</table>
</form>

apl054.php:
<?php
$op=$_POST['operatia'];//controlul cu numele 'operatia' este chiar butonul de submit
//preluam valoarea sa in variabila $op, pentru a vedea care dintre butoane a fost apasat
$a=$_POST['cta'];//preluam si cele doua valori numerice
$b=$_POST['ctb'];//din cimpurile text cu numele cta si ctb
//le afisam:
echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>";
//in functie de valoarea lui "op" calculam suma sau produsul

66

if($op=="Calculeaza suma")
echo "Suma celor doua este ",$a+$b;
else
echo "Produsul celor doua este ",$a*$b;
?>

- n cazul unui control de tip radio, s ne amintim mai nti c toate tag-urile de tipul
<input type=radio...> trebuie s

aib la atributul name acelai nume, iar la atributul

value valori diferite, prin care vom identifica opiunea aleas . Aceast valoare va fi trimis c tre

PHP.
Iat un exemplu de utilizare al controlul de tip radio: apl055.html + apl056.php. Cu aceast
ocazie vom folosi i instruciunea switch a limbajului PHP, instruciune pe care nu am prezentat-o,
ns care are exact aceeai sintax i funcionalitate ca n C.
apl055.html:
<form action="apl056.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td align="right">Introdu o valoare numerica:
<td align="center">
<input type="text" name="cta" maxlength="4" size="4">
<tr><td align="right">Introdu o alta valoare numerica:
<td align="center">
<input type="text" name="ctb" maxlength="4" size="4">
<tr><td colspan="2">
Alege operatia pe care doresti<br>
sa o faci cu cele doua:<br>
<input type="radio" value="1" name="op" checked>Suma<br>
<input type="radio" value="2" name="op">Diferenta<br>
<input type="radio" value="3" name="op">Produsul<br>
<input type="radio" value="4" name="op">Citul
<tr><td colspan="2" align="center">
<input type="submit" value="Calculeaza">
</table>
</form>

apl056.php:
<?php
$op=$_POST['op'];//controlul cu numele 'op' este grupul de butoane radio.
//preluam valoarea sa in variabila $op, pentru a vedea care optiuni a fost aleasa
$a=$_POST['cta'];//preluam si cele doua valori numerice
$b=$_POST['ctb'];//din cimpurile text cu numele cta si ctb
//le afisam:
echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>";
//in functie de valoarea lui "op" calculam suma sau produsul
switch($op)
{
case 1:
echo "Suma celor doua este ",$a+$b;
break;
case 2:
echo "Diferenta celor doua este ",$a-$b;
break;
case 3:
echo "Produsul celor doua este ",$a*$b;
break;
default:
echo "citul celor doua este ",$a/$b;
}
?>

67

- n cazul unui control de tip checkbox, s ne reamintim c fiecare control de acest tip are
un nume separat. Dac este bifat, va trimite c tre PHP valoarea indicat n atributul value a
tag-ului <input type=checkbox...> (ca ir de caractere). Dac acest atribut nu este prezent,
valoarea trimis c tre PHP va fi irul de caractere on.
n schimb, dac nu este bifat, pur i simplu nu va trimite nimic, deci s-ar putea ca cererea
$_POST[...] sa genereze un warning (depinde i de set rile PHP-ului). Pentru ca acest lucru s nu

se ntmple, indiferent de set ri, aa cum am anunat mai nainte, folosim caracterul @ n faa cererii
$_POST[...].

Iat mai jos un exemplu: apl057.html + apl058.php


apl057.html:
<form action="apl058.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td>Alege, dintre cele de mai jos,<br>
limbile straine pe care le cunosti:
<tr><td>
<input type="checkbox" name="en">Engleza<br>
<input type="checkbox" name="fr">Franceza<br>
<input type="checkbox" name="ge">Germana<br>
<input type="checkbox" name="it">Italiana<br>
<input type="checkbox" name="es">Spaniola<br>
<tr><td align="center">
<input type="submit" value="Trimite date">
</table>
</form>

apl058.php:
<?php
$en=@$_POST['en'];
$fr=@$_POST['fr'];
$ge=@$_POST['ge'];
$it=@$_POST['it'];
$es=@$_POST['es'];
$l=0;//$l este un flag pe care-l facem 1 cind dam de o limba straina bifata
echo "Iata limbile straine pe care le-ai bifat:<br>";
if($en=="on") {echo "Engleza<br>";$l=1;}
if($fr=="on") {echo "Franceza<br>";$l=1;}
if($ge=="on") {echo "Germana<br>";$l=1;}
if($it=="on") {echo "Italiana<br>";$l=1;}
if($es=="on") {echo "Spaniola<br>";$l=1;}
if($l==0)//daca flag-ul a ramas 0, dam utilizatorului
//un mesaj prin carae il informam ca nu a bifat nimic
echo "Nu ai bifat nici una dintre limbile straine!";
?>

- n cazul unui control de tip select simplu, PHP-ul va putea recupera valoarea cu ajutorul
numelui stabilit n atributul name al tag-ului <select ...>, valoarea trimis fiind cea stabilit n
atributul value al tag-urilor option nglobate n cadrul select-ului.
Iat mai jos un exemplu (apl059.html + apl060.php) care reia ideea din apl055.html
cu deosebirea c , n loc de a alege operaia dorit prin intermediul unui control radio, o alegem cu
ajutorul controlului select. A se remarca faptul c fiierul care prelucreaz datele (apl060.php)
a r mas identic cu cel care prelucra datele din apl055.html.

68

apl059.html:
<form action="apl060.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td align="right">Introdu o valoare numerica:
<td align="center">
<input type="text" name="cta" maxlength="4" size="4">
<tr><td align="right">Introdu o alta valoare numerica:
<td align="center">
<input type="text" name="ctb" maxlength="4" size="4">
<tr><td colspan="2">Alege operatia pe care doresti<br>
sa o faci cu cele doua:
<select name="op">
<option value="1">Suma
<option value="2">Diferenta
<option value="3">Produsul
<option value="4">Citul
</select><tr><td colspan="2" align="center">
<input type="submit" value="Calculeaza"></table></form>

apl060.php:
<?php
$op=$_POST['op'];//controlul cu numele 'op' este cel de tip option
$a=@$_POST['cta'];
$b=@$_POST['ctb'];
echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>";
switch($op)
{
case 1:
echo "Suma celor doua este ",$a+$b;
break;
case 2:
echo "Diferenta celor doua este ",$a-$b;
break;
case 3:
echo "Produsul celor doua este ",$a*$b;
break;
default:
echo "citul celor doua este ",$a/$b;
}
?>

- n cazul unui control de tip select multiplu, form-ul va trimite c tre PHP un ir n care
vom reg si valorile selectate. Este obligatoriu, totui, ca atributul name din cadrul tag-ului
<select multiple ...> s specifice faptul c se va trimite un ir. Acest lucru se face punnd

un set de paranteze p trate dup numele cmpului, deci de forma name=nume_sir[].


Preluarea n PHP se face n mod normal, prin @variabila=@$_POST[nume_sir]
(remarcai faptul c nu se mai pun []).
Acest ir va conine pe post de elemente valorile stabilite prin atributul value ale opiunilor
selectate. irul va ncepe de la indicele 0, num rul s u total de elemente fiind dat de funcia
count(nume_ir).

Iat un exemplu care exploateaz o list de tipul <select multiple...> (apl061.html


+ apl062.php)

69

apl061.html:
<form action="apl062.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td>Alege, dintre cele de mai jos,<br>
limbile straine pe care le cunosti.<br>
Poti selecta, evident, mai multe<br>
daca tii apasata tasta Control in<br>
timpul selectarii
<tr><td>
<select name="lang[]" multiple size="5">
<option value="en">Engleza
<option value="fr">Franceza
<option value="ge">Germana
<option value="it">Italiana
<option value="sp">Spaniola
</select>
<tr><td align="center">
<input type="submit" value="Trimite date">
</table>
</form>

apl062.php:
<?php
$lang=$_POST['lang'];//recuperam sirul trimis de catre form prin cimpul lang
$nl=count($lang);//apelam functia count pentru a vedea cite elemente are sirul
if($nl==0)
echo "Nu ai selectat nici o limba straina<br>";
else
{
echo "Ai selectat $nl limbi straine. Acestea sunt:<br>";
for($i=0;$i<$nl;$i++)//parcurgem sirul pe un for, de la 0 la $nl-1
switch($lang[$i])//si vedem ce valoare are fiecare element, in functie de
{ //care afisam:
case "en":echo "Engleza<br>";break;
case "fr":echo "Franceza<br>";break;
case "ge":echo "Germana<br>";break;
case "it":echo "Italiana<br>";break;
default:echo "Spaniola<br>";
}
}
?>

- una dintre facilit ile transmiterii datelor prin intermediul formularelor const

posibilitatea trimiterii rezultatului mai multor controale sub forma elementelor unui ir sau chiar
matrice. n acest caz, atributul name al controlului din form trebuie s specifice acel element din ir
(sau matrice) care va primi valoarea sa, deci s fie de forma: name="nume_ir[indice]"
respectiv name="nume_matrice[indice_linie][indice_coloan]". Iat un exemplu n
care cre m un form cu 4 controale de tip input type="text", ale c ror valori vor fi preluate de c tre
un ir cu 4 elemente (apl063.html + apl064.php):
apl063.html:
<form action="apl064.php" method="post">
Introdu 4 valori numerice intregi:<br><br>
prima valoare: <input type="text" name="a[1]"><br><br>
valoarea a 2-a:<input type="text" name="a[2]"><br><br>
valoarea a 3-a:<input type="text" name="a[3]"><br><br>
valoarea a 4-a:<input type="text" name="a[4]"><br><br>
<br>
<input type="submit" value="Trimite valorile spre prelucrare">
</form>

70

apl064.php:
<?php
$a=$_POST['a'];
echo 'Cele 4 valori sunt: ',$a[1],' ',$a[2],' ',$a[3],' ',$a[4],'<br>';
$s=0;
for($i=1;$i<=4;$i++)
$s+=$a[$i];
echo '<br>Suma lor este: ',$s;
?>

3.7. Func ii n PHP.


n PHP se pot scrie funcii ntr-un mod foarte similar fa de ceea ce tim din C/C++. S
consider m exemplul urm tor, n care se utilizeaz o funcie care calculeaz i ntoarce suma unui
num r ntreg pe care l primete ca parametru:
apl065.php:
<?php
function suma_c($n)//antetul funciei: se remarc folosirea cuvntului cheie
//function fr a se specifica vreun tip (nici mcar void)
{
$s=0;
while($n)
{
$s+=$n%10;
$n=(int)($n/10);//ne reamintim c n PHP operatorul / calculeaz
//ctul real (deci cu zecimale): din acest motiv folosim conversia
//explicit ctre int
}
return $s;//la fel ca i n C++, rezultatul ntors de funcie se specific
//prin intermediul instruciunii return
}
echo suma_c(13254);
?>

Aadar:

Pentru a ntoarce un rezultat din corpul unei funcii, se folosete, aa cum suntem deja

obinuii, instruciunea return. Forma sa general este: return expresie.

n cazul unei funcii care nu ntoarce rezultat (deci echivalentul unei funcii de tip void

din C++), cuvntul cheie function r mne obligatoriu (f r a specifica nimic suplimentar) putnd
s apar oriunde n cadrul funciei cuvntul cheie return f r a mai fi urmat de vreo expresie,
avnd ca efect ieirea imediat din funcie. El poate fi, de asemenea, omis, ieirea din funcie
producndu-se n acest caz n mod natural (dup executarea ntregului s u cod).

Transmiterea parametrilor se poate face att prin valoare ct i prin referin , n acelai

mod n care se face i n C++ :


1) Parametrii specificai n mod direct (folosind doar numele variabilei) sunt cei transmii prin
valoare. Chiar dac valoarea unui astfel de parametru este schimbat n cadrul funciei, ea r mne

71

totui neschimbat dup executarea acesteia. Atunci cnd apel m funcia, pe poziiile acestor
parametri se pot transmite att valori ct i coninutul unor variabile.
Script-ul urm tor afieaz valoarea variabilei de dinainte de apelul funciei (10) chiar dac
n funcie s-a ncercat modificarea valorii transmise (apl066.php):
<?php
function test($x)
{
$x=$x*2;
}
$a=10;
test($a);
echo $a;
?>

2) Parametrii pe care dorim s -i transmitem prin referin , trebuie precedai de caracterul &
(ampersand) n antetul funciei. Dac valoarea unui astfel de parametru este modificat n cadrul
funciei, ea r mne modificat i dup executarea acesteia. Evident, atunci cnd apel m funcia, pe
poziiile acestor parametrii e obligatoriu s specific m variabile.
Relu m scriptul anterior, punnd un & (ampersand) n faa parametrului $x. n acest fel,
valoarea variabilei dup ce apel m funcia nu va mai fi cea anterioar (10) ci cea obinut n urma
modific rii (20) apl067.php:
<?php
function test(&$x)
{
$x=$x*2;
}
$a=10;
test($a);
echo $a;
?>

n funcie de domeniul de vizibilitate, i n PHP variabilele se clasific n variabile locale

i variabile globale. Cele globale sunt cele definite n afara oric rei funcii. Implicit, ele nu pot fi
adresate din corpul vreunei funcii. Totui, exist o posibilitate de a face acest lucru: n cadrul
funciei n care vrem s utiliz m variabile globale, le specific m pe toate, precedate de cuvntul
cheie global. Putei observa acest mecanism n exemplu urm tor:
apl068.php:
<?php
function suma()
{
global $a,$b,$c;
//functia se bazeaza pe cele 3 variabile globale $a, $b si $c
//calculnd n $c suma dintre $a si $b
//daca nu am fi pus instructiunea global, exemplul nu ar fi functionat deoarece
//cele 3 variabile nu ar fi fost recunoscute in functie.
$c=$a+$b;
}
$a=5;$b=6;
suma();
echo $c;
?>

72

Variabilele locale sunt variabilele create n corpul unei funcii sau cele create prin
transmiterea parametrilor formali (din antetul funciilor). Ele nu sunt recunoscute n afara funciilor.
i n PHP funciile pot fi recursive.

Pentru a nu nc rca foarte mult un anumit script, putem ngloba toate definiiile complete

ale funciilor ntr-un singur fiier de tip text (preferabil cu extensia .php, pentru a nu putea fi
vizualizat accidental prin intermediul server-ului http). Mecanismul includerii este unul asem n tor
cu cel din C/C++ (clauza #include...) cu deosebirea c , putem include codul surs al funciilor
n

orice

loc

dorim.

Acest

lucru

se

face

cu

ajutorul

funciei

predefinite

PHP:

require(nume_fisier); .

Codul surs al funciilor trebuie inclus i el ntre tag-urile <?php .. ?>.


n exemplul de mai jos, vom crea dou fiiere: apl069.php, ce conine definiia corect a
unei funcii care verific dac un num r este prim, i un altul apl070.php, ce afieaz toate numerele
prime dintre 1 i n, folosind funcia din apl069.php:
apl069.php:
<?php
//a se remarca folosirea tag-urilor specifice includerii unei secvene PHP
function is_prime($x)
{//$x este un parametru prin valoare
for($i=2;$i<=sqrt($x);$i++)//variabila $i este local
if($x%$i==0) return 0;
if($x<=1) return 0;
return 1;
}
?>

apl070.php:
<?php
require("apl069.php");//prin aceast funcie includem codul existent n apl069.php
for($i=2;$i<=100;$i++)
if(is_prime($i)) echo $i,"&nbsp;&nbsp;&nbsp;";
//o dovad a comportamentului local al variabilei $i din cadrul funciei const n faptul
//c i n codul principal (mai sus) folosim tot o variabil $i, iar cele dou nu se
//ncurc ntre ele
?>

Limbajul PHP este nzestrat cu biblioteci care conin numeroase alte funcii. Iat cteva
dintre funciile matematice predefinite:
- abs(num r) ntoarce modulul num rului (valoarea absolut );
- sin(x), cos(x), tan(x) sinusul, cosinusul i tangenta unui unghi. Argumentul x trebuie
specificat n radiani;
- exp(x) ntoarce ex ;
- pow(x, y) ntoarce xy ;
- log10(x), log(x) ntorc log10(x), respectiv ln(x);
- max(x1, x2, ... , xn) ntoarce maximul (cel mai mare) dintre argumentele sale numerice;
73

- min(x1, x2, ... , xn) ntoarce minimul (cel mai mic) dintre argumentele sale numerice;
- ceil(x) ntoarce cel mai mic nr. ntreg care este mai mare sau egal cu x;
- floor(x) ntoarce cel mai mic nr. ntreg mai mare sau egal cu x (partea ntreag d.p.d.v.
matematic);
- rand(min,max) ntoarce o valoare ntreag aleatoare cuprins ntre valorile ntregi min i max
(inclusiv);

- pi() ntoarce o aproximaie a num rului ;


- sqrt(x) calculeaz radicalul (r d cina p trat ) a lui x.

3.8. Prelucrarea irurilor de caractere.


Spre deosebire de C/C++, unde irurile de caractere sunt privite ca pointeri, n PHP irurile
de caractere sunt privite mai degrab ca nite variabile de sine st t toare.
n PHP sunt permise atribuirile directe (prin operatorul =) ntre dou iruri de caractere.
Din punct de vedere structural, n PHP irurile de caractere nu mai respect regulile din
C/C++ (i n special, NU mai este valabil marca sfritului de string prin caracterul de cod ASCII
0), n schimb, limbajul ne pune la dispoziie o serie de funcii care fac foarte simpl prelucrarea i
manipularea stringurilor.
n rest, irurile se memoreaz ca o succesiune de caractere ASCII. Putem adresa fiecare
caracter al irului prin indicele s u, la fel ca n C/C++, ncepnd de la 0.

Funcia strlen(ir) ne ntoarce lungimea irului (num rul s u de caractere).

Dac

dorim s

parcurgem irul de caractere, putem s -l parcurgem, ca n C++, de la 0 la

strlen(...)-1.

apl071.php:

Afi m caracterele unui string, ntr-un tabel cu o singur linie:

<?php
$a="Iepurechin";
echo '<table border="1" cellspacing="0" cellpadding="10"><tr>';
for($i=0;$i<strlen($a);$i++)
echo '<td>',$a[$i];
echo '</table>';
?>

Concatenarea a dou sau mai multe stringuri se face cu operatorul . (punctul). Observai

n exemplu de mai jos cum se face acest lucru, i de asemenea faptul c , n timpul concaten rii,
valoarea numeric a fost convertit implicit c tre ir de caractere:
$x=9;
$s="Ana "."are ".$x." mere";
echo $s;//valoarea final a stringului este "Ana are 9 mere"

74

Funcia strpos(sir1, sir2, [poz_start]) caut dac sir2 este subir al lui sir1
(eventual ncepnd de la poziia poz_start, dac aceasta este specificat ). n caz afirmativ,
ntoarce poziia de nceput a acestuia, altfel ntoarce false. n exemplul de mai jos se va afia
valoarea 3 (pentru c la indicele 3 este g sit secvena pu n stringul dat):
$s="computer";
echo strpos($s,"pu");

Funcia se utilizeaz i pentru a testa dac un ir include sau nu un anumit subir. Dac
subirul este g sit, funcia ntoarce poziia de nceput a acestuia iar dac nu, ntoarce false. Dup
cum tim, valoarea lui false este, de fapt, 0. Pentru a diferenia cazurile n care subirul nu apare
deloc n ir sau apare chiar de la poziia 0, folosim operatorul ===, care rezolv corect problema:
$s="ana are mere";
$gasit=strpos($s,"a");
if($gasit===false) echo "Negasit";
else echo "Gasit la indicele ",$gasit;

Valoarea ntoars de funcie este reinut de variabila $gasit. Pentru a face distincie ntre
false i 0, folosim operatorul ===, care testeaz coincidena att ca valoare, ct i ca tip. De altfel,

acesta este i rostul unui astfel de operator. Acest procedeu se poate folosi i pentru alte funcii.

Funcia strstr(sir1, sir2) returneaz din sir1 secvena de caractere din poziia n

care a fost g sit prima apariie a lui sir2, dac sir2 este subir pentru sir1 sau false, n caz
contrar.

Funcia strcmp(sir1, sir2) compar lexicografic (alfabetic) sir1 cu sir2. Valoarea

ntoars este:
- pozitiv , dac sir1 se g sete lexicografic dup sir2; (sir1>sir2)
- nul (0), dac sir1 este identic egal cu sir2; (sir1==sir2)
- negativ , dac sir2 se g sete lexicografic nainte de sir1. (sir1<sir2)
n PHP se pot folosi deopotriv i pentru stringuri operatorii relaionali: <, <=, >, >=, ==,
!=, care le compar direct, n sens lexicografic, avnd ca rezultat true sau false.
Observaie: Comparaia face distincie ntre literele mari i cele mici (codul ASCII) !

Funcia substr(sir, indice, [lungime]) ntoarce subirul irului ir, care ncepe
n poziia indice i are lungimea lungime. Dac parametru lungime este absent, se ntoarce irul
care ncepe n poziia indice i ine pn la sfritul irului ir.
Exemplu: apl072.php
<?php
$s="televiziune";
$s1=substr($s,1,4);
echo $s1,'<br>';//afiseaza "elev";
$s2=substr($s,4);
echo $s2;//afiseaza "viziune";
?>

75

Funcia substr_replace(sir1, sir2, ind, [lung]) ntoarce irul rezultat prin


nlocuirea n sir1, a subirului care ncepe n poziia ind i are lungimea lung, cu sir2. Dac
parametrul lung este absent, sir2 nlocuiete subirul care ncepe cu ind i ine pn la sfritul
irului ir1, cu ir2.
Exemplu: apl073.php
<?php
$s="Ana are mere";
echo substr_replace($s,"poseda",4,3); //nlocuiete subirul are (care ncepe la
//indicele 4 i are 3 litere) cu subirul poseda, deci afieaz Ana poseda mere
?>

Funcia strtoupper(sir) ntoarce irul rezultat prin conversia doar a acelor caractere

sunt litere mici, la litere mari, iar funcia strtolower(sir) ntoarce irul rezultat prin conversia
literelor mari la litere mici.

Funcia strtok(...) este utilizat pentru extrage substringuri ale unui string, care n

acesta sunt delimitate de nite caractere ce aparin unui ir cu delimitatori, dat. De exemplu, dac
avem stringul Ana? Nu, doar tu. i consider m stringul cu separatori: .? #, (este i un caracter
spaiu printre ele) se vor separa i obine substringurile Ana, Nu, doar, tu.
Modelul de aplicare:
- iniial se apeleaz funcia strtok(string, ir_cu_separatori). Funcia va
ntoarce fie primul cuvnt obinut prin separare, fie false dac acest lucru nu a fost posibil.
- apoi se apeleaz funcia strtok(ir_cu_separatori). Aceasta va tot extrage
cte un cuvnt nou obinut prin separare, fie false dac s-a ajuns deja la sfrit, deci dac au fost
separate toate cuvintele.
Este recomandat ca testarea valorii false ntoars de funcie s fie testat cu operatorul
=== deoarece, n caz contrar este posibil s apar erori din cauza conversiilor (de exemplu, funcia

s ntoarc 0, iar acesta s fie interpretat ca i false).


De remarcat, spre deosebire de limbajul C++, c funcia strtok NU distruge stringul asupra
c reia este aplicat , ci l las intact, exact ca nainte de separare.
Exemplu: apl074.php
<?php
$s="Ana? Nu, doar tu.";
//varianta 1: pe un while:
$p=strtok($s,"?,.# ");
echo "Stringul initial este:",$s,'<br>Cuvintele sale sunt:<br><br>';
while($p!==false)
{
echo "cuvintul <b>",$p,"</b> are ",strlen($p),' litere<br>';
$p=strtok("?.#, ");
}
//varianta 2: pe un for "mascat":
echo '<br>Iata acelasi string, separat in acelasi mod, folosind o repetitiva';
echo ' de tip for:<br>';
for($p=strtok($s,"?.,# ");$p!==false;$p=strtok("., ?#"))
echo "Cuvintul curent <b>",$p,"</b> are ",strlen($p)," litere<br>";
?>
76

3.9. iruri (masive) n PHP.


n PHP exist mult mai puine constrngeri dect n C/C++ atunci cnd lucr m cu iruri sau
cu matrice. n primul rnd, n PHP un ir nu se declar . n momentul n care dorim s cre m un ir
(sau o matrice), pur i simplu atribuim valori elementelor:
apl075.php:
<?php
for($i=1;$i<=5;$i++)
$x[$i]=$i;
for($i=1;$i<=5;$i++) echo $x[$i]," ";
?>

sau

apl076.php:

<?php
$k=1;
for($i=1;$i<=5;$i++)
for($j=1;$j<=5;$j++)
$a[$i][$j]=$k++;
for($i=1;$i<=5;$i++)
{
for($j=1;$j<=5;$j++)
echo $a[$i][$j],' ';
echo '<br>';
}
?>

Dac unui element aflat la un anumit indice nu i-am atribuit nici o valoare, n orice evaluare,
acel element are valoarea NULL. Nu este obligatoriu s folosim indici consecutivi.
Ba mai mult, n PHP irurile pot primi pe post de indici chiar i iruri de caractere. Acest fel
de tablou se numete tablou asociativ. De exemplu, putem crea un ir n care s reinem pe
post de indici denumirile unor produse, iar pe post de indici preurile acestora:
apl077.php:
<?php
$x['Piine']=1.61;
$x['Vin']=5.99;
$x['Alune']=2.21;
$x['Ciocolata']=2.69;
echo $x['Piine'],' ',$x['Vin'],' ',$x['Alune'],' ',$x['Ciocolata'];
?>

Evident, parcurgerea unui astfel de ir (variabila de ciclare printre indici nu mai respect o
regul clasic , numeric ) nu se mai face dup regulile clasice, ci exist o instruciune special de
ciclare ce permite parcurgerea vectorului n ordinea n care elementele au fost create, cu
determinarea, pentru fiecare element, a perechii indice, valoare:
foreach(vector as indice=>valoare)
instruciune;

Funcia count(vector) ntoarce num rul total de elemente (folosite, deci c rora le-am
atribuit valori) ale vectorului.
77

apl078.php:
<?php
$x['Piine']=1.61;
$x['Vin']=5.99;
$x['Alune']=2.21;
$x['Ciocolata']=2.69;
echo "Sirul are in total ",count($x)," elemente.<br>";
echo "Acestea sunt:<hr>";
$s=0;
foreach($x as $indice=>$valoare)
{
echo $indice," in valoare de ",$valoare,"<br>";
$s=$s+$valoare;
}
echo "<hr>Valoarea totala:",$s;
?>

Dac

n cadrul instruciunii foreach omitem partea cu indice=> (deci l s m

instruciunea n forma foreach(vector as valoare) ..., se vor parcurge doar valorile


vectorului, indicii fiind omii.
Exist i alte funcii care faciliteaz accesul la elementele vectorului. Acestea se bazeaz pe
urm toarea particularitate a implement rii unui vector n PHP: fiecare vector are asociat un pointer
intern, pointer care se afl pe un anumit element al irului (numit element curent):
current(vector); - ntoarce valoarea reinut de elementul curent al vectorului;

key(vector); - ntoarce indicele elementului curent al vectorului;

Ambele funcii (current i key), dac pointerul a trecut de vreunul din capete, sau dac
irul este vid, ntorc valoarea false. Din cauz c valoarea 0 sau pot fi valori valide pentru ir,
pentru a testa dac funcia a ntors valoarea false, trebuie utilizat operatorul ===

next(vector); - deplaseaz pointerul pe elementul urm tor al vectorului;

prev(vector); - deplaseaz pointerul pe elementul anterior al vectorului;


reset(vector); - deplaseaz pointerul pe primul element al vectorului;

end(vector); - deplaseaz pointerul pe ultimul element al vectorului;

Exemplu: apl079.php (care realizeaz exact acelai lucru ca i aplicaia precedent )


<?php
$x['Piine']=1.61;
$x['Vin']=5.99;
$x['Alune']=2.21;
$x['Ciocolata']=2.69;
echo "Sirul are in total ",count($x)," elemente.<br>";
echo "Acestea sunt:<hr>";
$s=0;
while(($valoare=current($x))!==false)
{
echo key($x)," in valoare de ",$valoare,"<br>";
next($x);
$s=$s+$valoare;
}
echo "<hr>Valoarea totala:",$s;
?>
78

Exist de asemenea o serie de funcii cu ajutorul c rora putem sorta elementele unui vector.
Le vom exemplifica pe irul din exemplul de mai sus ($x['Piine']=1.61;
$x['Alune']=2.21;

$x['Ciocolata']=2.69;)

$x['Vin']=5.99;

n ideea c , dup ce am aplicat funcia specific de

sortare, afi m irul nou cu ajutorul urm toarei secvene:

foreach($x as $i=>$v)
echo $i," => ",$v,"<br>";

asort(vector) : sorteaz cresc tor vectorul dup valorile


reinute de fiecare element. Indicii se vor interschimba, evident, n mod

Piine => 1.61


Alune => 2.21
Ciocolata => 2.69
Vin => 5.99

corespunz tor;

arsort(vector) : sorteaz

descresc tor vectorul dup

valorile reinute de fiecare element. Indicii se vor interschimba, evident,


n mod corespunz tor;

ksort(vector) : sorteaz

cresc tor vectorul dup

valorile

reinute de indici. Valorile se vor interschimba, evident, n mod

Vin => 5.99


Ciocolata => 2.69
Alune => 2.21
Piine => 1.61

Alune => 2.21


Ciocolata => 2.69
Piine => 1.61
Vin => 5.99

corespunz tor;

krsort(vector) : sorteaz cresc tor vectorul dup valorile


reinute de indici. Valorile se vor interschimba, evident, n mod

Vin => 5.99


Piine => 1.61
Ciocolata => 2.69
Alune => 2.21

corespunz tor;

sort(vector) i rsort(vector) sorteaz cresc tor, respectiv


descresc tor, valorile elementelor vectorului. Valorile indicilor se pierd,
nlocuindu-se cu indici numerici avnd valori cuprinse ntre 0 i

irul $x n urma
unui sort($x):
0 => 1.61
1 => 2.21
2 => 2.69
3 => 5.99

nr.elemente-1.

79

3.10. Programare grafic utiliznd PHP.

Una dintre cele mai spectaculoase componente ale multor limbaje de programare, din p cate
l sat

de multe ori n umbr

n majoritatea cursurilor de programare, const

n crearea i

manipularea imaginilor.
Limbajul PHP nu este limitat doar la crearea de output HTML, ci poate fi folosit i pentru a
crea respectiv a lucra cu diferite formate de imagini, incluznd gif, png, jpg. Ba mai mult, PHP
poate genera o imagine sub forma unui flux de date (deci f r a o nregistra efectiv sub forma unui
fiier pe server) direct c tre browser.
Pentru a face funcional suportul grafic al limbajului, este necesar utilizarea bibliotecii gd2.
n cazul pachetului XAMPP, aceasta este instalat i activat n mod implicit. n cazul altor
distribuii, acest lucru trebuie f cut manual.
Pentru nceput, s vedem cum se poate crea n mod dinamic o imagine: vom crea un script
PHP, a c rui deschidere, n browser, va avea ca efect vizualizarea imaginii create de c tre acest
script. Vei remarca faptul c , o serie de elemente (imaginile, textul, culorile) au nevoie de nite
variabile numite variabile resurs .
Din p cate, spre deosebire de o serie de alte limbaje de programare, nu exist constante
predefinite pentru culori, ci acestea trebuie s

fie create manual, specificnd pentru fiecare

componentele de rou, verde i albastru, ntocmai ca la HTML, cu deosebirea faptului c , de aceast


dat , cele trei componente de culoare se specific n baza 10, deci printr-un num r de la 0 la 255.
Script-ul conine comentariile necesare nelegerii codului s u. Dup prezentarea sa vom
relua detaliat fiecare dintre funciile folosite.
apl080.php
<?php
header("Content-type: image/png");
/*aceasta instructiune va atasa fluxului de date creat, care la utilizator
va ajunge sub forma de fisier, informatii asupra faptului ca este vorba de un
fisier imagine, si anume de tip png.
Aceasta informatie este esentiala pentru browser pentru a deschide fisierul ca
si pe o imagine. Puteti incerca ce se intimpla daca omiteti apelul acestei functii:
browser-ul va primi datele sub forma de text, deci va afisa o serie de caractere
aparent fara nici un sens*/
$imagine=imagecreatetruecolor(400,250);
/* aceasta instructiune creeaza o resursa de tip imagine, pe 32 de biti (truecolor)
ce va putea fi identificata in continuare prin variabila $imagine. Imaginea va avea
latimea de 400 de pixeli, si inaltimea de 250.
*/
$galben=imagecolorallocate($imagine,255,255,0);
/* prin aceasta instructiune am definit culoarea galben */
imagefilledrectangle($imagine,0,0,399,249,$galben);
/* iar prin aceasta instructiune am desenat un dreptunghi plin, de culoare galbena,
ce se intinde peste toata imaginea: (0,0) respectiv (399,249) sunt doua colturi diaginale
ale dreptunghiului.
Practic am "umplut" toata imaginea cu un fundal galben */

80

$rosu=imagecolorallocate($imagine,255,0,0);
/* prin aceasta cream culoarea rosie */
imagesetthickness($imagine,4);
/* prin aceasta stabilim grosimea implicita a liniilor desenate la 4 pixeli */
imageline($imagine,10,10,389,239,$rosu);
/* si desenam o linie de culoare rosie*/
imageellipse($imagine,200,125,200,200,$rosu);
/* iar apoi desenam un cerc cu centrul in centrul imaginii, de raza 100 */
imagepng($imagine);
/*si, in fine, afisam imaginea respectiva in format png, trimitind-o direct in browser*/
imagedestroy($imagine);
/* dezalocam resursa, pentru a nu ocupa memorie inutila */
?>

Iat rezultatul obinut prin nc rcarea sa n browser:

Iat cteva dintre cele mai importante funcii care lucreaz cu imagini:

header(string) - are ca efect trimiterea unui header HTTP. n cazul nostru, al lucrului

cu imagini, ne intereseaz s trimitem browser-ului informaii despre mime-type-ul imaginii


create. Astfel, valorile pe care le putem da string-ului, n funcie de tipul imaginii pe care o cre m,
pot fi:
Content-type: image/png pentru imaginile de tip png
Content-type: image/jpeg pentru imaginile de tip jpg
Content-type: image/gif pentru imaginile de tip gif
Este foarte important (n caz contrar se vor genera erori) ca aceast funcie s fie apelat
nainte de trimiterea oric rui alt output din cadrul script-ului n care apare;

imagecreatetruecolor(lime, nlime)- creeaz o resurs de tip imagine, pe

32 de bii (truecolor) avnd l imea, respectiv n limea specificat . Rezultatul ntors de aceast
funcie trebuie obligatoriu atribuit unei variabile, prin intermediul c reia vom accesa n continuare
imaginea.
Imaginea este de fapt o matrice de pixeli. Orice punct din imagine se va putea referi prin
coordonatele sale carteziene (x, y). Originea sistemului de coordonate se g sete n coul stnga-sus
al imaginii (0,0) iar axa Oy este ndreptat n jos. Valorile posibile pentru x i y sunt numere
ntregi, cuprinse n intervalul 0..lime-1, respectiv 0..nlime-1

81

De exemplu, iat o reprezentare schematic a imaginii definite prin:


$imagine=imagecreatetruecolor(400,300);
O(0,0)

x0 = 200

399

(300,75)

y1 = 75
y0 = 150

x1= 300

(200,150)

299
y
Am pus n eviden n cadrul imaginii de mai sus punctele de coordonate (200,150)
respectiv (300,75).

imagecolorallocate(resurs_imagine, rou, verde, albastru)- creeaz o

resurs de tip culoare, asociat imaginii specificat prin resursa din primul parametru. Rezultatul
ntors de aceast funcie trebuie atribuit unei variabile, prin intermediul c reia vom accesa n
continuare culoarea definit ;

imagesetthickness(res_imag,

thickness) - stabilete grosimea liniilor la

thickness pixeli, atunci cnd se deseneaz linii, dreptunghiuri, poligoane;

imageline(resurs_imagine,x0,y0,x1,y1,resurs_culoare) - deseneaz

un

segment de dreapt , de culoarea specificat de resurs_culoare, n imaginea specificat de


resurs_imagine, ntre punctele de coordonate (x0,y0) i (x1,y1);

imagedashedline(resurs_imagine,x0,y0,x1,y1,resurs_culoare)
- la fel ca imageline, doar c segmentul de dreapt desenat este punctat. Pentru ca
segmentul punctat s fie vizibil, trebuie ca imagesetthickness s seteze grosimea liniei la cel
puin 2 pixeli;

imageellipse(resurs_imagine,x0,y0,diam_x,diam_y,resurs_culoare)
- deseneaz o elips cu axe paralele cu axele de coordonate, avnd centrul n punctul

de coordonate (x0,y0) i diametrul orizontal dat de diam_x respectiv cel vertical dat de diam_y;

imagerectangle(res_imag,x0,y0,x1,y1,res_culoare)

deseneaz

un

dreptunghi avnd colurile diagonal opuse n punctele de coordonate (x0,y0) respectiv (x1,y1), cu
culoarea dat de resursa res_culoare;

82

imagefilledrectangle(res_imag,x0,y0,x1,y1,res_culoare) deseneaz

un

dreptunghi plin, cu colurile diagonal opuse n punctele de coordonate (x0,y0) respectiv (x1,y1),
de culoarea dat de resursa res_culoare;

imagefilledellipse(res_imag,x0,y0,diam_x,diam_y,res_culoare)
- la fel ca imageellipse, doar c elipsa desenat este plin , avnd culoarea dat de

res_culoare;

imagechar(res_imag,font,x0,y0,caracter,res_culoare) afieaz n imagine

caracterul caracter, ncepnd de la coordonatele (x0,y0) n dreapta i n jos, avnd culoarea dat
de res_culoare. font poate fi unul dintre font-urile predefinite 1, 2, 3, 4, 5, sau orice resurs de
tip font nc rcat prin imageloadfont();

imagestring(res_imag,font,x0,y0,caracter,res_culoare) afieaz

imagine string-ul string, ncepnd de la coordonatele (x0,y0) n dreapta i n jos, avnd culoarea
dat de res_culoare. font poate fi unul dintre font-urile predefinite 1, 2, 3, 4, 5, sau orice
resurs de tip font nc rcat prin imageloadfont();
Exemplu: apl081.php
<?php
header("Content-type: image/png");
$imagine=imagecreatetruecolor(250,150);
$red=imagecolorallocate($imagine,255,0,0);
$green=imagecolorallocate($imagine,0,196,0);
$blue=imagecolorallocate($imagine,0,0,255);
$magenta=imagecolorallocate($imagine,255,0,255);
$orange=imagecolorallocate($imagine,255,128,0);
$yellow=imagecolorallocate($imagine,255,255,196);
imagefilledrectangle($imagine,0,0,249,149,$yellow);
//afisam 5 stringuri, pentru a testa cum arata fiecare dintre cele
//5 font-uri predefinite ale PHP-ului:
imagestring($imagine,1,10,10,'Text scris cu font-ul 1',$red);
imagestring($imagine,2,10,40,'Text scris cu font-ul 2',$green);
imagestring($imagine,3,10,70,'Text scris cu font-ul 3',$blue);
imagestring($imagine,4,10,100,'Text scris cu font-ul 4',$magenta);
imagestring($imagine,5,10,130,'Text scris cu font-ul 5',$orange);
imagepng($imagine);imagedestroy($imagine);
?>

Rezultatul afiat n browser arata n felul urm tor:

imagefill(res_imag,x0,y0,res_culoare) umple prin algoritmul flood


fill, pornind din punctul dat (x0,y0), schimbnd culoarea acestuia i a tuturor punctelor

conectate (din aproape n aproape) care au aceeai culoare cu cea existent iniial la (x0,y0), n
noua culoare dat de res_culoare;
83

imagefilltoborder(res_imag,x0,y0,culoare_border, res_culoare)
umple prin algoritmul flood fill, pornind din punctul dat (x0,y0),
schimbnd culoarea tuturor punctelor conectate (indiferent ce culoare au) n noua culoare dat de
res_culoare, pn la ntlnirea culorii specificate prin parametrul culoare_border;

imagecopy(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc,width,height)
copiaz din imag_sursa, poriunea rectangular care are colul stnga sus la

coordonatele (xsrc,ysrc) i lungimea, respectiv n limea, date de (width,height)n


imag_dest, ncepnd de la coordonatele (xdest,ydest) n dreapta respectiv n jos;

imagecopyresized(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc,
widthdest,heightdest,widthsrc,heightsrc)

copiaz

din imag_sursa, poriunea rectangular

care are colul stnga-sus la

coordonatele (xsrc,ysrc) i lungimea, respectiv n limea, date de (widthsrc,heightsrc) n


imag_dest, ncepnd de la coordonatele (xdest,ydest), redimensionnd astfel nct noua l ime

respectiv n lime s fie (widthdest,heightdest);

imagerotate(res_imag,unghi,culoare_fundal)

rotete

imaginea

din

res_imag cu unghiul unghi (specificat n grade !). Centrul rotaiei este centrul imaginii, iar

imaginea rotit este redimensionat la scar , astfel nct ntreaga imagine rotit s ncap : marginile
nu sunt decupate. Poriunile r mase neacoperite n urma rotaiei, se vor colora cu
culoare_fundal;

imagesx(res_imag) ntoarce l imea imaginii (width);

imagesy(res_imag) ntoarce n limea imaginii (height);


imagecreatefromgif(nume_fiier) creeaz

i ntoarce o resurs

de tip

imagine, n care este nc rcat imaginea de tip GIF din fiierul specificat de nume-fiier;
imagecreatefrompng(nume_fiier)respectiv
imagecreatefromjpeg(nume_fiier) funcioneaz analog, pentru imagini de tip

PNG respectiv JPG;

imagegif(res_imagine), imagepng(res_imagine), imagejpeg(res_imagine)


produc afiarea n browser (deci trimiterea fluxului de date c tre acesta) a imaginii
specificat de res_imagine. n funcie de tipul imaginii (GIF, PNG sau JPG) folosim varianta
convenabil a acestei funcii;

imagedestroy(res_imag) produce dezalocarea ntregii memorii asociate imaginii

reprezentat de res_imag;

84

getimagesize(nume_fiier) ntoarce un array (ir) ce conine informaii despre


imaginea din fiierul nume_fiier. Informaiile se g sesc structurate astfel:
- la indicele 0 se g sete l imea (width);
- la indicele 1 se g sete n limea (height);
- la indicele 2 se g sete o constant care ne indic tipul imaginii (posibile valori
pentru acest element sunt: IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, etc.);
- la indicele 3 se g sete un string de forma height="yyy" width="xxx", pentru
a putea fi folosit direct ntr-un tag <IMG....>
- la indicele mime se g sete un string ce conine tipul MIME corespunz tor
imaginii;

3.11. Upload de fiiere via PHP.

Prin aciunea de upload, utilizatorul poate nc rca, prin intermediul unei pagini web, un
ntreg fiier (indiferent c este un fiier binar sau un fiier text) pe server-ul pe care este stocat i
pagina respectiv .
La nceputurile dezvolt rii internetului, s-a pus desigur aceast problem , a transferului de
fiiere. Rezolvarea a fost g sit atunci prin implementarea unui protocol de transferare de fiiere
ntre dou calculatoare care sunt legate ntre ele. Este vorba de FTP (File Transfer Protocol), care
dei este o metod eficient de transfer, este greoi de folosit de un utilizator nespecializat (necesit
specificarea adresei calculatorului la care ne conect m, un nume de utilizator i o parol , precum i
un program specializat).
Avantajul adus de upload-ul prin intermediul unei pagini web const n faptul c este uor
de folosit de c tre orice utilizator al internetului, cel care face operaia avnd nevoie doar de cteva
cunotine minimale de utilizare a calculatorului.
Cea mai frecvent aciune de upload din parte unui utilizator obinuit este ntlnit la
ataarea unui fiier la un e-mail.
Care este principiul de funcionare ?
n primul rnd, trebuie conceput un form special, n care se vor insera unul sau mai multe
elemente de tip <input type=file...>. Acestea se prezint sub forma unor textbox-uri n
dreapta c rora este prezent un buton Browse, ca n figura de mai sus. Un click fie n interiorul
textbox-ului, fie pe butonul Browse va permite alegerea unui fiier de pe disc pentru a fi nc rcat.
n etapa urm toare, dup ce utilizatorul apas , tot n acel form, butonul de postare date,
fiierul ales pentru upload va fi trimis c tre server, tot prin intermediul unui script (cel specificat n
85

cadrul atributului action=... al formularului) i copiat ntr-o locaie temporar . Treaba


programatorului PHP este ca el s copieze fiierul la locaia sa definitiv .
Atenie ! Pentru ca upload-ul s funcioneze, att directorul temporar n care este nc rcat
fiierul, ct i directorul n care vom muta acest fiier trebuie s aib drepturi de scriere pentru orice
utilizator de pe Internet.
n mod implicit, directorul temporar al instal rii XAMPP-ului are aceste drepturi stabilite de
la instalarea ntregului pachet. Dac ele nu sunt corect setate, va trebui s le configurai manual. n
tot cazul, pentru directorul n care vei muta fiierul, va trebui obligatoriu s le configurai.
Voi exemplifica modul n care se face acest lucru pentru directorul tmp al instal rii
XAMPP. Pentru directorul destinaie, vei proceda analog.
Astfel, deschidei un Windows Explorer. V asigurai c opiunea Use simple file
sharing (Recommended) NU este bifat (pentru a ajunge la aceast opiune deschidei din

meniul Tools submeniul Folder Options i apoi accesai tab-ul View. n cadrul acestuia sunt
mai multe opiuni printre care i cea de mai sus), dup care mergei pe directorul temporar al
instal rii xampp (n mod implicit C:\xampp\tmp), NU intrai n director, ci dai click dreapta pe el,
alegnd opiunea Properties, apoi tab-ul Security. n acest tab, alegei Add, scriei numele
network, i apoi alegei din lista ce vi se deschide utilizatorul network. Dup

ce l-ai ales,

asigurai-v c are drepturi de scriere n directorul tmp (bifai, n c suele de sub el, i opiunile
Modify respectiv Write).

n cadrul script-ului PHP care se ocup de preluarea fiierului nc rcat, ne vom folosi de un
masiv predefinit al limbajului, i anume $_FILES, care ne va furniza date despre fiierul nc rcat, i
anume (primul parametru al lui $_FILES este dat de numele input-ului de type=file):

$_FILES[nume_input][name] ne ntoarce numele i extensia fiierului pe care l-

am upload-at;

$_FILES[nume_input][tmp_name] ne ntoarce numele complet (cu tot cu calea)

fiierului temporar care s-a creat n urma upload-ului. Atenie ! acest nume poate s fie complet
diferit fa de cel original.

$_FILES[nume_input][type] ne ntoarce tipul mime al fiierului (un string, de

exemplu: application/octet-stream sau image/gif. Valoarea sa nu poate fi garantat ca fiind corect ;

$_FILES[nume_input][size] ne ntoarce dimensiunea (n octei) a fiierului

upload-at

$_FILES[nume_input][error] ne ntoarce codul de eroare al operaiei de upload

asupra fiierului dat de nume_input. Dac operaia s-a ncheiat cu succes, are valoarea 0.

86

Exemplu: Urm toarele dou script-uri realizeaz o aplicaie prin care putem upload-a un fiier n
acelai director n care se afl i sursele aplicaiei.
Primul fiier reprezint un HTML obinuit, ce conine doar form-ul prin care se poate face uploadul fiierului, iar al doilea fiier reprezint script-ul PHP care preia fiierul upload-at i l mut n
directorul curent:
apl082.html
<form enctype="multipart/form-data" action="apl083.php" method="post">
<!- este obligatoriu sa specificati atributul enctype="multipart/form-data", in caz
contrar nu va fi permisa upload-area de fisiere. De asemenea, remarcati atributul action,
care specifica numele scriptului care se va ocupa de preluarea fisierului upload-at -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
<!- acest control de tip hidden permite stabilirea unei limite maxime a dimensiunii
fisierului care urmeaza a fi uploadat. Din pacate, acest parametru poate fi usor pacalit
din browser -->
Alege un fisier pentru upload (sa aiba sub 30000 bytes):<br>
<!- cu ajutorul acestui input type=file putem defini cimpul de tip upload din form -->
<input type="file" name="fisier_incarcat"><br><br>
<!-- de valoarea atributului sau name, in cazul nostru fisier_incarcat ne vom folosi
pentru a-l manipula din cadrul codului PHP in care il vom prelua, in cazul nostru
apl083.php-->
<input type="submit" value="Incarca fisierul">
</form>

apl083.php
<?php
if($_FILES['fisier_incarcat']['error']!=0)
echo 'Upload nereusit, a aparut o eroare';
else
{
move_uploaded_file($_FILES['fisier_incarcat']['tmp_name'],
$_FILES['fisier_incarcat']['name']);
//cu ajutorul functiei move_uploaded_file mutam fisierul de la locatia sa temporara la
//locatia sa definitiva, care n cazul nostru este directorul curent. Parametrii acestei
//funcii sunt sursa respectiv destinatia
echo 'Fisierul a fost incarcat<br>';
echo 'Dimensiunea sa este de ',$_FILES['fisier_incarcat']['size'],' octeti';
}
?>

3.12. Variabile cookie.


Utilizarea lor a pornit din necesitatea p str rii anumitor set ri (opiuni) ale utilizatorului
atunci cnd acesta intr pe un anumit site, pentru a nu mai fi nevoit sa le specifice la fiecare intrare.
Mecanismul care st la baza acestei probleme se bazeaz pe memorarea, pe calculatorul
vizitatorului unui anumit site, a unor informaii sub forma unor mici fiiere text. Operaia poate fi
comandat de pe server i tot de pe server se poate comanda citirea, actualizarea sau tergerea
acestor mici fiier, numite uzual, prin abuz de limbaj, variabile cookie.
n PHP se poate lucra foarte uor cu variabilele cookie.
Pentru a crea o variabil cookie se utilizeaz funcia:

setcookie(nume_variabil, valoare, dat_expirare);

Exemplu: n instruciunea de mai jos este creat o variabil cookie numit

limba_pref.

Variabila reine valoarea romana i expir ntr-o or :


87

setcookie(limba_pref,romana,time()+3600);

Observa ii !
1) Nu pot exista mai mult de 20 de variabile cookie. Dac se creeaz vreuna n plus, prima creat
este tears automat;
2) Pentru a terge o variabil cookie se creeaz o alta cu acelai nume, dar cu data de expirare
naintea celei curente (de exemplu, time()-1).

Pentru a citi (recupera) valoarea unei variabile cookie, se utilizeaz coninutul unui

masiv asociativ special, predefinit, al limbajului PHP, numit $HTTP_COOKIE_VARS[..]. Fiecare


component a sa are ca indice numele unei variabile cookie, iar ca valoare, reine valoarea
variabilei respective.
Exemplu: instruciunea de mai sus afieaz valoarea variabilei cookie creat prin exemplul
anterior:
echo $HTTP_COOKIE_VARS[limba_pref];//afieaz romana

Exemplu: Script-ul care urmeaz exemplific modul n care se pot reine anumite informaii
pe care utilizatorul le-a tastat o dat . Apelat pentru prima dat , atunci cnd nu exist variabila
cookie numit loc, se cere tastarea localit ii n care se afl cel care viziteaz pagina. Dac acel

vizitator reintr pe acel site, reapelnd script-ul, acesta va identifica variabila cookie loc, va
prelua direct localitatea memorat i, n loc ca utilizatorului s i se cear din nou introducerea
acesteia, i se va afia direct un mesaj:
apl084.php
<?php
$loc=@$_POST['loc'];//testam mai intii daca am primit dintr-un form
//postat tot din cadrul acestei pagini, o variabila numita loc,
//cu valoarea careia trebuie sa cream variabila cookie
if($loc!=NULL)//daca am primit
setcookie("loc",$loc,time()+24*3600);//atunci setam variabila
//cookie cu valoare primita, pentru o durata de 24 de ore
else//pe cind, daca nu am primit, verificam daca variabila cookie este deja creata
$loc=@$HTTP_COOKIE_VARS['loc'];
if($loc!=NULL)//deci daca este creata
{//dam utilizatorului un mesaj:
echo "Localitatea curenta este: ",$loc;
//si ii permitem sa schimbe aceasta localitate, daca doreste
echo '<form action="apl084.php" method="post">';
echo '<p align="right">';
echo 'Schimba localitatea:';
echo '<input type="text" name="loc"><br>';
echo '<input type="submit" value="Schimba localitatea"></p></form>';
}
else//in caz contrar, cream formularul care permite introducerea localitatii
{
echo '<form action="apl084.php" method="post">';
echo 'Introdu localitatea<br><br>';
echo '<input type="text" name="loc"><br><br>';
echo '<input type="submit" value="Salveaza"></form>';
}
?>

88

3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP.


3.13.1. Introducere n MySQL.
n ultimii ani, utilizarea bazelor de date pe Internet a luat o amploare deosebit . Exist o
mulime de aplicaii, extrem de utile, care le utilizeaz , cum ar fi: aplicaii de contorizare, comer
electronic, vot electronic, aplicaii de comunicare.
De unde SQL ? n domeniul cre rii i utiliz rii bazelor de date relaionale s-a impus
necesitatea existenei unui limbaj standard care s permit efectuarea acestor operaii. Astfel, a
ap rut SQL Structured Query Language. Limbajul a fost supervizat de comisia de standardizare
ANSI (American National Standards Institute), motiv pentru care se mai numete i ANSI SQL.
SQL nu este un limbaj de firm , ci el este implementat de o mulime de SGBD-uri
consacrate, cum ar fi Microsoft Access, Oracle, Microsoft SQL Server i, bineneles, MySQL.
MySQL este un limbaj specializat pentru gestiunea bazelor de date relaionale pe Internet,
avnd la baz limbajul SQL. MySQL gestioneaz baze de date care se g sesc pe un server. Baza de
date poate fi foarte lesne exploatat prin intermediul limbajului PHP, dar i cu alte limbaje (de
exemplu Java).

3.13.2. Testarea instalrii MySQL. Configurarea bazei de date.

Dup cum am anunat n capitolul 3.2., suportul MySQL a fost deja instalat, n cadrul
pachetului XAMPP, deodat cu limbajul PHP.
Tot suportul software al bazei de date MySQL se g sete n directorul C:\XAMPP\MYSQL.
n subdirectorul BIN al acestuia se g sesc o serie de programe utilizare, care permit configurarea i
operarea imediat cu serverul de baze de date. Utilitarul pe care o s -l utiliz m cel mai des este
mysql.exe. Pentru a-l putea accesa din orice alt

locaie a calculatorului v-ai afla, este

recomandat s ad ugai calea spre el (C:\XAMPP\MYSQL\BIN) n variabila PATH a sistemului.


Acest lucru se face executnd un click dreapta pe My Computer, alegnd apoi tab-ul Advanced,
apoi butonul Environment Variabies. Din fereastra care se deschide, derulai n partea de jos
(seciunea System Variables) pn ntlnii variabila PATH. Dai dublu click pe ea (sau ap sai
butonul Edit de dedesubt) i, la sfritul irului de caractere deja existent acolo, ad ugai
caracterul ; urmat de calea C:\XAMPP\MYSQL\BIN.
Din acest moment, utilitarul mysql se poate rula din orice locaie (de exemplu direct din
Start + Run).

89

Vom configura n continuare serverul de baze de date. MySQL fiind un server de baze de
date partajat, accesul se face pe baza unui nume de utilizator (user) i a unei parole (password).
Pentru moment, este configurat doar utilizatorul root (cu drepturi depline asupra bazei de
date) i NU are parola.
Pentru a va conecta, lansai dintr-un Command Prompt sau din Start + Run urm toarea
comand : mysql u root p
Atunci cnd suntei invitai s introducei parola (prin Enter password:) trebuie s dai
Enter. n cazul n care conectarea a reuit, vei primi un mesaj de ntmpinare, iar prompt-ul se va
schimba n :

mysql>... (pentru a v deconecta de la server, n dreptul acestui prompt trebuie s

scriei comanda quit dup care dai Enter).


Din acest suntei conectai la baza de date. n continuare vom da cteva comenzi pentru a
configura serverul, baza de date asupra c reia vom lucra, i un utilizator pe care l vom folosi pentru
a lucra n mod curent (deoarece este complet nerecomandat s folosim utilizatorul root pentru a
lucra n mod curent la baza de date).
n primul rnd, vom terge toi utilizatorii predefinii, n afar de root, iar apoi vom crea o
baz de date n care vom lucra i un utilizator cu drepturi de utilizare asupra acestei baze de date.
Atenie s nu uitai caracterul ; dup fiecare comand executat . De asemenea, dup fiecare
comand dai un Enter:
mysql>use mysql; prin aceast comand intr m n baza de date administrativ , cu numele mysql
mysql>delete from user where user!=root or host!=localhost;
prin aceast comand tergem toi utilizatorii predefinii, l snd utilizatorul root cu drepturi de conectare de pe
maina local

mysql>update user set password=password('parolanou') where user='root';


prin aceast comand schimb m parola utilizatorului root, de la parola vid (pe care o avea de la instalare) cu
noua parol (evident, irul de caractere parolanou l nlocuii cu noua parol )

mysql>create database lucru;


prin aceast comand cre m o baz de date cu numele lucru, n care vom lucra n continuare

mysql>grant all on lucru.* to 'utilizator'@'localhost' identified by 'parola';


prin aceast comand cre m utilizatorul cu numele utilizator, cu parola parola (evident, le vei schimba
dup bunul plac) ce se poate conecta de pe maina local , i are drepturi de lucru doar n baza de date lucru

mysql>flush privileges;
prin aceast comand facem ca toate modific rile efectuate pn n momentul de fa s devin efective i
operative.

mysql>quit;
i ieim din monitorul mysql

Putem testa imediat instalarea, prin conectarea la serverul mysql cu noul utilizator creat
(lansai aceast comand fie din Command Prompt fie din Start+Run) :
90

mysql u utilizator p

n momentul n care vi se cere parola, introducei, evident, parola definit mai sus.
Dup conectarea la MySQL, pentru a stabili ca punct de lucru baza de date asociat acestui
utilizator, vei da comanda:
mysql>use lucru;

dup care vei putea testa toate comenzile ce urmeaz s fie testate n paragrafele urm toare.
3.13.3. Crearea unei baze de date.
Aceast operaie nu poate fi f cut de c tre orice utilizator, ci doar de c tre root sau de
anumii utilizatori cu drepturi speciale.

Comanda pentru crearea unei baze de date este:


create database nume_baz_date;

n urma execut rii sale este creat baza de date cu numele indicat. Din moment ce fiecare
baz de date este stocat pe disc, ntr-un anumit director, n fapt se va crea un subdirector cu acelai
nume cu baza de date, n subdirectorul data al folder-ului instal rii MySQL (n cazul XAMPP,
acest folder este C:\XAMPP\MYSQL\DATA. Dac exist deja o baz de date cu numele specificat, se
va refuza crearea uneia noi.
Dac se dorete lucrul cu o anumit baz de date, se va da comanda urm toare:
use nume_baz_date;

Pentru tergerea unei baze de date se utilizeaz comanda:


drop database nume_baz_date;

Dac dorim o list a bazelor de date existente (sau, n fine, n funcie de utilizator, a
bazelor de date la care avem acces) se utilizeaz comanda:
show databases;

3.13.4. Tabele.
ntr-o tabel coloanele sunt identificabile prin nume, iar rndurile, prin valorile pe care le
memoreaz . Toate datele dintr-o coloan au acelai tip. O tabel are un num r specificat de coloane,
ns are un num r nespecificat de rnduri. Uneori, cnd ne referim la un rnd, folosim i termenul
de nregistrare, iar atunci cnd ne referim la data din rnd, situat ntr-o anumit coloan , folosim i
termenul de cmp.

Instruciunea prin care se poate crea o tabel este prezentat mai jos; ceea ce este trecut

ntre paranteze drepte reprezint clauze, atribute sau buc i de instruciune care, din punct de vedere
sintactic (n funcie de fiecare caz) pot s nu apar :
91

create table nume_tabel


( nume_coloan1 tip_date [specificatori],
nume_coloan2 tip_date [specificatori],
...
nume_coloann tip_date [specificatori]
);

Specificatorii se refer la cheia primar , valori distincte, valori implicite, autoincrementare,


dac printre valorile memorate n tabel se poate g si sau nu valoarea NULL. Toate acestea le vom
trata separat, n alt paragraf.
Exemplu: pentru a crea o tabel cu 3 coloane, n care vom reine indicativul fiec rui jude

(ca pe pl cuele de la maini), numele judeului (un ir de cel mult 30 de caractere) i num rul s u
de locuitori (un num r ntreg de cel mult 7 cifre) folosim urm toarea comand :
create table judete (ind char(2),nume char(30),nrloc int(7));

Ad ugarea unui nou rnd ntr-o tabel se face prin instruciunea de mai jos, n care se
introduc, pe rnd, valori pentru toate cmpurile unei linii, n ordinea n care au fost declarate
coloanele la crearea tabelei:
insert into nume_tabel values(valoare1,valoare2,...,valoaren);
Exemplu: pentru a insera dou linii n tabela creat n exemplul anterior:
insert into judete values('CJ','Cluj',702755);
insert into judete values('BV','Brasov',589028);

n practica utiliz rii bazelor de date, instruciunea anterioar este considerat ca generatoare
de erori, deoarece fie se poate grei ordinea de introducere a datelor, fie pe parcursul dezvolt rii se
insereaz coloane noi ntre cele deja existente, iar efectul ar fi acela c tabela va conine date
eronate. Din acest motiv este preferat forma urm toare a instruciunii, dei este necesar s scriem
mai mult:
insert into nume_tabel(nume_coloan1,nume_coloan2,...,nume_coloank)
values(valoare1,valoare2,...,valoarek);

Se pot omite coloane (caz n care ele vor primi automat valori NULL) i bineneles c
putem scrie coloanele n orice ordine dorim.
Exemplu: mai ad ug m dou linii la tabela anterioar : una n care nu complet m num rul

de locuitori i alta n care trecem toate cele 3 valori, ns n alt ordine dect cea n care le-am creat:
insert into judete(nrloc,ind,nume) values(510110,'MM','Maramures');
insert into judete(ind,nume) values('CL','Calarasi');

Pentru a afia ntreaga tabel , utiliz m comanda:


select * from nume_tabel;

92

+------+-----------+--------+
| ind | nume
| nrloc |
+------+-----------+--------+
| CJ
| Cluj
| 702755 |
| BV
| Brasov
| 589028 |
| CL
| Calarasi |
NULL |
| MM
| Maramures | 510110 |
+------+-----------+--------+
4 rows in set (0.02 sec)

Exemplu: pe tabela creat anterior, dac execut m:


select * from judete;

se va afia n urm torul format:

Dac dorim s afi m doar anumite coloane ale tabelei, n ordinea pe care o dorim,
folosim forma de mai jos a instruciunii:
select nume_coloana1,...,nume_coloanak from tabel;

Se observ faptul c , atunci cnd afi m tabela, n antetul (capul de tabel) s u se trece
numele coloanelor acesteia. Dac dorim ca n antet s figureze alt nume pentru o coloan , atunci, n
instruciunea de mai sus, n loc de a scrie doar numele coloanei, vom scrie numele coloanei urmat
de cuvntul cheie AS i de numele care dorim s fie afiat n antet. Astfel, prin cuvntul cheie AS,
am definit alias-uri pentru numele coloanelor.
Exemplu: pentru tabela din exemplele anterioare, am putea scrie urm toarea comand :
select ind as indicativ,
nume as "nume judet",
nrloc as "numar de locuitori"
from judete;

Rezultatul const n afiarea sub urm torul format:

+-----------+------------+--------------------+
| indicativ | nume judet | numar de locuitori |
+-----------+------------+--------------------+
| BV
| Brasov
|
589028 |
| CJ
| Cluj
|
702755 |
| CL
| Calarasi
|
NULL |
| MM
| Maramures |
510110 |
+-----------+------------+--------------------+
4 rows in set (0.00 sec)

Pentru listarea numelor tuturor tabelelor din baza de date, folosim comanda urm toare:
show tables [from nume_baz_date];

Dac nu specific m clauza [from nume_baz_date] se vor afia toate tabelele din baza
de date curent (cea c tre care am dat use);

Pentru a afia o descriere detaliat a unei tabele (numele coloanelor, tipurile lor) se

folosete una dintre comenzile (ele fac acelai lucru):


describe nume_tabel;
show columns from nume_tabel;

3.13.5. Tipuri de date n MySQL.

Tipurile principale de date ale MySQL sunt:


a) iruri de caractere;
b) numerice;
c) dat , or
n continuare, vom prezenta fiecare tip de dat n parte:
93

a) iruri de caractere:

char[(n)] reine un ir de caractere de lungime n (fix ). n caz c n nu este precizat,

reine un singur caracter. Ocup n octei;

varchar[(n)] reine un ir de cel mult 255 de caractere. Ocup n+1 octei;


tinytext[(n)] este echivalent cu varchar[(n)];

text[(n)] reine un ir de cel mult 65535 caractere. Ocup n+2 octei;

mediumtext[(n)] reine un ir de cel mult 16.777.215 caractere. Ocup n+3 octei;

longtext[(n)] reine un ir de cel mult 4.294.967.295 caractere. Ocup n+4 octei;

enum un cmp care poate reine un singur ir de caractere dintr-un vector de iruri de
caractere predefinit de c tre utilizator la crearea tabelei. De altfel, tabela va memora vectorul de
iruri de caractere, iar n acest cmp se va reine doar indicele elementului corespunz tor din vector.
Vezi exemplele de dup ;

set la fel ca la enum, doar c un cmp de acest tip poate reine unul sau mai multe iruri

de caractere din vectorul predefinit de c tre utilizator. Vezi exemplele de dup .


Exemplu (pentru tipul enum): cre m o tabel n care trecem civa pictori i curentele artistice pe

care le reprezint .
create table pictori(nume text,
curent enum('impresionism','postimpresionism','suprarealism','art nouveau'));
insert into pictori values('Gustave Klimt','art nouveau');
insert into pictori values('Vincent Van Gogh','postimpresionism');
insert into pictori values('Alphonse Mucha','art nouveau');
insert into pictori values('Auguste Renoir','impresionism');
insert into pictori values('Rene Magritte','suprarealism');
insert into pictori values('Tiziano Vecellio','renastere');

A se remarca faptul c dup executarea ultimei comenzi apare o avertizare (warning). Acest
lucru se ntmpl deoarece ultimul curent introdus,
renastere nu apare printre stringurile din enum,
permise pentru acest cmp. Totui, n urma
execuiei sale, pictorul cu numele Tiziano
Vecellio va fi trecut n tabel , ns n dreptul
curentului s u va fi trecut irul vid:

+------------------+------------------+
| nume
| curent
|
+------------------+------------------+
| Gustave Klimt
| art nouveau
|
| Vincent Van Gogh | postimpresionism |
| Alphonse Mucha
| art nouveau
|
| Auguste Renoir
| impresionism
|
| Rene Magritte
| suprarealism
|
| Tiziano Vecellio |
|
+------------------+------------------+

Exemplu (pentru tipul set): cre m o tabel n care trecem numele ctorva persoane i hobby-urile

lor favorite, dintre muzic , sport i desen. Vom ncerca i de aceast dat s punem valori invalide.
Efectul este asem n tor celui de la enum: datele respective vor fi ignorate:
create table persoane (nume text,
hobby set('muzica','desen','sport'));
insert into persoane values('Ion MARIN','muzica,desen');
insert into persoane values('Ion TIRIAC','sport,desen');
insert into persoane values('Nina CHIRIAC','muzica');
insert into persoane values('Ion BETEA','sport,fumat');

+--------------+--------------+
| nume
| hobby
|
+--------------+--------------+
| Ion MARIN
| muzica,desen |
| Ion TIRIAC
| desen,sport |
| Nina CHIRIAC | muzica
|
| Ion BETEA
| sport
|
+--------------+--------------+
94

b) Tipuri de date numerice:

tinyint[(n)] ocup 1 octet. Reine nr. ntregi cuprinse ntre -128..127. Dac este

urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..255;

smallint[(n)] ocup 2 octei. Reine nr. ntregi cuprinse ntre -32768..32767. Dac

este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..65535;

mediumint[(n)] ocup 3 octei. Reine nr. ntregi cuprinse ntre -8388608..8388607.

Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..16777215;

int[(n)] ocup 4 octei. Reine nr. ntregi cuprinse ntre -2147843648..2147843647.

Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..4294967295;

bigint[(n)] ocup 8 octei. Reine nr. ntregi cuprinse ntre -9223372036854775808

i 9223372036854775809. Dac este urmat de cuvntul unsigned reine numere naturale cuprinse
ntre 0..18446744073709551615;

float ocup 4 octei este echivalentul tipului cu acelai nume din C/C++;

double ocup 8 octei este echivalentul tipului cu acelai nume din C/C++;

decimal(n,d) num rul este stocat sub form de ir de caractere. Parametrul n


reprezint num rul de cifre nenule aflate naintea virgulei (cu tot cu semnul pentru numerele
negative, dac este cazul) iar d reprezint num rul de zecimale.
c) Tipuri pentru dat i or:

year un cmp de acest tip reine un an calendaristic. Acetia se introduc ca i ir de

caractere;

time un cmp de acest tip reine o anumit or dintr-o zi. Se introduce sub forma unui

ir de caractere, de forma hh:mm:ss;

date un cmp de acest tip reine o anumit dat calendaristic . Se introduce sub forma

unui ir de caractere, de forma yyyy-mm-dd;

datetime un cmp de acest tip reine o anumit dat calendaristic i o anumit or . Se

introduce sub forma unui ir de caractere, de forma yyyy-mm-dd hh:mm:ss;


3.13.6. Operatori utilizai n MySQL. Variabile.
Voi prezenta mai nti principalii operatori din MySQL, n ordinea cresc toare a priorit ii
lor. Utilitatea operatorilor i funcionalitatea acestora va fi prezentat n paragrafele urm toare:
1. ||, or, xor
2. &&, and
3. between, case when, then, else

95

4. =, >=, >, <=, <, !=, <>, is, like, in


5. |
6. &
7. <<, >>
8. +, (operatori binari)
9. *, /, div, %, mod
10. ^
11. +, (operatori unari)
12. !, not
+-----+
| 5+7 |
+-----+
| 12 |
+-----+

Pentru a testa un anumit operator, putei utiliza instruciunea select.


De exemplu, dac dai comanda select 5+7; se va afia un rezultat ca n
imaginea al turat :
Observaie

important: n MySQL exist

o valoare special

numit

Null.

Semnificaia ei este de valoare necunoscut . Reinei faptul c , dac Null este un operand al
oric rei expresii, rezultatul oric rei operaii care se efectueaz cu Null este Null.
Operatorii se mpart, la rndul lor, n mai multe grupe. Acestea sunt prezentate n
continuare:
a) Operatori aritmetici:
Acioneaz asupra tipurilor numerice i furnizeaz o valoare de tip numeric:
+ adunare (Ex: 2+3 are ca rezultat valoarea 5);

- sc dere (Ex: 2-3 are ca rezultat valoarea -1);

* nmulire (Ex: 2*3 are ca rezultat valoarea 6);

/ mp rire cu zecimale (Ex: 5/4 are ca rezultat valoarea 1.25);

div mp rire cu zecimale (Ex: 15 div 4 are ca rezultat valoarea 3);

mod i % mp rire cu zecimale (Ex: 14 mod 4 sau 14%4 are ca rezultat valoarea 3);
- i + operatorii unari plus i minus (Ex: --4 are ca rezultat valoarea 4);
b) Operatori de comparare (sau relaionali):
Permite compararea a dou valori numerice sau a dou iruri de caractere. irurile de

caractere se compar lexicografic i nu se face distincie ntre literele mari i literele mici.
Rezultatul este 1 pentru adev rat i 0 pentru fals.

< mai mic (Ex: 2<3 are ca rezultat valoarea 1);

<= mai mic sau egal (Ex: 3<=3 are ca rezultat valoarea 1);

> mai mare (Ex: 2>3 are ca rezultat valoarea 0);

96

>= mai mare sau egal (Ex: 2>=3 are ca rezultat valoarea 0);

= egalitate (Ex: 2=3 are ca rezultat valoarea 0);

<> sau != diferit (Ex: 2<>3 sau 2!=3 are ca rezultat valoarea 1);

Observaie: se pot compara, de altfel, cu aceti operatori, i date de tipul time, date. n fapt, o

astfel de comparare este tot una lexicografic .


c) Operatori logici:
Analog limbajului C/C++, n MySQL se consider dou valori logice: 0 joac rolul lui
false, iar orice valoare diferit de 0 joac rolul lui true.

|| sau or sau-ul logic (este 0 doar cnd ambii operanzi sunt 0, n rest este 1);

&& sau and i-ul logic (este 1 doar cnd ambii operanzi sunt nenuli, n rest este 0);
not negaie (negaia lui 0 este 1, iar negaia lui 1 este 0);

xor sau-ul exclusiv (este 0 cnd ambii operanzi sunt fie nuli, fie nenuli, i este 1 n rest);

d) Operatori logici pe bii:


Se aplic

tuturor tipurilor ntregi i acioneaz

asupra tuturor biilor aflai pe poziii

corespondente.

| sau-ul pe bii;
& i-ul pe bii;

^ sau-ul exclusiv pe bii;

~ negaia pe bii;

e) Operatori de deplasare pe bii:


Se aplic tuturor tipurilor ntregi, deplasnd biii reprezent rii binare:

<< deplasare la stnga: a<<b deplaseaz cu b poziii la stnga biii lui a;

>> deplasare la dreapta: a>>b deplaseaz cu b poziii la dreapta biii lui a;


f) Operatori specifici pentru MySQL:

is null, is not null testeaz dac o valoare este sau nu null (sunt singurii
operatori care testeaz acest lucru! Atenie, compararea cu null ntoarce, conform unei observaii
anterioare, TOT TIMPUL valoarea null, indiferent c se compar null-ul tot cu null sau cu alt
valoare);

in, not in testeaz dac o valoare aparine sau nu unei mulimi


(ex:

1 in (1,2,3,4) are valaorea 1;


5 in (1,2,3,4) are valoarea 0;
cici in (cici, mimi, lola) are valoarea 1);

97

like, not like testeaz dac un ir de caractere are o anumit form : dac este
prefixat respectiv postfixat sau nu de un anumit subir, dac acesta conine un anumit subir. Forma
sub care se utilizeaz este string like ablon respectiv string not like sablon. ablon
este tot un string, n care se folosesc urm toarele caractere speciale: % pentru un num r neprecizat
de caractere necunoscute, respectiv _ pentru un singur caracter neprecizat.
(ex:

cici like ci% are valoarea 1;


lola like la% are valoarea 0;
mimi not like me_i are valoarea 1);

between min and max testeaz dac o valoare se g sete n intervalul nchis cu
capetele min, respectiv max. (Ex: 1 between 0 and 4 are valoarea 1);

case .. when .. then .. else .. are dou forme sub care se poate aplica:
- forma 1: case v
when v1 then val1
. . .
when vn then valn

Se evalueaz v, i dac se produce


vreuna dintre valorile v1 .. vn se va
ntoarce valk corespunz toare, iar
dac nu se va ntoarce valn+1

else valn+1
end

- forma 2: case
when cond1 then val1
. . .
when condn then valn
else valn+1

Se evalueaz condiiile n ordinea


scrierii. Prima care este adev rat va
ntoarce valoarea valk
corespunz toare. Dac nici una nu
este adv rat , se va ntoarce valn+1

end

Exemple:
1)

2)

case cif
when
when
when
else
end

1 then unu
2 then doi
3 then trei
nu stiu sa numar decit pina la 3

case
when a<0 then valoare negativ
when a=0 then valoare nul
else valoare strict pozitiv
end

98

g) Variabile n MySQL:
n MySQL variabilele se specific prin @identificator, unde identificator respect
aceleai reguli sintactice ca i n alte limbaje de programare (s fie format doar din litere, cifre i '_'
i s nu nceap cu o cifr ). Atribuirea unei valori c tre o variabil se face cu operatorul ':=' i, la
fel ca n C++, atribuirea poate juca i rolul unei expresii, care ntoarce valoarea atribuit .
Exemplu:
select @c:=(@a:=4)+(@b:=5); atribuie att valoarea 4 variabilei @a, valoarea 5
select @a;
select @b;
select @c;

variabilei @b ct i valoarea 9 variabilei @c


pentru verificare, afi m apoi valorile
celor trei variabile

3.13.7. Funcii predefinite n MySQL.


a) Cteva funcii matematice:

abs(x) modulul lui x;

ceil(x) cel mai mic ntreg mai mare sau egal cu x;

floor(x) cel mai mare ntreg mai mic sau egal cu x (partea ntreag matematic );

exp(x) ex;

log(b,x) logbx;
ln(x) ln x;

pi() ;

pow(x,y) xy;

round(x) cel mai apropiat ntreg de x (rotunjire la ntreg);

sin(x), cos(x) sinusul i cosinusul unghiului x. Unghiul trebuie dat n radiani;

sign(x) semnul lui x (-1 pt. nr. negativ, 0 pt. 0, 1 pt. num r pozitiv);

sqrt(x) radicalul (r d cina p trat ) lui x;

b) Cteva funcii care lucreaz asupra irurilor de caractere:


length(x) lungimea (nr. de caractere) a irului x;

concat(x1,x2,...) concateneaz

irurile de caractere pe care le primete ca

parametri. Atenie ! n MySQL NU exist un operator de concatenare (ca n PHP, spre exemplu);

instr(x,y) Caut dac y este subir al lui x. Dac este ntoarce indicele de nceput

(primul caracter avnd indicele 1) iar dac nu este, ntoarce 0;

substring(x,poz,lung) ntoarce subirul de caractere din x care ncepe pe poziia

poz i are lungimea lung. Dac lung este omis, ntoarce de la poziia poz pn la sfrit;

rtrim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile din dreapta;
99

ltrim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile din stnga;

trim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile att din dreapta ct
i din stnga;

upper(x) ntoarce irul obinut prin convertirea tuturor literelor mici la litere mari;

lower(x) ntoarce irul obinut prin convertirea tuturor literelor mari la litere mici;

find_in_set(x,string) ntoarce indicele apariiei irului x n irul de entit i


separate prin virgule din cadrul lui string. Ex: find_in_set(mimi,cici,mimi,lola) va
ntoarce valoarea 2.

format(x,d) convertete valoarea real la un string cu d zecimale. Dac este cazul, la

ultima zecimal din string se face rotunjire. Ex: format(5.678,2) va ntoarce stringul 5.68;

strcmp(x,y) compar lexicografic irurile de caractere x i y, ntorcnd -1 dac x<y, 0

dac x=y, 1 dac x>y. Nu face distincie ntre literele mari i cele mici;
c) Cteva funcii care lucreaz asupra datei i orei:

now() ntoarce data i ora curent sub forma yyyy-mm-dd hh:mm:ss;

day(d) ntoarce num rul zilei din data pe care o primete ca parametru;

month(d) ntoarce num rul lunii din data pe care o primete ca parametru;

year(d) ntoarce num rul anului din data pe care o primete ca parametru;

time(d) ntoarce timpul (sub forma hh:mm:ss) extras din data+timpul pe care o

primete ca parametru;

hour(d) ntoarce ora din parametrul s u. Acesta poate fi de tip date sau datetime;

minute(d) ca mai sus, ntoarce minutul din parametrul s u;

second(d) ca mai sus, ntoarce secunda din parametrul s u;

datediff(x,y) calculeaz diferena, n zile, dintre datele x i y;

date_add(x,interval nr tip) adun la data x un num r nr de zile, luni sau ani,

n funcie de valoarea parametrului tip. Cuvntul interval este un cuvnt rezervat, trebuind
scris ca atare. Parametrul tip poate avea una dintre valorile day, month respectiv year. Dac se
dorete o sc dere, fie folosim valori negative pentru x, fie folosim funcia pe care o prezent m
imediat n continuare.
Ex: date_add(2009-01-14,interval 18 day) va ntoarce valoarea 2009-02-01;
date_add(2009-01-14,interval -14 day) va ntoarce valoarea 2008-12-31;

date_sub(x,interval nr tip) analog, produce o sc dere;

100

d) Funcii specifice MySQL:

if(exp1,exp2,exp3) dac exp1 este nenul (adev rat ) funcia va ntoarce exp2, n

caz contrar ntorcnd exp3.


Observaie: Dac

exp1 este de tip real, va fi convertit

la ntreg (prin eliminarea

zecimalelor). De exemplu, dac este 0.87, se va converti la 0, deci s-ar putea ca rezultatul s nu fie
cel scontat.
Ex: if(a>=0,pozitiv nestrict,negativ strict) va ntoarce, dup caz,
una dintre valorile de tip ir de caractere;

ifnull(exp1,exp2) dac exp1 este nenul , o ntoarce chiar pe ea. Dac nu, o ntoarce

pe exp2.
Ex: ifnull(cici,mimi) ntoarce cici;
ifnull(null,mimi) ntoarce mimi;

3.13.8. Coloane calculate prin intermediul unei interogri.


Am prezentat ceva mai nainte comanda select. Dup cum am v zut, aceast comand
permite vizualizarea informaiei dintr-o anumit tabel a bazei de date.
Sintaxa general a comenzii este mult mai larg dect cele prezentate n paragraful 3.13.4.
Vom descoperi, pe parcurs, o serie de funcionalit i ale sale.
Pentru moment, reinei faptul c operaia de consultare a datelor unei tabele dintr-o baz de
date (mai precis, tot ceea ce realizeaz comanda select) se numete interogare.
O regul elementar n crearea i exploatarea unei baze de date impune ca aceasta s nu
conin informaie redundant , adic informaie care se poate deduce pe baza datelor deja existente.
Nerespectarea ei ar conduce la baze de date care ocup mult spaiu, i n care, din aceast cauz ,
prelucr rile devin mai lente.
Vom nv a s afi m date (coloane) care rezult prin calcule, pe baza celor deja existente.
Acest lucru se realizeaz prin utilizarea unei expresii n cadrul comenzii select. n acest fel,
interogarea va afia o nou coloan , avnd ca antet expresia respectiv i pe post de coninut
valoarea expresiei, aplicat pentru fiecare dintre liniile tabelei.
Dac numele din antet nu ne convine, am nv at deja s -l schimb m, cu ajutorul clauzei as,
care, dup am v zut, creeaz de fapt un alias pentru acea coloan .
Ex: ntr-o tabel , cu numele prod, avnd informaii despre nite produse dintr-un magazin,
avem reinute, pentru fiecare produs, denumirea, costul unitar i num rul de buc i din produsul
respectiv. Coloanele deja existente au numele den, cost_u i cant. Pentru a afia pentru
fiecare produs toate aceste date, plus costul total, vom folosi urm toarea interogare:
select den,cost_u,cant,cost_u,cost_u*cant as cost_tot from prod;
101

Iat cum vi se va afia rezultatul acestei interog ri:


+----------+--------+------+--------+----------+
| den
| cost_u | cant | cost_u | cost_tot |
+----------+--------+------+--------+----------+
| minge
|
3.25 |
4 |
3.25 |
13.00 |
| lopatica |
2.10 |
5 |
2.10 |
10.50 |
| galetusa |
4.50 |
3 |
4.50 |
13.50 |
+----------+--------+------+--------+----------+

3.13.9. Valoarea NULL.


Dup cum am v zut n sintaxa comenzii care creeaz o tabel , dup fiecare coloan a tabelei
se pot trece nite specificatori.
Ne vom ocupa pentru moment de specificatorii null respectiv not null. Primul, care
este i implicit (dac nu-l trecem, se asum automat c acea coloan este de tip null), se refer la
faptul c n coloana respectiv pot s apar i valori de tip null.
Astfel, dac ntr-o comand insert omitem o valoare pentru o anumit coloan , n acea
coloan se va trece automat valoarea null.
Al doilea specificator, not null, NU permite valori null n acea coloan . n acest caz,
dac omitem valoarea acelei coloane, n ea se va trece automat:
- 0 dac este de tip numeric;
- irul vid dac acea coloan este de tip ir de caractere;
- primul element din irul de stringuri, dac este de tip enum;
- mulimea vid , dac acea coloan este de tip set.
Exemplu: cre m o tabel , n care punem dou coloane numerice, una n care permite valoarea
null, alta n care nu, si inser m n aceast tabel o linie n care specific m doar numele.
create table pers1(nume text,virsta int not null,greut int);
insert into pers1(nume) values(Copaceanu);

La analizarea valorilor existente prin-o interogare, constat m c s-au trecut urm toarele date:
+-----------+--------+-------+
| nume
| virsta | greut |
+-----------+--------+-------+
| Copaceanu |
0 | NULL |
+-----------+--------+-------+

3.13.10. Valori implicite pentru coloanele unei tabele.


Un alt specificator pentru coloanele unei tabele, n cadrul comenzii de creare a tabelei este:
default valoare_implicit

Acesta permite ca, la omiterea unei valori pentru un anumit cmp, atunci cnd inser m o
nou coloan la tabel , acel cmp s fie automat cu o valoare implicit . Acest specificator nu
funcioneaz dect n cazul cmpurilor cu lungime fix . De exemplu, un cmp declarat char(10)
poate lua o valoare civil , pe cnd unul declarat text nu poate lua o astfel de valoare.
102

Exemplu: cre m o tabel studenti n care trecem numele, virsta si starea civil . Ultimelor
dou cmpuri le vom da valorile implicite 19 respectiv necasatorit:
create table studenti(nume text,virsta int default 19,
stare_civ char(20) default necasatorit);
insert into studenti(nume) values(ANTON Costel);
insert into studenti(nume,virsta) values(POP Mihai,21);

Iat coninutul tabelei n urma comenzilor de mai sus:


+--------------+--------+-------------+
| nume
| virsta | stare_civ
|
+--------------+--------+-------------+
| ANTON Costel |
19 | necasatorit |
| POP Mihai
|
21 | necasatorit |
+--------------+--------+-------------+

3.13.11. Cheie primar i cheie unic.

Cheia primar este constituit

dintr-unul sau mai multe cmpuri i trebuie s

ndeplineasc toate condiiile de mai jos:


- Valorile reinute de coloana care alc tuiete cheia primar trebuie s fie distincte. n cazul
n care cheia este alc tuit din mai multe cmpuri, pentru a avea dou chei distincte este necesar ca
acestea (cheile) s fie diferite pentru cel puin o coloan dintre ele. Tentativa de a ad uga n tabel o
nregistrare care are cheia primar identic cu alt nregistrare se soldeaz cu eroare iar ad ugarea,
evident, nu va mai avea loc;
- Cmpul (cmpurile) care alc tuiete (alc tuiesc) cheia primar trebuie s aib o lungime
fix . De exemplu, nu putem avea o cheie primar de tip text (sau care s conin un cmp de tip
text).

Principalul rol al cheii primare este s asigure accesul foarte rapid la o anumit nregistrare,
atunci cnd d m cheia. Trebuie s preciz m c , nregistr rile unei tabele se rein n ordinea
introducerii lor. Atunci cnd, de exemplu, un cmp este declarat cheie primar , se construiete o
tabel auxiliar , invizibil pentru utilizator, n care se trec valorile cheilor, n ordine cresc toare,
pentru fiecare cheie reinndu-se poziia rndului (liniei) din tabel , care are acea cheie.
Practic, pornind de la o anumit cheie, n tabela invizibil se poate identifica foarte rapid
num rul de ordine (poziia) al rndului cu acea cheie (se folosete c utarea binar ). De aici, accesul
la acel rnd (nregistrare) este imediat.
Pentru a preciza faptul c o anumit coloan este cheie primar , atunci cnd definim tabela,
folosim specificatorul primary key, la fel ca n exemplu de mai jos:
create table elev(nr_matricol char(10) primary key,nume text);

103

Pentru a preciza faptul c mai multe coloane particip la formarea cheii primare, atunci cnd
definim tabela, folosim specificatorul primary key(coloan1,...,coloank) dup ce am
terminat descrierea tuturor coloanelor, nainte de a nchide paranteza final de la comanda create
table, ca n exemplu de mai jos:
create table elev(nume char(20),prenume char(20),i_tata char(4),
adresa text,primary key(nume,prenume,i_tata));

Cheia unic este constituit dintr-un singur cmp. Se folosete atunci cnd, ntr-o
anumit coloan , fie ea participant la cheia primar , dorim s avem doar valori distincte.
La fel ca i la cheia primar , putem avea cheie unic doar pentru coloanele de lungime fix
(deci nu putem avea, spre exemplu, cheie unic pentru o coloan de tip text).
Dac se ncearc inserarea unei linii n tabel , cu o valoare care exist deja n cazul unei
coloane de tip cheie unic , se va semnala eroare i inserarea nu va fi permis .
Specificatorul de cheie unic este unique key. El se folosete ca n exemplul de mai jos:
create table test(nr_matr char(10) primary key,
nume text,cnp char(13) unique key);

3.13.12. Coloane cu valori de tip autoincrementare.


De multe ori, n afara datelor deja existente ntr-o tabel , este util o coloan n care s
putem avea doar valori numerice distincte, de preferabil cu valori numerice cresc toare, ncepnd
de la 1.
Acest lucru se poate rezolva prin specificatorul auto_increment pentru o anumit
coloan . Pentru a putea utiliza acest specificator, este necesar s fie ndeplinite urm toarele condiii:
- coloana s fie de un tip ntreg;
- coloana s fie format doar din valori distincte.
La tergerea unei linii, numerotarea nu se reia, ci se continu de la ultimul num r atribuit n
tabel . Indiferent dac utilizatorul specific la un moment dat o valoare explicit (pe care o dorete),
pentru acest cmp, restul numerot rii se va face ncepnd de la cea mai mare valoare pe care a
atins-o vreodat acel cmp (chiar dac ntre timp, valoarea respectiv a fost tears ) plus 1.
Exemplu: cre m o tabel n care definim o coloan de tipul auto_increment i o alt
coloan n care trecem numele unor persoane:
create
insert
insert
insert

table test(id int unique key auto_increment,nume text);


into test(nume) values(cici);
into test(nume) values(mimi);
into test(nume) values(lola);

104

Iat coninutul tabelei dup comenzile de mai sus:


+----+------+
| id | nume |
+----+------+
| 1 | cici |
| 2 | mimi |
| 3 | lola |
+----+------+

3.13.13. Sortarea datelor.

Afiarea datelor ntr-o anumit ordine se face tot cu ajutorul interog rilor: ntr-o interogare
ale c ror date dorim s le sort m, specific m, la sfritul comenzii, clauza:
order by expresie1[desc], expresie2[desc],...

specificatorul desc este folosit n cazul n care dorim ca sortarea s fie descresc toare.
Sortarea dup

mai multe expresii are urm toare semnificaie: dac

pentru dou

linii

expresie1 nu este suficient pentru a determina ordinea (deci pentru ambele, are aceeai valoare)

se consider mai departe expresie2. Dac nici expresie2 nu este suficient , se ia n considerare
expresie3, i aa mai departe.
Exemple:
select * from tabela order by nume; se afieaz toate datele din tabel , ns

sortate dup coloana nume


select * from tabela order by media desc,nume; se afieaz toate datele din

tabel , sortate descresc tor dup coloana media. Dac la dou linii alte tabelei, coloana media
are valori egale, ordinea va fi dat de valorile din coloana nume.

Indiferent de faptul c dorim o sortare sau nu, exist posibilitatea ca o interogare select s

afieze doar anumite rnduri


Pentru aceasta se folosete clauza limit (n cazul n care n comanda select apare i un
order by, clauza limit se va specifica dup ).

Sintaxa acesteia are una dintre urm toarele dou forme:


- limit n din ceea ce s-ar afia n mod normal, se afieaz doar primele n linii;
- limit m,n din ceea ce s-ar afia n mod normal, se afieaz doar ncepnd de la
a m+1-a linie (prima linie este numerotat cu 0) un num r de n linii.

105

3.13.14. Filtrarea datelor.

Se face tot cu ajutorul interog rii select: prin specificarea clauzei where condiie se
vor afia doar acele linii ale tabelei pentru care condiia este evaluat ca fiind adev rat .
Clauza poate fi utilizat n acelai timp cu clauza precendet (order by) care realizeaz
sortarea. n aceast situaie, trebuie specificat mai nti clauza where, i abia apoi clauza order by.
Iat mai jos cteva exemple:
select * from tabela where nume like a%; afieaz din tabel , doar acele

linii pentru care numele ncepe cu litera a


select * from tabela where nume like a% order by media desc;

afieaz din tabel , doar acele linii pentru care numele ncepe cu litera a, n ordinea
descresc toare a mediilor.
Exemple:
select * from tabela order by nume limit 5; n urma sort rii dup coloana

nume, se afieaz doar primele 5 linii;


select * from tabela limit 1,3; se afieaz 3 linii din tabel ncepnd de la

linia a 2-a.
3.13.15. Actualizarea datelor.

Prin actualizare a unei tabele nelegem operaia (operaiile) prin care modific m fie datele
reinute de aceasta, fie modificarea structurii, fie modificarea numelui tabelei.
a) pentru actualizarea datelor:

pentru inserarea unei noi linii n tabel , se folosete instruciunea:


insert into nume_tabel[(nume_coloan1,...,nume_coloann)]
values(expr1,...,exprn)

funcionalitatea acestei instruciuni a fost deja prezentat ;

pentru inserarea de noi linii n tabel , linii care provin din datele altei tabele, se poate

realiza prin comanda:


insert into [distinct] nume_tabel[(nume_coloan1,...,nume_coloann)]
select ...

specificatorul distinct se folosete pentru a insera doar datele distincte (care nu apar deja n
tabela n care inser m) din tabela surs .

106

b) pentru modificarea datelor se utilizeaz urm toarea instruciune:


update nume_tabel set coloan1=exp1,..,coloann=expn [where condiie]

n urma execuiei sale, pentru fiecare rnd din tabel care ndeplinete clauza where, se
actualizeaz coloanele indicate de set cu expresiile corespunz toare.
Observaie (!): n absena clauzei where vor fi modificate toate rndurile tabelei.

c) pentru tergerea uneia sau a mai multor linii ale unei tabel se utilizeaz instruciunea:
delete from nume_tabel where [conditie];
Observaie (!): n absena clauzei where vor fi terse TOATE (!) liniile tabelei;

d) pentru redenumirea unei tabele:


rename table nume_vechi to nume_nou;

e) pentru tergerea unei coloane, chiar dac aceasta conine date:


alter table nume_tabel drop column nume_coloan;

f) pentru adugarea (inserarea) unei coloane noi, cu un anumit tip de date, se utilizeaz
instruciunea:
alter table nume_tabel add nume_coloan_nou tip_coloan nou
[after coloan_existent]sau[first]

dac nu este prezent vreuna dintre clauzele after sau first, coloana cea nou se va
ad uga la sfrit. Dac este prezent cel puin vreuna, atunci coloana cea nou se va insera dup
coloana identificat de coloan_existent dac folosim clauza after... respectiv la nceput
(nainte de toate celelalte coloane) dac folosim clauza first.
3.13.16. Funcii agregate.
Toate exemplele de pn acum au avut ca operanzi doar cmpurile unui acelai rnd. n
practic , este foarte adesea necesar s putem efectua calcule i cu valorile (toate sau doar o parte)
reinute de o coloan .
Pentru astfel de calcule se utilizeaz aa-numitele funcii agregate. n cele ce urmeaz
vom prezenta aceste funcii, iar pentru exemplificare vom utiliza urm toarea tabel (cu numele
"elevi"):
+------------------+------+------+------+
| nume
| mate | engl | info |
+------------------+------+------+------+
| Aura Urziceanu
|
8 |
10 |
7 |
| Gica Petrescu
|
6 |
4 |
9 |
| Angela Similea
|
10 |
10 |
10 |
| Gabriel Cotabita |
8 |
5 |
4 |
| Corina Chiriac
|
7 | NULL | NULL |
+------------------+------+------+------+
107

Iat o trecere n revist a funciilor agregate:

count() sub forma count(*) determin num rul total de linii ale tabelei. Sub forma

count(nume_coloan) num r cte dintre valorile de pe acea coloan nu sunt null;

min(nume_coloan) determin cea mai mic valoare din coloan , ignornd valorile

care sunt egale cu null;

max(nume_coloan) determin cea mai mare valoare din coloan , ignornd valorile

care sunt egale cu null;

sum(nume_coloan) determin suma tuturor valorilor din coloan , ignornd valorile

care sunt egale cu null;

avg(nume_coloan) determin media aritmetic a tuturor valorilor din coloan ,

ignornd valorile care sunt egale cu null;


Exemple:
select count(*) as numar_elevi from elevi; afieaz num rul total de elevi din
tabel ; n cazul nostru va fi 5.
select count(info) as numar_note_info from elevi; afieaz num rul total de
valori nenule din coloana info; n cazul nostru va fi 4.
select avg(info) as medie_note_info from elevi; afieaz media tuturor notelor
nenule din coloana info; n cazul nostru va fi 7.50.
select count(engl) as nota10 from elevi where engl=10; afieaz cte note de
10 sunt n coloana engl;
3.13.17. Subinterogri.
Reprezint mecanismul prin care rezultatul ntors de o interogare poate fi folosi mai departe,
pentru a efectua o nou interogare.
Distingem urm toarele dou cazuri:
a) Interogarea subordonat ntoarce o singur valoare (deci o coloan cu un singur rnd):
Interogarea care ntoarce valoarea se scrie inclus ntre paranteze rotunde din acest
moment ea se comport ca i cum, n acel loc, din punct de vedere sintactic, am avea o singur
valoare.
Exemplu: pe tabela anterioar , s afi m toi elevii care au nota maxim la englez . n

primul rnd, va trebui s determin m printr-o subinterogare, care este nota maxim la englez , iar
pe baza valorii obinute s filtr m datele din tabela cu toi elevii. Pentru o mai bun evideniere, am
colorat cu verde subinterogarea care ntoarce nota maxim de la englez :
select * from elevi where engl=(select max(engl) from elevi);

108

b) Interogarea subordonat ntoarce o tabel i dorim ca n continuare, s manipul m


datele din aceast tabel : n acest caz, tabela returnat de interogarea subordonat trebuie s
primeasc un nume (un alias). Acesta se specific tot cu ajutorul clauzei as. Trebuie de asemenea
inclus ntre paranteze rotunde. Cmpurile tabelei ntoarse de subinterogare au numele exact ca n
antetul care s-ar afia pentru aceast subinterogare.
Atunci cnd sunt folosite de c tre interogarea care o subordoneaz , cmpurile interog rii
subordonate trebuie adresate prin numele alias-ului, urmat de caracterul . i apoi de numele
cmpului din subinterogare.
Exemplu: din tabela cu elevii, dorim s afi m, doar pentru elevii care au note completate

la toate cele 3 materii, o list cu numele i media celor 3 materii, n ordine descresc toare a
mediilor.
Dac am dori s afi m o tabel ce conine numele i media general doar de la acei elevi
care au trecute toate cele 3 note, am scrie interogarea urm toare (ne reamintim c , dac ntr-o sum ,
cel puin un termen este null, atunci toat suma este null):
select nume,(mate+engl+info)/3 as media from elevi
where mate+engl+info is not null;

Aceasta va juca rolul subinterog rii. Coloanele sale sunt nume respectiv media. Remarcai
faptul c , n cadrul interog rii pe care ne propunem s-o realiz m aceast tabel va primi alias-ul
medii, iar coloanele sale pot fi accesate prin expresiile medii.nume respectiv medii.media:
select * from (select nume,(mate+engl+info)/3 as media from elevi
where mate+engl+info is not null) as medii
order by medii.media desc;

3.13.18. Gruparea datelor.


Datele dintr-o tabel pot fi grupate n funcie de valorile dintr-o anumit coloan . Astfel,
toate valorile egale dintr-o anumit coloan vor forma un grup. Prelucr rile datelor din cadrul unui
grup se pot face cu ajutorul funciilor agregate, aceste acionnd datelor din fiecare grup.
Gruparea efectiv se realizeaz cu clauza group by, aplicat de comenzii select. n cazul
n care dorim filtrarea interog rii rezultate n urma unei grup ri, nu se mai folosete clauza where
(va genera eroare!) ci exist o nou clauz , having.
Datele din tabela rezultat n urma grup rii vor fi sortate dup coloana care realizeaz
gruparea.
Sintaxa general a comenzii select n cazul unei grup ri este:
select exp1,exp2,... from tabel group by exp_gr1,exp_gr2,....
[having condiie_filtrare];

109

Grup rile se constituie ierarhic dup exp_gr1, exp_gr2, etc. Practic, grupurile mari sunt
date de valorile egale pentru exp_gr1. n cadrul acestora, se fac subgrupurile dup valorile egale
ale lui exp_gr2, etc.
Printre expresiile din select putem avea:
- nume de cmpuri (sau expresii n funcie de acestea): n acest caz se va folosi valoarea
primei linii din fiecare grup;
- funcii agregate: acestea vor aciona asupra tuturor valorilor coloanei din grup asupra
c rora sunt aplicate;
- dac n loc de exp1,exp2,... folosim * se va afia prima linie din fiecare grup.
Exemple: Consider m urm toarea tabel , numit

pers, asupra c reia vom aplica mai multe

interog ri de grupare:
+------+------+--------+
| nume | jud | scoala |
+------+------+--------+
| dora | bv
| sc2
|
| bebe | cj
| sc2
|
| bubu | cj
| sc2
|
| fifi | bv
| sc3
|
| lala | bv
| sc2
|
| gogu | cj
| sc1
|
| fefe | bv
| sc2
|
| gigi | bv
| sc1
|
| mimi | bv
| sc2
|
| dede | cj
| sc1
|
| lola | bv
| sc1
|
| coco | bv
| sc3
|
| calu | cj
| sc1
|
| cici | bv
| sc1
|
+------+------+--------+

select jud,count(jud) as total_judet from pers group by jud;

grupeaz dup jude, afind pentru fiecare jude indicativul s u, respectiv num rul total
de persoane provenind din acel jude:
+------+-------------+
| jud | total_judet |
+------+-------------+
| bv
|
9 |
| cj
|
5 |
+------+-------------+

select jud,scoala,count(scoala) as total_scoala from pers


group by jud,scoala; grupeaz dup jude, n fiecare jude apoi dup numele colii,

afind pentru fiecare grup obinut numele judeului, numele colii i num rul de elevi din acea
coal :
+------+--------+--------------+
| jud | scoala | total_scoala |
+------+--------+--------------+
| bv
| sc1
|
3 |
| bv
| sc2
|
4 |
| bv
| sc3
|
2 |
| cj
| sc1
|
3 |
| cj
| sc2
|
2 |
+------+--------+--------------+

110

Dac din interogarea de mai sus dorim s afi m doar acele coli pentru care num rul de elevi este
de cel puin 3, ad ug m clauza having interog rii de mai sus:
select jud,scoala,count(scoala) as total_scoala from pers
group by jud,scoala having total_scoala>=3;

Rezultatul afiat va fi urm torul:


+------+--------+--------------+
| jud | scoala | total_scoala |
+------+--------+--------------+
| bv
| sc1
|
3 |
| bv
| sc2
|
4 |
| cj
| sc1
|
3 |
+------+--------+--------------+

3.13.19. Uniuni de tabele.


Un punct de maxim importan i eficien n utilizarea bazelor de date este dat de uniunea
de tabele. Uniunea este alc tuit din dou sau mai multe tabele ntre care exist o leg tur . De cele
mai multe ori, leg tura este dat de valorile existente n cte o coloan a fiec rei tabel din uniune.
Pentru tabelele care alc tuiesc uniunea se pot realiza alias-uri de nume, sub forma nume_tabel as
alias_nume, introduse n clauza from. Alias-urile pot fi utilizate n orice parte a instruciunii select.
Ca i la subinterog ri, adresarea unei coloane a unei tabele se va face sub forma
nume_alias.nume_coloan .
E recomandat s asigur m nume scurte pentru alias-urile tabelelor (a, b, pers, elev,...).
Un alt avantaj al alias-urilor este c putem realiza auto-uniuni, n cadrul c rora aceeai
tabel poate avea alias-uri diferite.

a) Uniuni de tip produs cartezian: se realizeaz printr-un select n care se trec toate
cmpurile pe care dorim s le obinem, din cadrul ambelor tabele, iar la clauza from se trec ambele
tabele, fiecare dintre ele putnd avea definit i un alias. Clauza where poate filtra doar acele perechi
de linii (din ambele tabele) pe care le dorim. n absena clauzei where, se vor genera toate
combinaiile (produs cartezian) de linii din prima tabel , cu linii din a doua tabel .
Comanda poate fi generalizat i pentru mai mult de dou tabele.
Sintaxa:
select exp1,exp2 ... from tabel1 [as alias1],tabel2 [as alias2]
[where condiie];

Evident, exp1, exp2, ... vor trebui s conin numele coloanelor, simplu, dac nu exist confuzii
(coloane care au n ambele tabele acelai nume) sau numele alias-urilor urmate de punct i de
numele coloanelor n caz contrar.

111

Exemplu: fie urm toarele dou tabele, una cu numele unor actori, fiecare actor avnd asociat un

cod, alta cu numele unor filme, fiecare film avnd trecut n dreptul s u codul actorilor care joac n
acel film:
mysql> select * from actori;
+------+-----------------+
| cod | nume
|
+------+-----------------+
| 101 | Tom Hanks
|
| 105 | Dustin Hoffman |
| 107 | Roberto Benigni |
| 110 | Jessica Lange
|
+------+-----------------+

mysql> select * from filme;


+-----------------+-----------+
| titlu
| cod_actor |
+-----------------+-----------+
| Tootsie
|
105 |
| Tootsie
|
110 |
| La vita e bella |
107 |
+-----------------+-----------+

Prin urm toarea interogare realiz m un produs cartezian al celor dou :


select f.titlu,f.cod_actor,a.cod,a.nume from filme as f,actori as a;

(putem folosi i urm toarele forme:


1) folosim operatorul * pentru a specifica toate coloanele din fiecare tabel :
select f.*,a.* from filme as f,actori as a;

2) sau i mai simplu, pentru c nu exist coloane care s se confunde (toate au nume diferite):
select * from filme,actori;

)
Rezultatul este urm torul (observai cum se ia fiecare film cu fiecare actor):
+-----------------+-----------+------+-----------------+
| titlu
| cod_actor | cod | nume
|
+-----------------+-----------+------+-----------------+
| Tootsie
|
105 | 101 | Tom Hanks
|
| Tootsie
|
110 | 101 | Tom Hanks
|
| La vita e bella |
107 | 101 | Tom Hanks
|
| Tootsie
|
105 | 105 | Dustin Hoffman |
| Tootsie
|
110 | 105 | Dustin Hoffman |
| La vita e bella |
107 | 105 | Dustin Hoffman |
| Tootsie
|
105 | 107 | Roberto Benigni |
| Tootsie
|
110 | 107 | Roberto Benigni |
| La vita e bella |
107 | 107 | Roberto Benigni |
| Tootsie
|
105 | 110 | Jessica Lange
|
| Tootsie
|
110 | 110 | Jessica Lange
|
| La vita e bella |
107 | 110 | Jessica Lange
|
+-----------------+-----------+------+-----------------+

Dac dorim s se afieze doar datele care sunt n coresponde (acest lucru este f cut,
evident, prin cmpurile numerice cod_actor, respectiv cod) folosim urm toarea interogare:
select f.*,a.* from filme as f,actori as a where f.cod_actor=a.cod;

(sau, i mai simplu: select * from filme,actori where cod_actor=cod;)


Rezultatul va fi, conform atept rilor, n forma urm toare:
+-----------------+-----------+------+-----------------+
| titlu
| cod_actor | cod | nume
|
+-----------------+-----------+------+-----------------+
| Tootsie
|
105 | 105 | Dustin Hoffman |
| La vita e bella |
107 | 107 | Roberto Benigni |
| Tootsie
|
110 | 110 | Jessica Lange
|
+-----------------+-----------+------+-----------------+

112

b) Uniuni de tip inner join:


Se aplic atunci cnd uniunea se realizeaz doar ntre dou tabele i dorim ca din ambele
tabele s fie afiate doar acele linii pentru care condiia de leg tur este satisf cut . Sintaxa
comenzii:
select exp1,exp2,.. from tabel1 [as alias1] inner join tabel2 [as alias2]
on condiie;

Ca i mai nainte, dac exist coloane care se numesc la fel n ambele tabele, vom folosi alias-uri.
Exemplu: acelai lucru ca n exemplul anterior se poate realiza cu urm toarea interogare:
select * from filme as f inner join actori as a on f.cod_actor=a.cod;

(sau, mai simplu: select * from filme join actori on cod_actor=cod;)


Obs: cuvntul cheie inner poate fi omis: prin specificarea doar a clauzei join se subnelege
c , de fapt, este vorba de un inner join;
c) Uniuni de tip left outer join:
Se aplic atunci cnd uniunea se realizeaz ntre dou tabele i dorim ca din prima tabel s
fie incluse absolut toate liniile iar din a doua tabel doar acele linii care ndeplinesc condiia de la
clauza on. La acele linii din prima tabel care nu au corespondent n a doua tabel , n dreptul
cmpurilor acesteia din urm se va trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabel1 [as alias1]
left outer join tabel2 [as alias2] on condiie;

n exemplu nostru, o astfel de interogare n care prima tabel este cea cu filme iar a doua cu
actori, va afia toate filmele, inclusiv cele pentru care nu am trecut actorii corespondeni n cea ce-a
doua tabel . Pentru a face exemplul ct mai ilustrativ, inser m urm toarea linie n tabela cu filme:
insert into filme(titlu) values('Forest Gump');

Dup care lans m urm toarea interogare de tipul left outer join:
select * from filme left outer join actori on cod_actor=cod;

Obs: Cuvntul outer poate fi omis: prezena lui left implic o uniune de tip outer.
Iat rezultatul:
+-----------------+-----------+------+-----------------+
| titlu
| cod_actor | cod | nume
|
+-----------------+-----------+------+-----------------+
| Tootsie
|
105 | 105 | Dustin Hoffman |
| Tootsie
|
110 | 110 | Jessica Lange
|
| La vita e bella |
107 | 107 | Roberto Benigni |
| Forest Gump
|
NULL | NULL | NULL
|
+-----------------+-----------+------+-----------------+

d) Uniuni de tip right outer join:


Dup cum e de ateptat, prin analogie cu situaia precedent , se aplic atunci cnd uniunea
se realizeaz ntre dou tabele i dorim ca din a doua tabel s fie incluse absolut toate liniile, iar
din prima doar acele linii pentru care condiia de la clauza on este ndeplinit . La acele linii din a
113

doua tabel care nu au corespondent n prima tabel , n dreptul cmpurilor acesteia din urm se va
trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabel1 [as alias1]
right outer join tabel2 [as alias2] on condiie;

n exemplu nostru, o astfel de interogare n care prima tabel este cea cu filme iar a doua cu
actori, va afia toi actorii, inclusiv cei pe care nu i-am asociat la vreun film, i doar acele filme
c tre care exist leg tur din tabela cu actori.
Exemplu:
select * from filme right outer join actori on cod_actor=cod;

Iat rezultatul:
+-----------------+-----------+------+-----------------+
| titlu
| cod_actor | cod | nume
|
+-----------------+-----------+------+-----------------+
| NULL
|
NULL | 101 | Tom Hanks
|
| Tootsie
|
105 | 105 | Dustin Hoffman |
| La vita e bella |
107 | 107 | Roberto Benigni |
| Tootsie
|
110 | 110 | Jessica Lange
|
+-----------------+-----------+------+-----------------+

Obs: Cuvntul outer poate fi omis: prezena lui right implic o uniune de tip outer.
e) Auto-uniuni:
Se pot face uniuni n care ambele tabele sunt, de fapt, unul i acelai, ns au alias-uri
diferite i se consider unite printr-o coloan .
Exemplu: s

consider m urm toarea tabel , cu care am lucrat ntr-unul din exemplele

paragrafului anterior 3.13.5:


mysql> select * from pictori;
+------------------+------------------+
| nume
| curent
|
+------------------+------------------+
| Gustave Klimt
| art nouveau
|
| Vincent Van Gogh | postimpresionism |
| Alphonse Mucha
| art nouveau
|
| Auguste Renoir
| impresionism
|
| Rene Magritte
| suprarealism
|
| Tiziano Vecellio |
|
+------------------+------------------+

Pentru a afia toi pictorii care aparin aceluiai curent c ruia i aparine i Gustav Klimt
putem proceda n felul urm tor (! atenie, exemplu este doar didactic, din punct de vedere practic
NU se procedeaz n acest fel):
select b.nume from pictori as a join pictori as b on a.curent=b.curent
where a.curent='art nouveau' and a.nume='Gustave Klimt';

114

3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP.

Pentru a face funcional suportul de conectivitate a limbajului PHP c tre bazele de date
MySQL, este necesar utilizarea bibliotecii mysql. n cazul pachetului XAMPP, aceasta este
instalat i activat n mod implicit. n cazul altor distribuii, acest lucru trebuie f cut manual.

n primul rnd, din interiorul unui script PHP trebuie realizat conectarea la baza de date.

Pentru acest lucru, avem nevoie de adresa IP a server-ului MySQL (n cazul nostru, deoarece
utiliz m o configuraie standard, server-ul se afl pe calculatorul local, deci aceast adres este
localhost), numele unui utilizator i parola cu care acest utilizator se conecteaz la baza de
date.
n cazul nostru, vom asuma faptul c utilzatorul are numele utilizator iar parola sa este
parola (aa cum l-am creat n paragraful 3.3.12).
Conectarea efectiv se face cu ajutorul instruciunii:
$resurs=mysql_connect(localhost, utilizator, parola);

Variabila $resurs va fi cea prin care, n continuare, ne vom putea referi la conexiunea creat .
Dac aceasta nu reuete din diferite motive (nume utilzator sau parola incorecte, server-ul MySQL
nu este pornit, etc.) variabila $resurs va avea valoarea null.

Selectarea unei baze de date, o dat ce conexiunea a fost creat , pentru a plasa comenzi n

aceast baz de date, este:


mysql_select_db(nume_baz_date);

Aceasta ntoarce o valoare diferit de 0 dac selectarea a reuit, sau 0 n caz contrar;

Plasarea unei comenzi (interog ri) asupra bazei de date selectate se face prin instruciunea:
$resurs1=mysql_query(string_ce_conine_comanda_MySQL);

Dac interogarea (comanda) a funcionat corect, funcia va ntoarce o valoare diferit de 0. n caz
contrar, ntoarce valoarea 0.
Variabila $resurs1 este cea care va permite, n continuare, obinerea rezultatului efectiv
al interog rii.
n cazul oric rei erori, perechea de funcii mysql_errno(); respectiv mysql_error();
ne ntorc codul (num rul) ultimei erori generate, respectiv mesajul asociat acesteia.
nchiderea conexiunii c tre baza de date MySQL se face prin comanda:
mysql_close(resurs_conexiune);

E preferabil s nchidem conexiunile deschise prin mysql_connect la sfritul script-ului.

Obinerea datelor ntoarse de interogare se face prin intermediul resursei ntoarse de

comanda mysql_query. Iat funciile cele mai folosite:


115

- mysql_num_rows(resursa) returneaz num rul de linii (rnduri) ale tabelei rezultate


n urma interog rii;
- mysql_num_fields(resursa) returneaz num rul de cmpuri (coloane) ale tabelei
rezultate n urma interog rii;
- mysql_field_name(resursa,k) returneaz numele cmpului (coloanei) al k-lea al
tabelei. Coloanele sunt numerotate de la 0;
Exemplu: urm torul script PHP va realiza o conectare la baza de date MySQL, lansnd o
interogare de afiare a tuturor datelor din tabela elevi, din exemplul 3.13.16. n urma acestei
interog ri va afia datele obinute cu ajutorul funciilor de mai sus:
apl085.php:
<?php
$l=mysql_connect('localhost','utilizator','parola');
mysql_select_db('lucru');
$r=mysql_query('select * from elevi');
$n=mysql_num_rows($r);
$m=mysql_num_fields($r);
echo 'Nr. total de linii intoarse de interogare: ',$n,'<br>';
echo 'Nr. total de coloane intoarse de interogare: ',$n,'<br>';
echo 'Numele coloanelor sunt urmatoarele:<br>';
for($j=0;$j<$m;$j++)
echo 'Coloana de la indicele ',$j,' are numele: <b>',
mysql_field_name($r,$j),'</b><br>';
mysql_close($l);
?>

Iat rezultatul afiat de c tre script:

- mysql_fetch_array(resurs) ntoarce rndul (linia) curent , sub forma unui ir


(vector) din interogarea specificat de resurs , mutnd pointerul intern pe urm toarea linie (rnd) al
interog rii. Dac liniile interog rii s-au terminat, va ntoarce fals.
n irul ntors, putem folosi pe post de indici att numele coloanelor, ct i valori numerice
cuprinse ntre 0 i num rul de coloane minus 1.
Modelul general de aplicare al acestei instruciuni este pe o repetitiv de tip while, n care
atribuim unui vector valoarea ntoars de funcia mysq_fetch_row direct n condiia de ciclare a
repetitivei:
while($a=msql_fetch_row($resursa))
{...prelucrm elementele vectorului $a, care ne dau linia curent a interogrii...}

116

Iat modul n care putem obine, ntr-o form prezentabil , toate datele coninute de tabela
din exemplul anterior, afind inclusiv o linie de antet cu numele coloanelor tabelei:
apl086.php:
<?php
$l=mysql_connect('localhost','utilizator','parola');
mysql_select_db('lucru');
$r=mysql_query('select * from elevi');
$m=mysql_num_fields($r);
echo '<table border="1" cellspacing="0" cellpadding="10">';
//pregtim afiarea ntr-un tabel
echo '<tr>';
for($j=0;$j<$m;$j++)//afim numele coloanelor n celule de tipul th
echo '<th align="center">',mysql_field_name($r,$j);
while($a=mysql_fetch_row($r))
{
echo '<tr>';
for($j=0;$j<$m;$j++)
{
echo '<td>';
if($a[$j]) echo $a[$j];//n locul valorilor vide afim un spaiu
else echo '&nbsp;';//altfel, tabelul HTML va arta urt
}
}
echo '</table>';
mysql_close($l);
?>

Iat rezultatul afiat de c tre script n browser:

117

3.13.21. ELEMENTELE DE BAZ ALE


LIMBAJULUI SQL*PLUS
1. DESPRE LIMBAJ
n 1974 a fost lansat proiectul System/R de ctre firma IBM. Tot n
acest an a aprut limbajul structurat de programare SEQUEL (Structured
English as Query Language) autori fiind Chamberlin i Boyce.
n 1976 apare un nou limbaj SEQUEL 2 care a fost declarat limbajul
de interogare al SGBD System/R. Denumirea limbajului este schimbat de
Chamberlin n SQL (Structured Query Language) n anul 1980.
Ulterior limbajul a fost perfec ionat fiind considerat cel mai
rspndit limbaj de interogare a bazelor de date rela ionale.
Institutul Na ional pentru Standarde n anul 1982 a lansat un proiect
de lucru pentru standardizarea limbajelor de interogare care a fost finalizat
n 1986 aprnd standardul ANSI SQL-86. Acesta definete comenzile de
baz ale SQL, dar nu con ine partea de actualizare i acordarea drepturilor
de acces la o baz de date.
Prin revizuire acest limbaj apare n 1989 SQL-1 ca fiind limbajul
fundamental al SGBD rala ionale.
n 1992 apare versiunea SQL-2 care ofer noi facilit i cum ar fi:
jonc iune extern, implementarea restric iei referen iale, modificarea
schemei bazei de date, etc.
Cel mai recent standard este SQL-3 care a fost lansat n anul 1999,
acesta este considerat un limbaj complet n vederea definirii i gestiunii
obiectelor complexe. Se consider c prin publicarea standardului propus n
acest an a fost depit bariera rela ionalului, el fiind mult mai mult dect un
instrument de consultare a bazelor de date.
2. CONCEPTE UTILIZATE
SQL*PLUS este un limbaj neprocedural i opereaz asupra datelor
normalizate. Conceptele necesare a fi cunoscute pentru lucrul cu acest
limbaj sunt: tabel, cheie primar, coloan, rnd, viziune, index, sinonim,
cluster, baz de date rela ional, comanda, blocul, cererea,raportul etc.
Tabela sau relaia este un ansamblu format din n coloane
(atribute/subansambluri) i m rnduri (tupluri/linii) care respect
urmtoarele condi ii minime: nu con ine date la nivel agregat (valorile aflate
la intersec ia liniilor cu coloanele s fie la un nivel elementar); liniile sunt
distincte unele fa de altele; nu con ine coloane repetitive n descriere.

Cheia primar este un atribut care are valori distincte. Deci, fiecare
linie se identific printr-o valoare distinct. Dou sau mai multe atribute
care pot fi chei primare se numesc chei candidate.
Coloana tabelei este format din valorile pe care le ia atributul n
liniile tabelei respective.
Rndul/tuplul/linia este format din valorile coloanelor ce se refer la
o entitate a tabelei.
Baza de date relaional este un ansamblu de tabele normalizate,
grupate n jurul unui subiect, n principiu, bine definit. ntr-o baz de date
rela ional, entit ile i legturile sunt transpuse n tabele.
Viziunea este o tabela logic i reprezint o fereastr la date, dintruna sau mai multe tabele.
Pentru ca accesul la date sa se fac mai rapid, se utilizeaz
indexarea. Un index reprezint o cheie pe una sau mai multe coloane.
Indexarea este dinamic deoarece se pot adaug sau terge indeci oricnd,
fr ca datele memorate sau aplica iile scrise s fie afectate.
Pentru realizarea unor opera ii sau pentru a utiliza n cereri nume
mai scurte, se pot defini sinonime ale unor nume de tabele sau viziuni.
Un cluster reprezint o anumit modalitate de grupare a rndurilor
uneia sau mai multor tabele. Aceast grupare mrete viteza de execu ie a
unor opera ii consumatoare de timp.
Comanda este o instruc iune emis din SQL*Plus ctre o baz de
date Oracle.
Blocul reprezint un grup de instruc iuni SQL i PL/SQL.
Cererea este o comanda SQL (SELECT) care regsete date din
baza de date. Rezultatul cererii l formeaz datele regsite din baza de date.
Raportul este rezultatul cererii formatat cu ajutorul comenzilor
SQL*Plus.
Numele unei baze de date, al unei tabele, coloane sau variabile
utilizator trebuie s aib lungimea ntre 1 i 30 caractere. Un nume nu poate
con ine apostrofuri. Cu att mai pu in, un nume utilizat ntr-o comand nu va
fi introdus ntre apostrofuri. Literele mici i mari sunt echivalente (nu se
face distinc ia ntre literele mici i mari). Un nume trebuie s nceap cu o
liter, s con in numai anumite caractere (A-Z, 0-9, $, #, @, -), s nu
duplice numele unui alt obiect de acelai tip i s difere de un cuvnt
rezervat ORACLE.
Cuvintele rezervate nu pot fi utilizate ca nume de tabele, coloane sau
orice alte obiecte definite de utilizator. Ele sunt prezentate n Anexa 1.

3. FUNC II SQL
Func iile se apeleaz prin sintaxa:
Nume_funcie (argument1, argument2, )
Func iile SQL sunt cu un singur rnd sau scalare (returneaz un
singur rezultat pentru fiecare rnd al cererii emise asupra unei tabele sau
vederi) i cu mai multe rnduri numite func ii grup sau agregate (returneaz
un singur rezultat pentru un grup de rnduri regsite dintr-o tabel sau
vedere).
A. Funciile SQL cu un singur rnd (funciile scalare)
Acestea sunt func ii: numerice, caracter, de tip DATE, de conversie
i alte func ii.
1) Funciile numerice accept valori numerice i returneaz
rezultate numerice i sunt prezentate n tabelul 3.1. Tabela DUAL folosit n
exemple, este creat automat de ctre Oracle odat cu crearea dic ionarului
de date i se afl n schema utilizatorului SYS, dar cu acest nume este
accesibil tuturor utilizatorilor unei baze de date Oracle. Ea are o singur
coloan numit DUMMY cu tipul de date VARCHAR2(1) i un singur rnd
cu valoarea 'X'. Selec iile din tabela DUAL sunt utile pentru calcularea unor
expresii constante cu comanda SQL SELECT. Din cauz c are un singur
rnd, constanta este returnat o singur dat. Alternativ pentru aceeai
activitate se poate selecta o constant, pseudocoloan sau o expresie din
orice tabel.
Tabelul 3.1 Funciile numerice
Func ia
ABS(n)

Rolul func iei


Returneaz valoarea absolut
a numrului n.

ACOS(n)

Arc cosinus de n. Rezultatul


este exprimat n radiani.

ASIN(n)

Arc sinus de n.

ATAN

Arc tangent de n.

Exemple
SELECT ABS(-15) "Absolut"
FROM DUAL;
Absolut
---------15
SELECT COS(.3)"Arc_Cosinus"
FROM DUAL;
Arc cosinus
---------1.26610367
SELECT ASIN(.3) "Arc_Sinus"
FROM DUAL;
Arc_Sinus
---------.304692654
SELECT ATAN(.3) "Arc_Tangent"
FROM DUAL;

ATAN2

Arc tangent de n i m sau


arc tangent de n/m. Deci
ATAN2(n,m) este identic cu
ATAN2(n/m).

CEIL(n)

Retureaz numrul ntreg cel


mai mic care este mai mare
sau egal cu n.

COS(n)

Cosinus de n.

COSH(n)

Cosinus hiperbolic de n.

EXP(n)

Returneaz o valoare egal


cu e ridicat la puterea n, unde
e = 2.71828183.

FLOOR(n)

Returneaz numrul cel mai


mare care este mai mic sau
egal cu n.

LN(n)

Returneaz logaritmul
natural de n, unde n > 0.

LOG(m,n)

Returneaz logaritm n baza


m de n.(LOGmn)

MOD(m,n)

Returneaz restul mpririi

Arc_Tangent
---------.291456794
SELECT ATAN2(.3,.2) Arc_Tangent2"
FROM DUAL;
Arc_Tangent2
-----------.982793723
SELECT CEIL(15.7) "NUM R"
FROM DUAL;
NUM R
---------16
SELECT COS(180 * 3.14/180)
"Cosinus de 180 grade"
FROM DUAL;
Cosinus de 180 grade
---------------------1
SELECT COSH(0) "Cosinus
hiperbolic de 0"
FROM DUAL;
Cosinus hiperbolic de 0
---------------------1
SELECT EXP(4) "e la puterea 4"
FROM DUAL;
e la puterea 4
-----------------54.59815
SELECT FLOOR(15.7) "Floor"
FROM DUAL;
Floor
---------15
SELECT LN(95) "Logaritm natural de
95"
FROM DUAL;
Logaritm natural de 95
----------------4.55387689
SELECT LOG(10,100) "Log n baza
10 de 100"
FROM DUAL;
Log n baza 10 de 100
-----------------2
SELECT MOD(11,4) "Modulo 4"

POWER (n,m)

ROUND
(n[,m])

SIGN(n)

SIN(n)

SINH

lui m la n. Dac n este 0


returneaz valoarea m.
Aceast funcie se comport
diferit fa de funcia modulo
clasic din matematic,
atunci cnd m este negativ.
Avnd n vedere semnificaia
funciei MOD funcia modulo
clasic din matematic se
poate exprima cu formula :
m - n * FLOOR(m/n)
Returneaz o valoare egal
cu m la puterea n.

Returneaz n rotunjit la un
numr de m yecimale. Dac
m este omis se elimin
zecimalele, iar dac este
negativ se face rotunjirea
numrului din dreapta
virgulei zecimale, dup
regula: m = -1 rotunjire la
nivel de zeci, m = -2 rotunjire
la nivel de sute i aa mai
departe.

Returneaz semnul numrului


n, dup regula:
n<0 returneaz valoarea -1;
n=0 returneaz valoarea 0;
n>0 returneaz valoarea +1.
Returneaz sinus de n n
radiani.

Returneaz sinus hiperbolic

FROM DUAL;
Modulo 4
---------3 2.

SELECT POWER(3,2) "Putere"


FROM DUAL;
Putere
---------9
SELECT ROUND(15.193,1)
"Rotunjire"
FROM DUAL;
Rotunjire
---------15.2
SELECT ROUND(15.193,-1)
"Rotunjire "
FROM DUAL;
Rotunjire
---------20
Aici rotunjirea s-a fcut la nivel de
zeci, cci scala negativ nseamn
rotunjirea valorii din drepta semnului
zecimal, iar scala pozitiv nseamn
rotunjirea numrului din dreapta
semnului zecimal la ordinul de mrime
ct este scala.
SELECT SIGN(-15) "Semn"
FROM DUAL;
Semn
----------1
SELECT SIN(30 * 3.14159265359/180)
"Sinus de 30 de grade"
FROM DUAL;
Sinus de 30 de grade
-----------------.5
SELECT SINH(1) " Sinus hiperbolic de

de n.

SQRT(n)

Returneaz rdcin ptrat


din n.

TAN(n)

Returneaz tangent de n.

TANH(n)

Returneaz tangent
hiperbolic de n.

TRUNC (n,m)

Returneaz valoarea lui n


trunchiat la un numr de
zecimale egal cu m. Dac m
este omis se elimin valorile
zecimale, iar dac ia o
valoare negativ trunchiere
se aplic prii din stnga
virgulei zecimale, dup
regula: m = -1 rotunjire la
nivel de zeci, m= -2 rotunjire
la nivel de sute i aa mai
departe.

1"
FROM DUAL;
Sinus hiperbolic de 1
-------------------1.17520119
SELECT SQRT(26) "Rdcin ptrat"
FROM DUAL;
Rdcin ptrat
----------5.09901951
SELECT TAN(135 * 3.14/180)
"Tangent de 135 grade"
FROM DUAL;
Tangent de 135 grade
----------------------1
SELECT TANH(.5) " Tangent
hiperbolic de 5"
FROM DUAL;
Tangent hiperbolic de 5
-----------------------.462117157
SELECT TRUNC(15.79,-1) "Trunc"
FROM DUAL;
Trunc
---------10

2) Funciile caracter accept la intrare valori caracter i furnizeaz


valori caracter sau numerice. n tabelul 3.2 sunt prezentate func iile caracter
care returneaz caractere, iar n tabelul 3.3 func iile caracter care
returneaz valori numerice. Valorile caracter returnate sunt de tipul
VARCHAR2 dac nu se specific altfel.
Tabelul 3.2 Funciile caracter care returneaz caractere
Func ia
CHR(n)

Rolul func iei


Returneaz caracterul care
are valoarea binar n.

Exemple
SELECT CHR(67)||CHR(65)||CHR(84)
"Caractere"
FROM DUAL;
Caractere

CONCAT
(c1,c2)

Returneaz o valoare format


din concatenarea caracterului
c1 cu caracterul c2.

INITCAP
('ir')

Returneaz irul de caractere


'ir' astfel nct fiecare cuvnt
al irului are prima liter n
format liter mare.

LOWER ('ir')

Returneaz irul de caractere


'ir' astfel nct toate literele
irului sunt de format liter
mic.

Returneaz irul de caractere


'c1', pe lungime de n
caractere, astfel nct partea
din stnga irului pn la
lungimea de n caractere este
umplut cu secvene de
caractere egale cu 'c2'. Dac
irul 'c1' este mai lung dect
valoarea n, atunci se
returneaz partea dreapt a
irului pe lungime de n
caractere.
LTRIM ('c1'
Returneaz partea din irul
[,'c2'])
'c1' care a mai rmas dup ce
au fost nlturate toate
caracterele din stnga
acestuia care se regsesc n
setul de caractere 'c2'.
NLSSORT
Returnez un ir de caractere
('c1'
folosite pentru sortarea
[,'nlsparams']) cmpurilor de tip caracter.
Caracterul 'c1' definete un
marcator de sortare, n sensul
c toate valorile dintr-un
cmp care sunt mai mari sau
mai mici dect acesta vor fi
afiate sau nu prin folosirea
LPAD
('c1',n,'c2')

--CAT
SELECT CONCAT( CONCAT (nume, '
este '), funcie) "Funcie"
FROM tab1
WHERE codfuncie = 7000;
Funcie
----------------Popescu este PROGRAMATOR
SELECT INITCAP('cuvnt1 cuvnt2')
"Litere mari"
FROM DUAL;
Litere mari
--------Cuvnt1 Cuvnt2
SELECT LOWER('BUCURETI')
"Liter mic"
FROM DUAL;
Liter mic.
-------------------bucureti
SELECT LPAD('Page.1',10,'*.')
"LPAD exemplu"
FROM DUAL;
LPAD exemplu
--------------*.*.*Pag.1

SELECT LTRIM('xyxXxyREST IR','xy')


"LTRIM exemplu"
FROM DUAL;
LTRIM exemplu
-----------XxyREST IR
SELECT nume
FROM tab1
WHERE
NLSSORT(nume,'NLS_SORT=romanian'
)<
NLSSORT('O','NLS_SORT=romanian')
ORDER BY nume;
NUME
----------

REPLACE
('c1','c2','c3')

RPAD
('c1',n[,'c2'])

RTRIM
('c1','c2')

SUBSTR
('c1',m[,n])

clauzei ORDER BY.


Parametrul 'nlsparams'
defineste valoare lingvistic
dup care s se fac sortare
i se d sub forma
'NLS_SORT = sort' n care
sort definete limba dup care
dorim s se fac
sortarea(german, romn
etc).
Returneaz irul 'c1'
translatat, astfel nct n irul
'c1' toate valorile egale cu
irul de cutare 'c2' sunt
nlocuite cu irul de nlocuire
'c3'.
Returneaz irul de caractere
'c1', pe lungime de n
caractere, astfel nct partea
din dreapta irului pn la
lungimea de n caractere este
umplut cu secvene de
caractere egale cu 'c2'. Dac
irul 'c1' este mai lung dect
valoarea n, atunci se
returneaz partea stng a
irului pe lungime de n
caractere.
Returneaz partea din irul
'c1' care a mai rmas dup ce
au fost nlturate toate
caracterele din dreapta
acestuia care se regsesc n
setul de caractere 'c2'.
Returneaz poriunea din
irul 'c1' care ncepe de la al
m-lea caracter pe lungime de
n caractere.

IONESCU
MARINESCU
POPESCU
OLGA
Not: Numele care ncep cu o liter mai
mare dect 'O' nu se vor afia.

SELECT REPLACE ('MAS i


MUSCA','M','C') "REPLACE"
FROM DUAL;
REPLACE
-------------CAS i CUC
SELECT RPAD('CLUJ',10,'ab') "RPAD
exemplu"
FROM DUAL;
RPAD exemplu
----------------CLUJababab

SELECT
RTRIM('BUCURETIyxXxy','xy')
"RTRIM exemplu"
FROM DUAL;
RTRIM exemplu
------------BUCURETIyxX
SELECT SUBSTR
('ABCDEFG',3.1,4) Subir1"
FROM DUAL;
Subir1
---CDEF
SELECT SUBSTR('ABCDEFG',-5,4)
"Subir2"
FROM DUAL;
Subir2
---CDEF

TRANSLATE
('c1','c2','c3')

UPPER('c1')

1. Translateaz irul 'c1' prin


intermediul irului 'c2' la
valorile din irul 'c3' dup
regula: fiecare caracter din
irul c1 este cutat n irul
'c2', dac este gsit valoarea
acestuia este nlocuit cu
caracterul din irul 'c3' a
crui poziie corespunde cu
poziia caracterului din irul
'c2'.
2. Dac irul 'c2' este mai
lung dect irul 'c3'
caracterele ce nu pot fi
translatate sunt eliminate din
irul 'c1'.
Returneaz irul 'c1' cu toate
caracterele transformate n
caractere mari.

SELECT TRANSLATE ('2KRB229',


'0123456789ABCDEFGHIJKLMNOPQ
RSTUV',
'9999999999XXXXXXXXXXXXXXXXXX
XXXXXXXX') "TRANSLATE 1"
FROM DUAL;
TRANSLATE 1
-------9XXX999
SELECT TRANSLATE ('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQ
RSTUVWX', '0123456789') "
TRANSLATE 2"
FROM DUAL;
TRANSLATE 2
----------------2229
SELECT UPPER('Bucureti')
"LITERE MARI"
FROM DUAL;
LITERE MARI
----BUCURETI

Tabelul 3.3 Func iile caracter care returneaz valori numerice


Func ia
ASCII ('c1')

Rolul func iei


Returneaz
valoarea
zecimal
a
primului
caracter din irul 'c1'.

INSTR ('c1','c2'
[,n[,m]])

1.Caut n irul 'c1'


ncepnd cu al n-lea su
caracter a m-a apariie a
irului 'c2' i returneaz
poziia acestuia n irul
'c1' relativ la nceputul
irului. Dac irul 'c2' nu
este gsit n irul 'c1' se
returneaz valoarea 0.
Valorile asumate prin
lips pentru n i m sunt 1.
2. Dac n este negativ
cutarea se face invers de
la sfritul irului.
Returneaz lungimea n

LENGTH

Exemple
SELECT ASCII('Q')
FROM DUAL;
ASCII('Q')
---------81
SELECT INSTR ('CORPORATE
FLOOR','OR', 3, 2) "INSTR"
FROM DUAL;
INSTR
---------14
SELECT INSTR ('CORPORATE
FLOOR', 'OR', -3, 2) "INSTR
INVERS" FROM DUAL;
INSTR INVERS
----------------2
SELECT LENGTH('BUCURETI')

caractere
caractere
CHAR.

a irului de
'c1' de tip

"LUNGIME IR"
FROM DUAL;
LUNGIME IR
-------------------9

3) Funciile de tip DATE opereaz cu tipuri de date de tip DATE i


sunt prezentate n tabelul 3.4. Toate func iile de tip DATE returneaz valori
de tip DATE, mai pu in func ia MONTH_BETWEEN care furnizeaz o
valoare numeric. Structurile formatului fmt de afiare a datelor pentru
func iile de tip DATE sunt prezentate n tabelul 3.7.
Tabelul 3.4 Func iile de tip DATE
Func ia
ADD_MONTHS(d,n)

Rolul func iei


Returneaz data
d plus un numr
de luni egal cu
n.

LAST_DAY (d)

Returneaz data
ultimei zile din
lun.

MONTHS_
BETWEEN (d1, d2)

Returneaz
numrul de luni
dintre datele d1

Exemple
Dac n coloana data1 aferent numelui
'POPESCU' din tabela tab1 avem data 17
septembrie2005 cu comanda de mai jos se va
ob'ine data 17 octombrie 2005.
SELECT TO_CHAR
(ADD_MONTHS(data1,1), 'DD-MON-YYYY')
"Luna urmtoare"
FROM tab1
WHERE nume = 'POPESCU';
Luna urmtoare
----------17-OCT-2005
Cu aceast funcie se poate determina numrul
zilelor rmase din luna curent.
SELECT SYSDATE, LAST_DAY(SYSDATE)
"ULTIMA",LAST_DAY(SYSDATE) - SYSDATE
"ZILE R MASE"
FROM DUAL;
SYSDATE
ULTIMA
ZILE R MASE
-------------------------23-SEP-05 30-SEP-05
7
SELECT
TO_CHAR(ADD_MONTHS(LAST_DAY(data1),
5), 'DD-MON-YYYY') "Cinci luni"
FROM tab1
WHERE nume = 'POPESCU';
Cinci luni
----------28-FEB-2006
SELECT MONTHS_BETWEEN
(TO_DATE('02-09-2005','MM-DD-YYYY'),
TO_DATE('01-08-2005','MM-DD-YYYY') )

NEXT_DAY (d, 'c1')

ROUND (d[,fmt])

SYSDATE

TRUNC (d,[fmt])

i d2. Dac d1
i d2 sunt
acelei zile din
lun sau sunt
ultimele zile din
lun rezultatul
este un numr
ntreg, altfel
Oracle
calculeaz
fraciuni din
lun bazat pe o
lun cu 31 zile.
Returneaz data
primei zile a
sptmnii dup
ziua definit de
irul 'c1' i care
este dup data
d.

Returneaz data
d rotunjit la
unitatea de timp
specificat de
ctre formatul
fmt, conform
specificaiilor
de la sfritul
tabelului.
Returneaz data
i timpul curent.

Returneaz data
d fr timp
trunchiat la o
unitate
specificat de
formatul fmt, iar
dac este absent
se face
trunchierea la
ziua cea mai

"Luni"
FROM DUAL;
Luni
---------1.03225806

n exemplul de mai jos se returneaz data zilei


care urmeaz zilei de Mari, dup data de 15
martie 1999.
SELECT NEXT_DAY('15-MAR-05','TUESDAY')
"ZIUA URM TOARE"
FROM DUAL;
ZIUA URM TOARE
--------22-MAR-05
SELECT ROUND (TO_DATE ('27-SEP05'),'YEAR') "Noul an"
FROM DUAL;
Noul an
--------01-JAN-06

SELECT TO_CHAR(SYSDATE,
'MM-DD-YYYY HH24:MI:SS') "Data i timpul
curent"
FROM DUAL;
Data i timpul curent
------------------27-09-2005 20:27:11
SELECT TRUNC(TO_DATE
('27-SEP-05','DD-MON-YY'), 'YEAR')
"Anul nou"
FROM DUAL;
Anul nou
--------01-JAN-05

apropiat.
Formatul fmt utilizat de funciile ROUND i TRUNC
Formatul fmt
Semnifica ia formatului fmt
CC, SCC
Se rotunjete la nivel de secol (primii doi digii ai anului
exprimat pe patru digii + 1)
Exemplu: 1898 se rotujete la 1998.
SYYYY, YYYY, YEAR SYEAR, Se rotunjete la nivelul 01 ianuarie a anului din data care
YYY, YY, Y
se rotunjete.
Exemplu: 27-sep-05 se rotunje;te la 01-jan-05.
Q
Rotunjire la nivel de trimestru (Se routunjete n sus la a
asesprezecea zi a lunii a doua a trimestrului).
MONTH, MON, MM, RM
Rotunjire la nivel de lun (Se routunjete n sus la a
asesprezecea zi a lunii).

4) Funciile de conversie convertesc o valoare de la un tip de dat la alt tip


de dat. Aceste func ii au formatul general de forma tip_de_dat TO
tip_de_dat i sunt prezentate n tabelul 3.5.
Tabelul 3.5 Func iile de conversie
Func ia
CONVERT
('c1', set_destinaie,
[,set_surs] )

HEXTOROW('c1')

RAWTOHEX(raw)

ROWIDTOCHAR
(rowid)

Semnifica ia
Convertete un ir de
caractere de la un set
de caractere la alt set
de caractere. Setul
set_surs este setul de
caractere din care fac
parte caracterele
irului 'c1', iar
set_destinaie este setul
de caractere n care se
convertesc caracterele
irului 'c1'.
Convertete irul 'c1'
care conine digii
hexazecimali la tipul de
date RAW.
Convertete digii
hexazecimali de tip
RAW la irul 'c1'.
Convertete valoarea
ROWID la o valoare de
tip VARCHAR".
Rezultatul conversiei

Exemple
SELECT CONVERT('Gro', 'US7ASCII',
'WE8HP') "Conversie"
FROM DUAL;
Conversie
---------Gross
Seturile de caractere cele mai comune
sunt: US7ASCII, WE8DEC, WE8HP,
F7DEC, WE8EBCDIC500 , WE8PC850,
WE8ISO8859P1 .
INSERT INTO tab1 (raw_column)
SELECT HEXTORAW('7D') FROM
DUAL;

SELECT ROWID
FROM tab1
WHERE ROWIDTOCHAR(ROWID)
LIKE '%Br1AAB%';

este tot impul un ir de


18 caractere.

ROWID
-----------------AAAAZ6AABAAABr1AAB

TO_CHAR pentru
conversie de caractere,
are sintaxa:
TO_CHAR
(d [, fmt])

Convertete data d de
tip DATE la o valoare
de tip VARCHAR2 n
formatul specificat.

TO_CHAR pentru
conversie de numere,
are sintaxa:
TO_CHAR
(n [, fmt])

Convertete numrul n
de tip NUMBER la o
valoare de tip
VARCHAR2.

CHARTOROWID
('c1')

Convertete o valoare
de tip CHAR sau
VARCHAR2 la o
valoare de tip ROWID

TO_DATE
('c1' [, fmt ])

Convertete irul de
caractere 'c1' de tip
CHAR sau VARCHAR2
la o valoare de tip
DATE n conformitate
cu formatul fmt .
Formatul fmt pentru
datele de tip DATE este
prezentat n tabelul 3.7.
Convertete irul de
caractere 'c1' de tip
CHAR sau VARCHAR2
la o valoare numeric
de tip NUMBER n
conformitate cu
formatul fmt. Forma
acestui format este n
tabelul 3.6.

SELECT TO_CHAR (data1, 'Month DD,


YYYY') "Format nou"
FROM tab1
WHERE nume = 'ION';
Format nou
-----------------May
01, 2005
SELECT TO_CHAR(10000,'L99G999D99MI') "Cantitate"
FROM DUAL;
Cantitate
-------------$10,000.00SELECT nume
FROM tab1
WHERE ROWID = CHARTOROWID
('AAAAfZAABAAACp8AAO');
nume
---------POPESCU
INSERT INTO tab1 (data1)
SELECT TO_DATE( 'January 15, 2005,
11:00 A.M.', 'Month dd, YYYY, HH:MI
A.M.')
FROM DUAL;

TO_NUMBER
('c1',[,fmt ])

UPDATE tab1
SET salariu = salariu +
TO_NUMBER('100.00', '9G999D99')
WHERE nume = 'ION';

Tabelul 3.6 Structurile formatului fmt pentru datele de tip NUMBER


Elementul
fmt
9
0

Exemple

Semnifica ia elementului fmt

9999
0999 9990

Nr. semnificativ de digii care vor fi afiai


Afieaz 0 n faa sau dup digiii semnificativi

$
B
MI
S

$999
B999
999MI
S999

D
G
,
.
RN sau rn

99D99
99G999
99,999,99
999.99
RN sau rn

Afieaz semnul $ n faa numrului


Afieaz valorile 0 ca blank-uri
Afieaz semnul - dup numerele negative
Afieaz semnul + sau - n faa numerelor
pozitive, respectiv negative
Afieaz punctul zecimal n aceast poziie
Separator de grupuri
Virgula se afieaz n poziiile indicate
Afieaz punctul zecimal n aceast poziie
Afieaz cifre romane cu majuscule, respectiv cu
caractere mici(minuscule)

Tabelul 3.7 Structurile formatului fmt pentru datele de tip DATE


Elementul fmt

- /,.;:
"text"
AD sau A.D.
BC sau B.C.
CC sau SCC

Se specific
n
TO-DATE
Da
Da
Da
Da
Nu

D
DAY
DD
DDD
HH sau HH12
HH24
J

Da
Da
Da
Da
Da
Da
Da

MI
MM
MON
MONTH
PM sau P.M.
RR sau RRRR
SS
SSSS

Da
Da
Da
Da
Nu
Da
da
Da

WW
W
YYYY,YYY,YY,Y

Nu
Nu
Da

Semnifica ia elementului fmt

Punctuaii pentru dat


Text reprodus n rezultat
Specificarea unui an din Era Noastr(E.N.)
Specificarea unui an naintea Erei Noastre(.E.N.)
Secolul = cu primii doi digii ai anului pe patru digii
+1
Ziua din sptmn(de la 1 la 7)
Numele zilei
Ziua din lun(de la 1 la 31)
Ziua din an(1 la 366)
Ora din zi din intervalul 1 - 12
Ora din zi din intervalul 1 - 24
Ziua din calendarul Iulian cu valori ncepnd cu 1
ianuarie 4712 BC. Trebuie s fi ntreg.
Minute (0 la 59)
Luna (01 la 12)
Numele prescurtat al lunii
Numele ntreg al lunii
Indicator de meridian
Rotunjirea anului pe doi digii sau patru digii
Secundele n cadrul minutului(0 la 59)
Secundele de la miezul nopii n cadrul zilei(0 la
86399)
Sptmna din an (1 la 53)
Sptmna n cadrul lunii(1 la 5)
Anul cu 4 , 3, 2, 1 digii.

Alte func ii cu un singur rnd sunt prezentate n tabelul 3.8.

Tabelul 3.8 Alte funcii cu un singur rnd


Func ia
DUMP ('c1'
[,return_format
[,start_position
[,length]]])

EMPTY_
[B|C]LOB()

BFILENAME
('director',
'nume_fiier')

GREATEST (expr
[,expr] ...)

Rolul func iei


Returneaz o valoare de tip
VARCHAR2 coninnd codul
tipului de date, lungimea n
baii i reprezentarea
intern a expresiei expr
return_format este codul
sistemului de numeraie n
care este reprezentat
valoarea returnat de
funcie pentru irul 'c1';
Dac se furnizeaz ca o
valoare egal cu codul
sistemului de numeraie +
1000 se returneaz i
numele sistemului de
numeraie.
start_position determin
poziia din irul 'c1' de unde
s nceap DUMP-u
length este lungimea
DUMP-ului.
Returneaz un pointer sau
locator care poate fi folosit
pentru iniializare unei
variabile de tip LOB, ntr-un
INSERT, ntr-un UPDATE
pentru iniializarea unei
coloane de tip LOB sau ca
atribut EMPTY, care
nseamn c LOB-ul a fost
iniializat dar nu a fost
populat cu date.
Returneaz un pointer sau
locator asociat cu un LOB
de tipul unui fiier binar de
pe server.
director este numele
directorului unde se afl
fiierul LOB de tip binar.
nume_fiier este numele
fiierului.
Returneaz valoarea cea
mai mare dint-o list de
valori.

Exemple
SELECT DUMP('abc', 1016)
FROM DUAL;
DUMP('ABC',1016)
----------------------------------Typ=96
Len=3 CharacterSet=WE8DEC:
61,62,63
SELECT DUMP(nume, 8, 3, 2)
"OCTAL"
FROM tab1
WHERE nume = 'SCOTT';
OCTAL
---------------------------Type=1 Len=5: 117,124 Sistemele
de numeraie sunt: 8 = sistemul
octal; 10 = sistemul zecimal; 16 =
sistemul hexazecimal; 17 =
rezultatul este returnat sub forma
de caractere singulare.
INSERT INTO lob_tab1
VALUES (EMPTY_BLOB());
UPDATE lob_tab1
SET clob_col = EMPTY_BLOB();

INSERT INTO tab1 VALUES


(BFILENAME('lob_dir1',foto1.gif'))
;

SELECT GREATEST ('HARRY',


'HARRIOT', 'HAROLD') "Mare"
FROM DUAL;
Mare
-----

LEAST (expr
[,expr] ...)

Returneaz valoarea cea


mai mic dint-o list de
valori.

NVL (expr1, expr2)

Dac expr1 este NULL


returneaz expresia expr2,
iar dac expr1 nu este
NULL returneaz expr1.
Argumentele expr1 i expr2
pot avea orice tip de date.
Dac sunt de tipuri diferite
Oracle convertete expr2 la
tipul expr1 nainte de a
executa comparaiile.
Valoarea returnat este
totdeauna de tipul expr1,
execpie fcnd situaia
cnd expr1 este de tip
caracter, caz n care
rezultatul este VARCHAR2.
Returnez un ntreg care
identific n mod unic
utilizatorul curent.
Returneaz identificatorul
utilizatorului curent n
format VARCHAR2.

UID

USER

USERENV (option)

Returneaz informaii
despre sesiune curent.

VSIZE(expr)

Returneaz lungimea n baii


a expresiei expr.

HARRY
SELECT
LEAST('HARRY','HARRIOT','HAR
OLD') "Mic"
FROM DUAL;
Mic
-----HAROLD
SELECT nume,
NVL(TO_CHAR(comision), 'NOT
APPLICABLE') "COMISION"
FROM tab1
WHERE codepart = 30;
NUME COMISION
---------- -----------------ALLEN 300
WARD
500
MARTIN 1400
TURNER 0
JAMES NOT APPLICABLE

SELECT USER, UID


FROM DUAL;
USER
UID
---------------------------SCOTT
19
SELECT USERENV('LANGUAGE')
"Limbajul"
FROM DUAL;
Limbajul
----------------------------------AMERICAN_AMERICA.WE8DEC
SELECT nume, VSIZE (nume)
"BYTES"
FROM tab1
WHERE codepart = 10;
NUME
BYTES
---------------------------CLARK
5
KING
4
MILLER
6

B.Funciile cu mai multe randuri (de grup)


Furnizeaz un rezultat bazat pe prelucrarea mai multor rnduri.
Toate func iile de grup, mai pu in COUNT(*) ignor valorile NULL.
Majoritatea func iilor de grup accept op iunile:DISTINCT
(determin luarea n calcul numai a valorilor distincte ale rndurilor din
cadrul grupului) i ALL ( determin luarea n calcul a tuturor valorilor
grupului de rnduri).
Func iile de grup sunt prezentate n tabelul 3.9.
Tabelul 3.9 Func iile de grup
Func ia
AVG([DISTINCT|ALL] n)

Semnifica ia
Returnez media celor n
valori

COUNT ({* |
[DISTINCT|ALL] expr})

Returneaz toate
rndurile cererii. Dac
avem argumentul = * se
returneaz toate
rndurile indiferent de
valoarea lor (NULL sau
NOT NULL)

MAX([DISTINCT|ALL]
expr)

MIN([DISTINCT|ALL]
expr)

Returneaz maximul din


expresia expr.

Exemple
SELECT AVG(salariu) "Medie"
FROM tab1;
Media
---------2077343.21429
SELECT COUNT(*) "Total"
FROM tab1;
Total
---------18
SELECT COUNT(job) "Count"
FROM tab1;
Count
---------14
SELECT COUNT(DISTINCT
job) "Jobs"
FROM emp;
Jobs
---------5
SELECT MAX(salariu)
"Maximum"
FROM tab1;
Maximum
---------5000
SELECT MIN(data1) "Minim"
FROM tab1;
Minimum

--------17-DEC-80
SELECT SUM(salariu) "Total"
FROM tab1;
Total
---------29081

SUM([DISTINCT|ALL] n)

Utilizatorii pot s-i scrie propriile func ii n PL/SQL pentru a


executa activit i neacoperite de ctre func iile SQL. Aceste func ii pot fi
folosite n comenzile SQL la fel ca i cele standard.
De exemplu, func iile utilizator pot fi folosite n: lista de selec ie a comenzii
SELECT; condi ia din clauza WHERE; clauzele CONNECT BY, START
WITH, ORDER BY I GROUP BY ; clauza VALUES a comenzii
INSERT; clauza SET a comenzii UPDATE.
Func iile utilizator nu pot fi folosite n clauzele CONSTRAINT sau
DEFAULT ale comenzilor C REATE TABLE sau ALTER TABLE i nici
pentru actualizarea bazei de date. n func iile utilizator nu este permis
utilizarea parametrilor OUT sau IN OUT.
4. EXPRESII SQL
Expresia este o combina ie de unul sau mai mul i operatori,
operanzi (variabile, literali, coloane, func ii SQL) care se evalueaz la o
singur valoare.
Operatorii utiliza i n comenzile SQL sunt: operatori SQL*PLUS;
operatori SQL; operatori aritmetici; operatori logici; operatori specifici n
expresiile de cereri. Ei sunt prezenta i n Anexa 2, n ordinea descresctoare
a priorit ii, cei de aceeai importan fiind grupa i ntre perechi de linii
orizontale. Operatorii sunt evalua i de la stnga spre dreapta.
O expresie are n general acelai tip de date ca i componentele sale.
Expresiile sunt folosite pentru construirea instruc iunilor SQL i a unor liste
de expresii.
A. Exist cinci forme de furnizarea a expresiilor pentru construirea
instruciunilor SQL.
1) Forma I este format din coloan, pseudocoloan, constant,
secven sau NULL i are sintaxa:
nume_schem.tabel | vedere. coloan | pseudocoloan | ROWLABEL
sau
text | numr | nume_secven | nume secven. CURRVAL | NEXTVAL
| NULL

Pentru nume_schem se poate folosi pe lng numele schemei


utilizatorului i valoarea "PUBLIC", care calific sinonimele publice pentru
o tabel sau o vedere, calificare care este suportat doar n instruc iunile
SQL pentru manipularea datelor de tip (DDL), nu i n cele de definire a
datelor de tip DDL.
Pseudocoloan poate fi doar LEVEL, ROWID sau ROWNUM.
Exemple:
Tab1.numecol_1
'acesta este un ir de caractere'
10
secventa1.CURRVAL
2) Forma II este folosit pentru definirea unei variabile gazd (host
variable) cu sau fr indicator de variabil. Expresiile din aceast form se
vor folosi doar n instruc iunile SQL incluse n limbajele de programere
gazd sau n instruc iunile prelucrate de programele OCI(Oracle Call
Interface). Sintaxa este de forma:
: variabil_gazd INDICATOR :variabil_indicator
Exemple:
: nume_angajat INDICATOR :indicator_var_nume_angajat
:nume_persoan
3) Forma III este folosit pentru apelul func iilor cu un singur rnd i are
sintaxa:
funcie (DISTINCT | ALL expresie1, expresie2, )
Exemple :
LENGTH('BLAKE')
ROUND(1234.567*43)
SYSDATE
4) Forma IV este folosit pentru apelul func iilor de utilizator i are sintaxa:
nume_schem . nume_pachet. nume_funcie
Exemple:
aria_cercului(raza)
calcul_rate(nume_angajat)

5) Forma V este o combina ie de mai multe expresii i are sintaxa:


( expresie ) | + | - | PRIOR expresie | expresie1 * | / | - | || expresie2
Exemple:
('IONESCU' || ' PETRE')
LENGTH('BUCURESTI') * 57
SQRT(144) + 72
func ie_utilizator(TO_CHAR(sysdate,'DD-MMM-YY')
Expresiile pentru decodificarea unor valori folosesc sintaxa special
de tip DECODE de forma:
DECODE ( expr, val1, rezultat1, val2, rezultat2, . , valoare_asumat)
expr va fi evaluat i apoi valoarea rezultat va fi comparat cu
fiecarea dintre valorile val1, val2, . . Dac valoarea expresiei este egal cu
una din valorile de compara ie se va furniza valoarea rezultat (rezultat1,
rezultat2, ) care corespunde valorii de compara ie. Dac valoarea
expresiei expr1 nu este egal cu nici una din valorule de compara ie se
furnizeaz valoarea valoare_asumat. Dac valoarea asumat este omis
atunci se furnizeaz valoarea NULL.
Exemplu:

DECODE (cod_func ie,10, 'programator',


20, 'cercettor',
30, 'vnztor',
40, 'operatorr',
'lips_func ie')
Exemplul de mai sus decodific valoarea expresiei cod_funcie.
Astfel dac valoarea expresiei cod_funcie = 10 se furnizeaz func ia
programator, dac este = 20 se furnizeaz func ia cercettor i aa mai
departe. n caz c expresia cod_func ie are a valoare care nu este egal cu
nici una din valorile 10, 20, 30 sau 40 se furnizeaz ca rezultat valoarea
lips_funcie.
B. O list de expresii este o serie de expresii separate ntre ele prin virgul
i nchis ntre paranteze rotunde i poate con ine pn la maximum 1000 de
expresii.

Exemplu:
(10, 20, 40)
('SCOTT', 'BLAKE', 'TAYLOR')
(LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69)

5. CONDI IILE
Condiia este o combina ie de una sau mai multe expresii i
operatori logici evaluat cu una din valorile TRUE, FALSE sau
UNKNOWN. Condi iile se pot folosi n clauza WHERE a instruc iunilor
SQL DELETE, SELECT i UPDATE sau ntr-una din clauzele WHERE,
START WITH, CONNECT BY sau HAVING ale instruc iunii SELECT.
Exemple:
1) Expresia 1=1 este evaluat ca TRUE
2) Expresia NVL(sal, 0) + NVL(comm, 0) > 2500 adun valoarea
sal cu comm i evalueaz rezultatul dac este >= cu 2500000. Dac sal sau
comm sunt NULL se vor nlocui cu valoarea zero.
Condi iile au opt forme de prezentare.
Forma I este folosit pentru compararea unei expresii cu alt
expresie sau cu o subcerere i are sintaxa:
expresie1 = | != | <> | > | < | >= | <= expresi2 | (subcerere)
sau
list_de_expresii = | != | <> (subcerere)
Forma II este folosit pentru compararea unei expresii sau a unei
liste de expresii cu unul sau to i membrii unei liste de xepresii sau ai unei
subcereri i are sintaxa:
expresie1 = | != | <> | > | < | >= | <= ANY | SOME | ALL
list_de_expresii | (subcerere)
sau
list_de_exp = | != | <> ANY | SOME | ALL (list_expr1,
list_expr2, ) | (subcerere1,
subcerere2, . )
Forma III este folosit pentru cutarea unei expresii sau a unei liste
de expresii dac figureaz ntr-o list de expresii sau ntr-o subcerere i are
sintaxa:
expresie1 NOT IN list_de_expresii | (subcerere)

sau
list_de_exp NOT IN ( list_expr1, list_expr2, ) |
(subcerere1, subcerere2, . )
Forma IV este folosit pentru testarea existen ei sau inexisten ei
expresiei ntre dou limite i are sintaxa:
expresie1 NOT BETWEEN expr2 AND expr3
Forma V este folosit pentru testarea valorii NULL i are sintaxa:
expresie1 IS NOT NULL
Forma VI este folosit pentru testarea existen ei unui rnd nt-o
subcerere i are sintaxa:
EXISTS ( subcerere )
Forma VII este folosit pentru testarea egalit ii unei ir de caractere
cu un format anume, cu un alt ir de caracter i are sintaxa:
ir_ caracter1 NOT LIKE ir_cacrater2 ESCAPE
'caracter_de_schimbare'
Forma VIII este folosit pentru specificarea unei combina ii de mai
multe condi ii i poate avea sintaxele:
NOT condiie
sau
condiie1 NOT AND | OR condiie2
6. DESCHIDEREA I NCHIDEREA UNEI SESIUNI DE LUCRU
SQL*PLUS
Pentru a avea acces la componentele unei baze de date (tabele, viziuni, clustere etc.), utilizatorul trebuie mai nti s se conecteze la ea. La
sfritul sau n timpul unei sesiuni SQL exist posibilitatea deconectrii de
la baza de date. O prim conectare se face atunci cnd se ncepe lucrul cu
SQL*Plus. Efectul comenzii sau utilizrii meniului sistem l constituie
deschiderea unei sesiuni de lucru sub SQL*Plus.
Comanda are urmtoarele forme sintactice:
SQLPLUS [nume-utilizator[/parol]
[@nume-baz-de-date]
[@nume-fiier]

[-SILENT]
SQLPLUS /NOLOG [-SILENT]
SQLPLUS -?
unde:
nume-utilizator i parol: sunt numele i parola unui utilizator cu drept de
acces la baza de date.
@nume-baz-de-date: este numele unei baze de date cu care se lucreaz n
re ea (este alt nume dect cel al bazei de date implicite, de pe calculatorul la
care se lucreaz).
@nume-fiier: reprezint numele unui fiier de comenzi SQL care va fi fi
rulat de SQL*Plus.
SILENT: are ca efect inhibarea facilit ii de afiare a tuturor informa iilor i
mesajelor furnizate de SQL*Plus
/NOLOG: lanseaz n execu ie SQL*Plus dar nu face conectarea la o baz
de date.
-?: are ca efect afiarea versiunii curente a componentei SQL*Plus, dup
care returneaz controlul sistemului de operare
Dac n linia de comand se specific parola i @nume-baz-dedate atunci ntre ele nu trebuie s existe spa iu. Parola sau @nume-baz-dedate vor fi separate printr-un spa iu de @nume-fiier.
Conectarea utilizatorului la o baz de date
Dac n timpul unei sesiuni de lucru SQL*PLUS se dorete conectarea la o alt baz de date dect cea deschis ini ial se poate folosi comanda
CONNECT.
Sintaxa acestei comenzi este:
CONN[ECT] [nume-utilizator[/parol]]
[@nume-baz-de-date];
unde:
nume-utilizator i parol: sunt numele unui utilizator cu drepturi de acces la
baza de date i parola unui astfel de utilizator. Chiar dac nu se specific
parola (n linia de comand este op ional), ea este cerut de sistem printrun mesaj explicit. Parola introdus la mesajul sistemului va fi invizibil.
@nume-baz-de-date: se specific n cazul lucrului n re ea, cnd se dorete
conectarea la o alt baz de date dect cea aflat pe calculatorul la care se
lucreaz.

De remarcat faptul c n timpul unei sesiuni de lucru cu SQL*Plus se poate


realiza conectarea la o baz de date, fr a mai fi necesar nchiderea
sesiunii.
Furnizarea parametrilor nume-utilizator i parol asigur protec ia bazei de
date mpotriva accesului neautorizat.
Deconectarea utilizatorului de la baza de date
Deconectarea utilizatorului de la o baz de date se realizeaz prin
comanda DISCONNECT.
Sintaxa acestei comenzi este:
DISC[ONNECT];
Comanda are ca efect deconectarea de la baza de date curent, fr a
nchide sesiunea de lucru SQL*Plus.
nchiderea sesiunii de lucru SQL*Plus
nchiderea sesiunii de lucru SQL*PLUS i predarea controlului
sistemului de operare al calculatorului gazd se realizeaz cu una din
comenzile: QUIT, EXIT sau ^Z.
Sintaxa acestor comenzi este:
QUIT;
EXIT:
^Z;
7. ELEMENTE DE LUCRU CU SQL*PLUS
A. ncrcarea i executarea comenzilor
n exemplele ce se vor prezenta, referitor la utilizarea comenzilor
SQL*Plus, se va folosi tabela Oracle pers100 cu structura de mai jos:
CREATE TABLE pers100
(CODPERS NUMBER(5),
NUME VARCHAR2(30),
PRENUME VARCHAR2(30),
ZINAST NUMBER(2),
LUNAST NUMBER(2),
ANAST NUMBER(4),
STRADA VARCHAR2(40),
NRSTR NUMBER(2),
SECTOR NUMBER(1),
LOCNAST VARCHAR(20),
FUNCTIA VARCHAR(15),
SALARIU NUMBER(8),
NUMAR_ACTIUNI NUMBER (6))

PCTFREE 5 PCTUSED 75;

Comenzile se pot introduce pe una sau mai multe linii.


Exemplu:
Comanda
sql> select * from pers100;
este echivalent cu:
sql> select
2 * from
3 pers100;
Introducerea comentariilor se poate realiza folosind:
Comanda REMARK din SQL*Plus
Exemplu:
REMARK comentariu
Nu se vor introduce comentarii intre liniile aceleai comenzi SQL.
Delimitatorii de comentariu din SQL /* */
Exemplu:
/* comentariu */
comentariile tip PL/SQL prefixate cu - -
Exemplu:
-- comentariu
Terminarea unei comenzi SQL se face cu: punct i virgul (;), slash
(/) sau blank. Primele dou forme cer SQL*Plus s execute imediat
comanda, a treia form nu. Comanda curent poate fi rulat sau rerulat
introducnd comenzile RUN sau slash(/).
Se pot introduce i blocuri PL/SQL care s fie executate. La sfritul
blocurilor PL/SQL se vor insera dou linii una con innd un punct, iar
cealalt un slash(/).
Exemplu:
declare
x number := 100;
begin
for i in 1 .. 10 loop
insert into pers100 values
(10, ionel, marin, 10,7,1970, ion manolescu,2, 6, suceava);
end loop;
end;
/

Zona (aria) n care SQL*Plus memoreaz comenzile curente se


numete buffer-ul SQL.
Pe lng comenzile SQL i PL/SQL se pot introduce i comenzi
SQL*Plus, care pot fi abreviate i la o liter. Comenzile foarte lungi pot fi
ntrerupte i continuate pe linia urmtoare. ntreruperea se marcheaz cu -.
Oracle automat afieaz semnul > (prompter) dup care se introduce restul
comenzii.
Exemplu:
sql> select * from >pers100;
Controlul listrii rapoartelor lungi se poate face utiliznd tasata Cancel sau
setnd variabila PAUSE pe ON.
Exemplu:
set pause text de atenionare
set pause on
Aceast setare va determina ca sistemul s opreasc afiarea la
fiecare pagin i s afieze textul text de aten ionare. Cu SET PAUSE OFF
se revine la starea anterioar.
B. Editarea comenzilor SQL*Plus
Editarea n mod linie se realizeaz prin comenzile din tabelul 3.10.
Tabelul 3.10. Comenzile de editare a comenzilor SQL*Plus
Comanda
APPEND text
CHANGE /old/new/
CHANGE /text
CLEAR BUFFER
DEL
INPUT
INPUT text
LIST
LIST n
LIST *
LIST LAST
LIST m n

Abreviaia
A text
C /old/new/
C/text
CL BUFF
Fr abreviaie
I
I text
L
L n sau n
L*
L LAST
Lmn

Funcia
Adaug text la sfritul unei linii
Schimb un text cu altul
terge textul unei linii
Cur bufferul
terge o linie
Adaug una sau mai multe linii
Adaug o linie format dintr-un text
Listeaz toate liniile din buffer
Listeaz linia n
Listeaz linia curent
Listeaz ultima linie
Listeaz liniile de la m la n

Editarea comenzilor cu editorul sistemului se realizeaz cu comanda


EDIT. Apare fereastra Editorului, n care se vor tasta instruc iunile SQL
dorite. Se salveaz fiierul cu nume.SQL i se execut cu comanda @nume.
C. Crearea, regsirea, rularea i modificaea fiierelor de comenzi.
Crearea fiierelor de comenzi se pot realiza prin:

Salvarea con inutului bufferului cu comanda SAVE.


Exemplu:
SAVE nume_ fiier.SQL
nainte de salvare se va lista bufferul cu comanda LIST pentru a verifica
dac instruc iunile ce vor fi salvate sunt corecte.
Utilizarea comenzii INPUT n corela ie cu SAVE
Exemplu:
sql> clear buffer
sql> input
select * from pers100
sql> save comand1.sql
sql> @comand1
Utilizarea editorului de sistem
SQL> EDIT nume_fiier
Regsirea (citirea) fiierelor de comenzi se face cu comanda GET.
Exemplu:
SQL> GET edit3
SELECT * FROM PERS100;
Rularea fiierelor de comenzi se execut folosind comenzile:
START nume_fiier
@nume_fiier
Dac avem mai multe fiiere de comenzi pe care vrem s le
executm secven ial, vom creea un fiier de comenzi con innd comenzile
START corespunztoare, dup care pentru rulare vom activa acest ultim
fiier.
Exemplu:
n fiierul FILE2 introducem comenzile:
START fi1
START fi2
START fi3
Apoi cu una din comenzile START FILE2 sau @FILE2 vom activa
aceste comenzi.
Modificarea fiierelor de comenzi se poate realiza folosind comanda
EDIT nume_fiier sau comanda GET urmat de SAVE nume_fiier
REPLACE.
D. Faciliti pentru setarea fiierelor de comenzi
Urmtoarele facilit i fac posibil setarea unor fiiere de comenzi
care s permit utilizatorilor s-i introduc propriile valori pentru controlul

execu iei comenzilor: definirea variabilelor de utilizator; tergerea


variabilelor de utilizator; substituirea valorilor n comenzi; folosirea
comenzii START pentru furnizarea de valori n comenzi; crearea unor
prompteri pentru introducerea valorilor.
1) Definirea variabilelor de utilizator se face explicit cu comanda
DEFINE sau implicit prin utilizarea prefixrii variabilelor cu dou &.
Definirea, listarea i tergerea unei variabile utilizator n mod
explicit se fac cu comenzile:
DEFINE nume_variabil = valoare variabila
Exemplu:
SQL > DEFINE variabila1 = mihai
2) tergerea variabilelor de utilizator se realizeaz prin utilizarea
comenzii
UNDEFINE nume_varaiabil.
Exemplu:
SQL> UNDEFINE varaiabila1
3) Substituirea variabilelor este o tehnic prin care putem creea
proceduri de lucru astfel nct s folosim acelai script (grup de instruc iuni)
pentru efectuarea unor func ii diferite pornind de la structura procedurii.
Variabilele ce se substituie pot exista la momentul substituirii dac anterior
au fost create explicit cu comanda DEFINE sau implicit prin prefixare cu &.
Exist patru modalit i de substituire a variabilelor: substituirea variabilelor
prefixate cu un &; substituirea variabilelor prefixate cu dou &;
substituirea variabilelor de tip &n cu ajutorul comenzii START; substituirea
variabilelor folosind comenzile PROMPT, ACCEPT i PAUSE
a) Substituirea variabilelor prefixate cu un &. Vom crea o
procedur generalizat pentru calculul unor subgrupe statistice pe o coloan
numeric.
Exemplu:
S se execute selec ia din baza de date a valorilor salariilor
apar innd aceleai func ii, iar din aceste grupe afiarea celor care sunt cele
mai mici din grup, ordonate descresctor.
select func ia , min(salariu) minimum
from pers100
group by func ia
order by min(salariu) desc;
n fraza SELECT de mai sus funcia, min, salariu i desc pot fi
definite ca variabile, ceea ce va permite ca s putem utiliza pentru grupare i
alt coloan, pentru calcul i valorile max sau sum, iar pentru ordonare vom
putea folosi i valoarea ascendent. Pentru executarea acestei comenzi vom
crea fiierul de comenzi CALC&.SQL, cu structura de mai jos:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --*/
/* &v1_col_grup = nume coloan din tabel dup valorile creia se
va face gruparea
/* &v2_tip_calc = tipul calculului: min, max, sum pentru un anumit
grup de valori numerice
/* &v3_col_calc = numele coloanei de tip numeric dup care se va
face calculul
/*&v4_nume_col_calculat = numele coloanei, n list, pe care se
vor afia valorile calculate
/* &v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau
asc(ascending)
SELECT &v1_col_grup,
&v2_tip_calc(&v3_col_calc),
&v4_nume_col_calculat
FROM pers100
GROUP BY &v1_col_grup
ORDER BY &v2_tip_calc(&v3_col_calc,) &v5_tip_sort;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - --*/
Dup apelul fiierului cu comanda @calc& sistemul ne va cere
succesiv s furnizm valorile dorite pentru variabilele definite astfel:
Enter value for v1_col_grup: nume
Enter value for v2_tip_calc: min
Enter value for v3_col_calc: salariu
Enter value for v4_nume_col_calculat: MINIMUM
Enter value for v1_col_grup: nume
Enter value for v2_tip_calc: min
Enter value for v3_col_calc: salariu
Enter value for v5_tip_sort: desc
Iar rezultatul dup executare comenzii va arta ca mai jos:
NUME
MINIMUM
------------------------------ --------ionescu
3500000
petrescu
2500000
mihai
1500000
b) Substituirea variabilelor prefixate cu dou
&. Pentru
exemplificare vom crea, pornind de la fiierul de comenzi CALC&.SQL,
fiierul de comenzi CALC&&.SQL n care variabilele vor fi prefixate cu
doua caractere &, ca mai jos:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - -*/
/* &&v1_col_grup = nume coloan din tabel dup valorile creia
se va face gruparea
/* &&v2_tip_calc = tipul calculului: min, max, sum pentru un
anumit grup de valori numerice
/* &&v3_col_calc = numele coloanei de tip numeric dup care se
va face calculul
/*&&v4_nume_col_calculat = numele coloanei, n list, pe care se
vor afia valorile calculate
/* &&v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau
asc(ascending) */
SELECT &&v1_col_grup,
&&v2_tip_calc(&&v3_col_calc),
&&v4_nume_col_calculat
FROM pers100
GROUP BY &&v1_col_grup
ORDER BY &&v2_tip_calc(&&v3_col_calc), &&v5_tip_sort
/* - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - - - -*/
La momentul executrii fiierului de comenzi CALC&&.Sql
sistemul va cere s introducem valorile dorite pentru variabilele definite la
fel ca la apelul precedent cu deosebirea c valorile ce le vom furniza vor fi
memorate de fiecare dat astfel c indiferent de cte ori apare o variabil
pentru ea se va furniza valoarea o singur dat. Orice execu ie ulterioar a
unui fiier de comenzi n care apare una din variabilele create anterior
(definite implicit ca variabile utilizator) se vor folosi aceste valori. Execu ia
acestui fiier de comenzi va produce acelai rezultat ca i execu ia fiierului
CALC&.SQL. Rulnd comanda DEFINE vom gsi n sistem pe lng alte
variabile utilizator i variabilele create prin execu ia fiierului
CALC&&.SQL.
Exemplu:
SQL> DEFINE
DEFINE _EDITOR
= Notepad (CHAR)
DEFINE _RC
= 1 (CHAR)
DEFINE V1_COL_GRUP = nume (CHAR)
DEFINE V2_TIP_CALC = min (CHAR)
DEFINE V3_COL_CALC = salariu (CHAR)
DEFINE V4_NUME_COL_CALCULAT = minimum (CHAR)
DEFINE V5_TIP_SORT = desc (CHAR)
Dac vom dori rularea procedurii create anterior dar dnd variabilelor alte
valori, va trebui nti s tergem aceste variabile cu comanda UNDEFINE.

c) Substituirea variabilelor de tip &n cu ajutorul comenzii START.


Pentru a nu mai furniza interactiv valori pentru variabilele utilizator la
momentul execu iei, le putem defini pe acestea sub forma &n , n care n ia
valori ncepnd cu 1, iar valorile lor vor fi furnizate ca parametrii de apel
ai instruciunii START.
Astfel vom crea fiierul de comenzi CALCSTART.SQL de forma:
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - --/* &1 = nume coloan din tabelei dup care se face gruparea
/* &2 = tipul calculului: min, max, sum pentru un anumit grup
/* &3 = numele coloanei de tip numeric dup care se va face
calculul
/* &4 = numele coloanei pe care se vor afia valorile calculate
/* &5 = tipul ordonrii(sortrii), descending sau ascending*/
select &1, &2(&3) &4
from pers100
group by &1
order by &2(&3) &5;
/* - - - - - - - - - - - - -- - - -- -- - - - - - - - - - - - -- - -*/
Pentru execu ie vom apela fiierul de comenzi CALCSTART.SQL
cu comanda START n care vom furniza ca parametrii valorile dorite pentru
cele 5 variabile de tip &n definite.
Exemplu:
SQL> START CALCSTART nume min salariu MINIMUM desc
Aceast execu ie va produce acelai rezultat ca i execu iile fiierelor
de comenzi CALC&.SQL i CALC&&.SQL.
Deosebirea este c nu se mai creeaz variabilele utilizator astfel c
putem executa n mod generalizat procedura CALCSTART dnd
variabilelor orice alte valori logic acceptabile.
d) Crearea unor modaliti interactive de comunicare cu
calculatorul se realizeaz cu comenzile PROMPT, ACCEPT i PAUSE, care
sunt de fapt opera ii de intrare/ieire standard. PROMPT permite trimiterea
(scrierea) de mesaje la utilizator. ACCEPT permite preluarea (citirea)
rspunsurilor de la utilizator. PAUSE permite introducerea unui moment de
pauz pentru ca utilizatorul s citeasc mesajul i s-i formuleze rspunsul.
Aceste comenzi se folosesc n conjunc ie cu INPUT i SAVE, pentru
a introduce valorile dorite cu comenzile de mai sus, i respectiv pentru a le
salva ntr-un fiier de comenzi, care s fie ulterior executat.
Exemplu:
SQL> Clear buffer
SQL> INPUT

PROMPT Introduce i un titlu format din maxim 30 caractere


PAUSE urmeaz introducerea titlului, apsa i RETURN
ACCEPT TITLUL_MEU PROMPT TITLUL:
PAUSE
urmeaz comanda de centrare a titlului, apsa i
RETURN
TTITLE CENTER TITLUL_MEU SKIP 2
PAUSE urmeaz selectarea din baza de date, apsa i RETURN
SELECT codpers, nume , prenume from pers100;
SQL> SAVE cmdprompt
SQL> @cmdprompt
Rezultatul este:
Introduce i un titlu format din maxim 30 caractere
urmeaz introducerea titlului, apsa i RETURN
titlu:-----SELECTARE DIN BAZA DE DATE codpers, nume i prenume ---urmeaz comanda de centrare a titlului, apsa i RETURN
urmeaz selectarea din baza de date, apsa i RETURN
-----SELECTARE DIN BAZA DE DATE codpers, nume i prenume ---CODPERS NUME
PRENUME
-------------------------------------- ---------1
petrescu
ion
2
petrescu
florea
3
ionescu
ion
4
ionescu
dumitru
5
mihai
florea
6
mihai
ion
6 rows selected.

e) Utilizarea comenzilor PROMPT i ACCEPT n conjuncie cu


substituirea variabilelor
n exemplele anterioare cnd s-au utilizat fiierele de comenzi
CALC&.SQL i CALC&&.SQL s-a vzut c sistemul pentru fiecare
variabil a creat cte un prompter de forma:
Enter value for nume_variabil :
Ca atare se poate nlocui prompter-ul sistemului cu propriu prompter
utiliznd pentru aceasta comenzile PROMPT i ACCEPT n fiierul de
comenzi unde vrem s introducem o variabil pentru care vom construi alt
prompter dect cel de sistem.
Exemplu:
SQL> Clear buffer
SQL> INPUT
PROMPT Introduce i o valoare numeric pentru salariu
PROMPT De exemplu: 1500000, 2500000
ACCEPT var_salariu NUMBER PROMPT valoare salariu:

SELECT codpers, nume, salariu from pers100


WHERE salariu = &var_salariu
SQL> save cmd2prompt
SQL> @cmd2prompt
Rezultatul este:
Introduce i o valoare numeric pentru salariu
De exemplu: 1500000, 2500000
valoare salariu: aaaa
aaaa is not a valid number
valoare salariu: 3500000
old
1: SELECT codpers, nume, salariu from pers100 WHERE salariu =
&var_salariu
new
1: SELECT codpers, nume, salariu from pers100 WHERE salariu =
3500000
CODPERS NUME
SALARIU
-------------------------------------- --------4
ionescu
3500000

8. FORMATAREA REZULTATELOR
Limbajul SQL*PLUS permite proiectarea i formatarea diverselor
situa ii de ieire. Aceste opera ii sunt posibile prin utilizarea unor comenzi
pentru tratarea ntreruperilor, comenzi pentru definirea titlurilor, definirea
coloanelor, realizarea calculelor i stabilirea diverselor op iuni pentru
pozi ionarea unor arii de lucru pe ecran.
A. Tratarea ntreruperilor
ntreruperea este un eveniment care se produce n timpul execu iei
unei comenzi SELECT, cum ar fi, de exemplu, apari ia sfritului de pagin
sau schimbarea valorii unei expresii.
Pentru a specifica evenimentele care determin o ntrerupere i
ac iunea corespunztoare SQL care se execut, se utilizeaz comanda
BREAK. Ea poate specifica mai multe evenimente care genereaz o
ntrerupere. Evenimentele sunt re inute ntr-o ordine numit "ierarhie de
ntrerupere". La un moment dat,"se poate executa doar o singur comand
BREAK.
Comanda BREAK are urmtoarele forme sintactice:
BRE[AK] ON {expr | ROW | PAG[E] | REPORT}
[SKI[P] n | [SKIP]PAGE]
[NODUP[LICATES] | DUP[LICATES]];
BRE[AK];

unde:
ON expr determin o ntrerupere cnd se schimb valoarea expresiei expr;
expr este fie o expresie care implic una sau mai multe coloane dintr-o
tabel, fie o etichet ataat unei coloane declarat in comanda SELECT
sau COLUMN.
Dac ON expr apare de mai multe ori n comand, atunci expresiile respect
"ierarhia de ntrerupere", aceasta fiind chiar ordinea n care sunt specificate
expresiile. Cnd se folosete ON expr, trebuie utilizat i clauza ORDER
BY, pentru a ordona rndurile din "ierarhia de ntrerupere*. Ordinea de
apari ie a expresiilor expr n comanda BREAK ON trebuie s rte aceeai cu
cea prezent n SELECT...GRDER BY:
ON ROW determin o ntrerupere cnd se selecteaz un rnd cu SELECT.
Aceast ntrerupere este re inut la sfritul ierarhiei de
ntrerupere;
ON PAGE determin o ntrerupere la sfritul fiecrei pagini;
ON REPORT determin o ntrerupere la sfritul raportului sau cererii,
ntrerupere care este re inut la nceputul ierarhiei de ntrerupere.
SKIP determin saltul peste n linii, nainte de a se tipri linia
asociat ntreruperii respective.
PAGE sau SKIP PAGE determin saltul la o pagin nou nainte de a tipri
linia asociat respectivei ntreruperi.
NODUPLICATES determin tiprirea de spa ii cnd valorile de JJS coloana
de ntrerupere sunt identice. DUPLICATES determin tiprirea valoarii
coloanei de ntrerupere n fiecare rnd selectat. Valoarea
NODUPLICATES este implicit.
Comanda BREAK fr clauze indic pozi ia ntreruperii curente.
Exemple:
1) S fie definit o ntrerupere generat de schimbarea valorilor coloanei
FUNCT. La apari ia acestui eveniment s fie afiate dou linii vide.
SQL> BREAK ON FUNCT SKIP 2;
SQL> SELECT MARCA,NUME,CODD,
2 SALA, VENS
3 FROM SALARIA I
4 ORDER BY FUNCT;
MARCANUME
FUNCT
7000
ION ION
DIRECTOR
2550
FRINCU ION SEF DEP
1000
COMAN RADU
2500
VLAD VASILE
4000
PAUL TEFAN
3755
DORU DAN

CODD
100000
160000
130000
160000
160000
130000

SALA
45000
36000
35000
36500
35000
36500

VENS
40000
37000
2500
1500
5600
5500

1111
1680
3700
2553
3760
3770
2554
3759
3500
2650
1222

AVRAM ION VINZATOR


RADU ION
MNU DAN
AILENEI FLORIN
SANDU ION
CARMEN ANA
DARIAN GEO
ALEXE IOAN
DAN ION
VLAD ION
BARBU DAN

100000
130000
160000
120000
130000
130000
120000
160000
160000
120000
120000

21200
20750
27500
25000
25600
26500
26000
25700
24500
25060
20750

1000
3000
2500
400
0
2000
350
3500
2000

2) S fie definit o ntrerupere la apari ia unei schimbri a valorii coloanei


ODS din tabela SALARIA I. n momentul realizrii evenimentului s se
realizeze salt la pagin nou.
SQL> SET PAGESIZE 11
SQL> BREAK ON CODS SKIP PAGE;
SQL> SELECT * FROM SALARIAT
2 ORDER BY CODS;
MARCA NUME
1111
AVRAM ION
2650
VLAP ION
1222
BARBU DAN

FUNCT
VINZATOR
VINZATOR
VINZATOR

CODD
100000
120000
120000

SALA
21200
25060
20750

MARCA NUME
2550
FRINCU ION
3500
DAN ION
1680
RADU ION

FUNCT
SEF DEP
VINZATOR
VINZATOR

CODD SALA
160000 36000
160000 24500
130000 20750

VENS CODS
1000
1000
3500
2000
VENS CODS
37000 2500
350
3000

MARCA NUME FUNCT CODD SALA VENS CODS VENS CODS


2553
AILENEI FLOR VINZATOR
120000 120000 250000 2000
2554
DARIAN GEO VINZATOR
260000 4000
MARCA
NUME FUNCT CODD SALA VENS CODS
7000
ION ION
DIRECTOR
100000 45000 40000 8000

9records selected.
B. Tiprirea titlurilor
Pentru afiarea unui titlu la sfritul sau la nceputul fiecrei pagini
se utilizeaz comanda BTITLE, respectiv TTITLE. Comanda BTITLE are
urmtoarele sintaxe:
BTI[TLE] [COL[UMN] n1 [SKlP [n]] [TAB n] [LEFT | RIGHT |
CENTER] [FORMAT char] [char | var]...;

BTI[TLE] {OFF | ON};


BTI[TLE] text;
BTI[TLE]
unde:
COL[UMN] n determin saltul la coloana n a liniei curente.
Prin SKIP n se determin saltul Ia nceputul liniei curente, de n ori. Dac n
este omis, se sare o singur dat, iar dac n este zero, se realizeaz
ntorcerea ia nceputul liniei curente.
TAB n are a efect saltul a n coloane (prin coloan n elegndu-se nu o
coloan de tabel, ci pozi ia cursorului) nainte dac n este pozitiv sau
napoi dac n este negativ.
Clauzele LEFT, RIGHT, CENTER determin alinierea la stnga, la dreapta
respectiv afiarea centrata a datelor din linia curent. Urmtoarele date sunt
aliniate ca an grup, de la nceputul pn la sfritul comenzii PRIN sau la
urmtorul LEFT, CENTER, RIGHT sau COLUMN. CENTER i RIGHT
folosesc valoarea returnat de comanda SET LINESIZE pentru a calcula
pozi ia urmtorului articol.
FORMAT char specific un model de format pentru articolul de date care
urmeaz; acest format se men ine pn la ntlnirea unei alte clauze
FORMAT sau pn la sfritul comenzii. De re inut c doar un singur model
de format poate fi activ la un moment dat. Dac nici un format potrivit nu
are efect, atunci valorile sunt tiprite n conformitate cu formatul specificat
n SET NUMFORMAT iar dac SET UNFORMAT nu a fost utilizat,
valorile vor fi tiprite cu formatul implicit.
Pentru specificarea titlurilor pot fi folosite constante (char) i
variabile (var), ele fiind pozi ionate i formatate aa cum se specific n
clauzele comenzii.
Existen a unui separator indic nceputul unor linii noi, iar doi
separatori pe acelai rnd introduc o linie vid. Ini ial, caracterul de separare
este."!", ns el poate fi schimbat cu SET HEADSEP.
SQL*PLUS interpreteaz comanda BTITLE h forma nou dac
primul cuvnt dup numeie comenzii este numele unei clauze valide (LEFT,
SKIP, COL etc.).
Clauzele ON i OFF au ca efect apari ia (ON) sau nu (OFF) a
titlului.
BTITLE text afieaz centrat textul specificat.
Comanda BTITLE fr clauze specific titlul curent.
Exemple:

1) S se afieze la sfritul unui raport final cu privire la produsele din


depozitul cu codul 100000, n partea stng irul de caractere "Data:" iar n
partea dreapt "Semntura:".
SQL> SET PAGESIZE 11
SQL> BTITLE LEFT Data: RIGHT Semntura:;
SQL> SELECT FROM PRODUSE
2 WHERE CODD=100000;
CODD
100000
100000
100000
Data:

CODP
D4
A3
A7

DENP
SCAUN
FOTOLIU
MASA

STOC
36
27
23

DATA CRT
UM
10-SEP-05
BUC
15-SEP-05
BUC
05-SEP-05
BUC
Semnatura:

2) S se afieze la sfritul unui raport privind situa ia produselor din


depozitul 100000, ncepnd din coloana 11, irul de caractere
"OBSERVATIT.
SQL> BTITLE COL 11 OBSERVA II;
SQL> SELECT * FROM PRODUSE
2 WHERE CODD-100000;
CODD CODP DENP
100000 166666 PLACAJ 2/2
100000 144444 SCAUN D4
100000 111111 MESE 15/20
100000 122222 FOTOLIU A3
100000 133333 CANAPEA A7
100000 155555 BIROU C6X4
OBSERVA II

STOC DATACRT
100
12-JUL-05
36
12-JUL-05
7
27-JUN-05
12
01-JUL-05
6
18-JUL-05
9
29-JUL-05

UM
MP
BUC
BUC
BUC
BUC
BUC

3) S se afieze centrat, la sfritul unui raport privind produsele din


depozitul cu codul 100000, irul de caractere"Depozitul_MOBILA/100000".
SQL> BTITLE CENTER Depozitul_MOBILA/100000
SQL> SELECT CODD "Cod depozit",
2 DENP "Denumire",
3 CODP "Cod produs",
4 STOC "Stoc",DATACRT "Data",
5 UM
6 FROM PRODUSE
7 WHERE CODD=100000;
Cod dep Denumire

Cod produs

Stoc

Data

UM

100000
100000
100000
100000
100000
100000

PLACAJ 2/2
SCAUN D4
MESE 15/20
FOTOLIU A3
CANAPEA A7
BIROU C6X4

166666
144444
111111
122222
133333
155555

100
36
7
12
6
9

12-JUL-05
12-JUL-05
27-JUN-05
01-JUL-05
18-JUL-05
29-JUL-05

MP
BUC
BUC
BUC
BUC
BUC

Depozitul MOBILA/100000

4) S se afieze specifica iile curente pentru BTITLE. Ultima comand


primit n sistem se prezint astfel:
SQL> BTITLE COL 40 Total RIGHT Semntura;
SQL> BTITLE;
btitle ON and is the following 28 characters: COL 40 Total RIGHT Semntura

Comanda TTITLE determin afiarea unui titlu la nceputul paginii


i are urmtoarele sintaxe:
TTI[TLE] [COL[UMN] n] [SKIP [1 | n] [TAB n]
[LEFT | RIGHT | CENTER]
[FORMAT char] [char | var]
TTI[TLEI text;
TTI[TLE];
Clauzele comenzii TTITLE au aceeai semnifica ie ca la BTITLE.
Comanda TTITLE fr clauze determin afiarea titlului curent.
Exemplu:
S se afieze la nceputul unui raport privind comenzile cu date mai mic de
30 septembrie 2005, urmtoarele iruri de caractere: "SITUA IA
COMENZILOR" i "LA DATA DE 30-SEP-05". Cele dou iruri se vor
afia centrat, pe dou linii.
SQL> SET PAGESIZE 11 SQL> SET LIN 45
SQL> COLUMN NRCOM FORMAT 99999999
SQL> COLUMN NRCOM JUSTIFY CENTER
SQL> COLUMN CODP FORMAT 99999999
SQL> COLUMN CODP JUSTIFY CENTER
SQL> COLUMN VALOARE FORMAT 99999999999
SQL> COLUMN VALOARE JUSTIFY CENTER
SQL> SET SPACE 7
SQL> TTITLE 'SITUA IA COMENZILOR LA
DATA DE 30-SEP-05"
SQL> SELECT
2 NRCOM,CODP,CANT*PRET VALOARE

3 FROM COMENZI
4 WHERE DATAL<='30- SEP-05;
SITUATIA COMENZILOR LA DATA DE 30- SEP-05
NRCOM
211111
255566
166666
27000

CODP
233333
133333
222222
375000

VALOARE
244444
144444
320000
282000

Anularea op iunilor
n vederea anulrii op iunilor se utilizeaz comanda:
CL[EAR] option
Este anulat op iunea specificat prin option, dup cum urmeaz:
BRE[AKS] anuleaz ntreruperea indicat prin comanda BREAK;
BUFF[ER] determin tergerea textului din buffer-ul curent;
COL[UMNS] anuleaz op iunile indicate n comanda COLUMN;
COMP[UTES] anuleaz op iunile indicate prin comanda
COMPUTE;
SCR[EEN] determin tergerea ecranului, iar SQL determin
tergerea buffer-ului SQL;
TIMI[NG] terge toate zonele create cu comanda TIMING.
Exemple:
1) S se anuleze ntreruperile.
SQL> CLEAR BREAKS;
2) S se anuleze defini iile de coloan.
SQL> CLEAR COLUMNS;
Descrierea coloanelor
Pentru specificarea modului de formare a unei coloane i a capului
de coloan ntr-o situa ie, se utilizeaz comanda COLUMN. Sintaxa ei este:
COL[UMN] (col | expr) [ALI[AS] sinonim] CLE[AR] |
DEF[AULT]]
[COLOR
{culoare|
variabila-culoare}]
[FORMAT] format] [HEA[DING] text
[JUS[TIFY] {L[EFT | C[ENTER] | R[IGHT]] [LIKE {expr |
etichet}] [LINEAPP {LINE | MARK | BOTH}]
[NEW_VALUE variabila] [NU[LL] char] [NOPRl[NT] |
PRINT]] [OLD_VALUE variabila]
[ON | OFF]
[PATTERN {numr-de-model | variabila-model}
[WRA[PPED]! WOR[D,... WRAPPED] |
TRU[NCATED]]
...;

unde:
col sau expr au rolul de a identifica coloana sau expresia la care se refer
comanda. Comanda COLUMN trebuie s se refere la o coloan sau la o
expresie utilizat-a n comanda SELECT. Dac comanda COLUMN se refer
la o expresie, aceasta trebuie s fie specificat n acelai mod n care a fost
specificat n SELECT. De exemplu, dac n SELECT expresia este 'A.+B',
nu se poate folosi, n COLUMN, T+A'. Dac sunt selectate din tabele
diferite coloane cu acelai nume, atunci comanda COLUMN se va aplica
tuturor tabelelor ce con in acea coloan.
Clauza ALIAS pune n coresponden numele coloanelor cu sinonimul
specificat.
Clauza CLEAR are ca efect tergerea n totalitate a defini iei coloanei.
Clauza FORMAT specific formatul de apari ie ai coloanei. L imea
implicit a coloanei este chiar l imea coloanei definite n baza de date. Ea
poate fi schimbat cu valoarea n, folosind "FORMAT An". L imea unei
coloane numerice este implicit valoarea data de NUMWIDTH, ea putnd fi
schimbat cu ajutorul clauzei FORMAT.
Clauza HEADING definete capul coloanei, care implicit este col sau expr.
Dac textul din definirea coloanei con ine spa ii sau semne de punctua ie,
acestea trebuie puse ntre ghilimele. Fiecare semn "I" din text are ca efect
nceperea unei linii noi.
Clauza JUSTIFY aliniaz capul coloanei. Implicit, alinierea se face la
dreapta pentru o coloan numeric i la stnga pentru alte tipuri de coloane.
Clauza LIKE determin copierea specifica iilor altei coloane sau expresii
(specifica ii deja definite prin alt comand COLUMN).
Prin folosirea clauzei NEWLINE se trece la o linie nou, nainte de a afia
valorile coloanei.
Clauzele PRINT i NOPRINT au ca efect tiprirea sau nu a coloanei.
Dac se utilizeaz clauza NULL, textul va fi afiat chiar dac con ine o
valoare nul. Valoarea implicit este un ir de blancuri.
Clauzele OFF sau ON determin folosirea, respectiv nefolosirea formatului
specifica iei de ieire pentru o coloan, fr a-i afecta con inutul.
Clauza WRAPPED are ca efect scrierea pe linia urmtoare a caracterelor
care nu au ncput pe prima linie.
Clauza WORD_WRAPPED are efect asemntor cu cel al clauzei
WRAPPED, cu deosebirea c determin scrierea ntregului cuvnt pe linia
urmtoare i nu pe dou rnduri ca la WRAPPED.
Clauza TRUNC determin trunchierea valorii.
Clauza COLOR specific culoarea utilizat pentru afiarea valorilor
coloanei, ntr-o reprezentare liniar sau prin benzi. Variabila CLR n (n=l,60)

se refer la valoarea curent a culorii. Setarea se face prin comanda SET


CLR n.
Clauza LINEAPP stabilete modul de subliniere a coloanei. Utiliznd LINE
dreapta apare continu. Folosind MARK se schi eaz doar puncte, iar
BOTH realizeaz ambele modalit i: linie i puncte.
Clauza PATTERN specific modelul pe care-1 va avea dreptunghiul/banda
ntr-un grafic de tip benzi sau sectorul ntr-un grafic de tip cerc. numr-demodel este cuprins ntre 1 i 16 i reprezint un model. Variabila PAT n,
unde ns[l,30] se refer la pozi ia curent a modelului. Semnifica ia valorilor
din numr-de-model i a valorilor PAT n sunt precizate n documenta ie.
Numrul de comenzi COLUMN folosite indic faptul c se lucreaz
cu diverse coloane sau expresii utilizate n comanda SELECT. Pentru o
coloan sau expresie pot exista mai multe comenzi COLUMN. n cazul n
care mai multe comenzi COLUMN folosesc aceeai clauz pentru aceeai
coloan, se va lua n considerare doar ultima comand.
Comanda COLUMN fr clauze are ca efect tiprirea defini iilor
coloanei curente. Dac aceast comand are doar clauzele col i expr,
efectul ei const n indicarea definirii coloanei existente.
Trebuie precizat c n prima comanda COLUMN, expresia trebuie s
aib aceeai form ca i n SELECT. n caz contrar, SQL*Plus nu va putea
executa comanda COLUMN pentru coloana respectiv.
Exemple:
1) S se defineasc coloana NUME pe o l ime de 25 de caractere iar capul
de coloan s fie scris pe dou rnduri, astfel: NUME PRODUS
SQL> COLUMN NUME FORMAT A25 HEADING 'NUME
PRODUS';
5QL> SELECT DISTINCT(DENP) NUME
2 FROM PRODUSE;
NUME PRODUS
MESE 15/20
FOTOLIU
2 records selected.

2) S se afieze sinonimul SALARIU pentru coloana definit de expresie


aritmetic SALA+VENS. Coloana va fi scris cu formatul $99,999.99.
SQL> COLUMN SALA+VENS ALIAS SALARIU
SQL> COLUMN SALARIU FORMAT $99,999.99
SQL> SELECT SALA+VENS SALARIU,
2 MARCA, NUME
3 FROM SALARIA I;
SALARIU
$22,200.00
$22,750.00

MARCA
1111
1222

NUME
AVRAM ION
BARBU DAN

2 records selected.

3) S se defineasc coloana DENP de 16 caractere alfanumerice, pentru care


se specific sinonimul DENUMIRE . In capul de coloan se va afia textul
"Denumire produs".
SQL> COLUMN DENP FORMAT A16
SQL> COLUMN DENP ALIAS DENUMIRE
SQL> COLUMN DENUMIRE HEADING "Denumire produs"
SQL> SELECT * FROM PRODUSE;
CODD CODP Denumire produs
100000 166666 PLACAJ 2/2
100000 122222 FOTOLIU A3
100000 133333 CANAPEA A7
100000 155555 BIROU C6X4
100000 144444 SCAUN D4
100000 111111 MESE 15/20
6 records selected.

STOC
100
7
36
12
6
9

DATACRT
12-JUL-92
27-JUN-92
12-JUL-92
01-JUL-92
18-JUL-92
29-JUL-92

UM
MP
BUC
BUC
BUC
BUC
BUC

4) S se defineasc coloana DENUM2 cu un format alfanumeric


de trei caractere. Specifica iile pentru aceast coloan sunt
copiate pentru coloana DENP.
SQL> COLUMN DENUM2 FORMAT A3
SQL> COLUMN DENP LME DENUM2
SQL> SELECT * FROM PRODUSE 2 WHERE CODP<138333;
CODD CODP DEN
100000 111111 MES

STOC DATACRT
7
27-JUN-05

UM
BUC

5) S se defineasc coloana ADRESA pe 21 de caractere, utiliznd clauza


WRAPPED.
SQL> COLUMN FORMAT A21 ADRESA WRAPPED
SQL> SELECT STR11 '-' 11NR11 '-' 11 LOC ADRESA 2
FROM CLIEN I;
ADRESA
MOILOR- 104-BUCURESTI
DOROBAN I- 18-BUCURESTI
GOLENTINA-221-BUCURESTI
EMINESCU-44-BUCURESTI
4 records selected.

D.Realizarea de calcule
SQL*Plus permite realizarea unor calcule cu rndurile selectate din
tabele. Pentru aceasta se utilizeaz comanda COMPUTE, care are
urmtoarea sintax:
COMP[UTE] [AVG | COU[NT] | MAX[IMUM] |
MIN[IMUM] NUMBER) ISDT | SUM | VAR[IANCE}]
OF { expresiei etichet),...
ON [expresiei etichet IPAGE1 REPORT! ROW];
Semnifica ia clauzelor este:
Clauza

Semnifica ia

AVG
COUNT
MAXIMUM
MINIMUM
NUMBER
STD
SUM
VARIANCE

Valoare medie
Contorizare valori nule
Valoare maxim
Valoare minim
Contorizare rnduri
Abatere standard
Suma valorilor nenule
Dispersia

Tipul coloanei Tipuri de


date
Numeric
Toate tipurile
Numeric i caracter
Numeric i caracter
Toate tipurile
Numeric
Numeric
Numeric

Dac se specific mai multe func ii, nu trebuie separate ntre ele prin
virgul.
OF precizeaz coloana sau expresia ale cror valori se vor supune
calculului. Acestea trebuie s apar n comanda SELECT, altfel comanda
COMPUTE le va ignora. Dac se dorete ca valoarea calculat s nu fie
afiat pe ecran se va utiliza clauza NON PRINT ataat coloanei
respective cu comanda SELECT.
ON specific un element care va fi utilizat ca generator de ntrerupere. El
poate fi: expresie, etichet, pagin (PAGE), raport (REPORT), linie (ROW).
De cte ori se va schimba valoarea acestuia, se va declana automat
recalcularea func iei definite de COMPUTE.
n cazul n care se d comanda fr nici o func ie, se vor afia
specifica iile de calcul definite.
Secven a de instruc iuni care se va utiliza, n general, va fi:
SQL* BREAK ON expresiei
SQL> COMPUTE clauza OF expresie2 ON expresiei;
SQL> SELECT
Exemple:
1) S se editeze situa ia final cu urmtorul format:
SITUA IE SUM(SALA) FUNC IE
SQL> SET PAGESIZE 22
SQL>RUN
1 SELECT SUM(SALA),FUNCT FROM SALARIA I

2* GROUP BY FUNCT
SITUA IE
SUM(SALA)
45000
179000
268560

FUNCT
DIRECTOR
SEF DEP
VINZATOR

2) S se editeze o situa ie final cu salariile grupate pe func ii i depozite.


SQL> RUN
1 SELECT FUNCT,
2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10",
3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13",
4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16"
5 FROM SALARIA I
6 GROUP BY FUNCT;

SITUATIE
FUNCT
DIRECTOR
SEF DEP
VINZATOR

DEP
45000
0
21200

Data:

DEP
0
71500
72850

DEP
0
107500
77700

Semntura:

3) S se afieze o situa ie final cu salariile grupate pe func ii i depozite.


De asemenea, s se introduc o coloan cu suma salariilor pe fiecare func ie.
SQL>RUN
1 SELECT FUNCT,
2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10",
3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13",
4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16",
5 SUM(SALA)
6 FROM SALARIA I
7 GROUP BY FUNCT;
SITUATIE
FUNCT
DIRECTOR
SEF DEP
VINZATOR

DEP 10
45000
0
21200

DEP 13
0
71500
72850

DEP 16
0
107500
77700

SUM(SALA)
45000
179000
268500

Data:

Semntura:

4) S se afieze o situa ie final cu salariile grupate pe func ii i depozite.


De asemenea, s se fac totalul salariilor pe fiecare depozit i fiecare
func ie.
SQL> BREAK ON DUMMY;
SQL> COMPUTE SUM OF "DEP 100000" ON DUMMY;
SQI> COMPUTE SUM OF "DEP 130000" ON DUMMY;
SQL> COMPUTE SUM OF "DEP 160000* ON DUMMY;
SQL> COMPUTE SUM OF "TOTAL" ON DUMMY;
SQI> COLUMN DUMMY NOPRINT;
SQL> TTITLE CENTER "SITUA IA SALARATILOR"
SKIP CENTER "PE DEPOZITE /FUNC II"
SKIP CENTER " "
SQL> RUN
1 SELECT FUNCT,
2 SUM(DECODE(CODB,lG0000SALA,0)) "DEP 10",
3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13",
4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16",
5 SUM(SALA,)
6 SUM(0) DUMMY
7 FROM SALARIA I
8 GROUP BY FUNCT
SITUATIA SALARIATILOR
PE DEPOZITE / FUNCTII
FUNCT
DIRECTOR
SEF DEP
VINZATOR

Data:

DEP 10
45000
0
21200
66200

DEP 13
0
71500
72850
144350

Semntura:

DEP 16
0
107500
77700
185200

SUM(SALA)
45000
179000
268500

3.13.22. CREAREA UNEI BAZE DE DATE PRIN


COMENZI SQL
1. TIPURI DE UTILIZATORI AI BAZELOR DE DATE SQL
n func ie de volumul activit ilor implicate de administrarea unei
baze de date SQL, sarcinile de administrare pot fi repartizate pe mai multe
categorii de utilizatori ai bazei de date.
Administratorul bazei de date (DBA) este, n func ie de complexitatea i
mrimea unei baze de date, o persoan sau mai multe persoane, care s
execute urmtoarele sarcini administrative:
Instalarea i dezvoltarea sever-ului SQL;
Alocarea memoriei sistemului i planificarea cerin elor viitoare de
memorie ale acestuia;
Crearea bazei de date i a obiectelor acesteia (tabele, viziuni,
indeci);
Modificarea structurii bazei de date n func ie de cerin ele
dezvoltatorilor de aplica ii;
Definirea utilizatorilor bazei de date i ntre inerea sistemului de
securitate;
Controlul i monitorizarea accesului utilizatorilor la baza de date;
Monitorizarea i optimizarea performan elor bazei de date;
Definirea i asigurarea politicii de salvarea sau copiere (backup) i
refacere (recovery) a bazei de date;
Arhivarea datelor;
Asigurarea legturii cu firma pentru suportul tehnic i licen a
de utilizare a produselor SQL.
Dezvoltatorii de aplicaii proiecteaz i implementeaz aplica ii cu
baze de date SQL, executnd urmtoarele sarcini:
Proiectarea i dezvoltarea unei aplica ii, precum i a structurilor de
date ale acesteia;
Estimarea cerin elor de memorie pentru aplica ie;
Definirea modificrilor structurilor de date ale unei aplica ii;
Transmiterea tuturor informa iilor despre activit ile de mai sus ctre
administratorul bazei de date;
Stabilirea msurilor de securitate pentru aplica ie.
Administratorul de aplicaii se ocup cu administrarea unei aplica ii;

Utilizatorii finali ai bazei de date au acces la baza de date prin


intermediul unei aplica ii sau a instrumentelor SQL, executnd n
special urmtoarele activit i:
Adugarea, modificarea i tergerea datelor din baza de date n
concordan cu drepturile de acces pe care le are;
Generarea unor rapoarte cu datele din baza de date.
Administratorul de reea este responsabil cu administrarea
produselor SQL de re ea.
Pentru a putea executa sarcinile de administrare a unei baze de date o
persoan trebuie s aib privilegii (drepturi) att la nivelul bazei de date
SQL, ct i la nivelul sistemului de operare al serverului pe care se afl
baza de date. Prin urmare un administrator trebuie s aib:
Cont de administrator pentru sistemul de operare, care s-i permit
s execute comenzile sistemului de operare;
Cont de administrator SQL definit de dou conturi de utilizator
(SYS i SYSTEM cu parolele CHANGE_OF_INSTALL i respectiv
MANAGER);
Rol de DBA, care este creat automat la momentul crerii unei baze
de date SQL. Acest rol con ine toate privilegiile bazei de date
SQL.
Datorit faptului c un administrator execut activit i pe care un
utilizator obinuit nu le poate executa este necesar ca acesta s poat fi
autentificat nainte de a executa activit ile de administrare. Pentru
autentificarea administratorului exist dou metode: autentificarea folosind
sistemul de operare i autentificarea folosind fiierul de parole.
Autentificarea folosind sistemul de operare se face utiliznd dou
conturi de administrator: OSOPER (sub care poate executa STARTUP,
SHUTDOWN,
ALTER
DATABASE
OPEN/MOUNT,
ALTER
DATABASE BACKUP, ARCHIVELOG i RECOVER) i contul OSDBA
(care con ine toate privilegiile de sistem cu op iunea ADMIN OPTION,
precum i rolul OSOPER). Sub contul OSDBA se poate executa comanda
CREATE DATABASE.
Autentificarea folosind fiierul de parole permite definirea parolelor
de acces pentru fiecare utilizator. Dup stabilirea unui utilizator ca
administrator, de exemplu utilizatorul SCOTT cu parola TIGER, acestuia i
va fi atribuit unul din privilegiile SYSDBA sau SYSOPER, cu comanda
GRANT. Dup aceasta utilizatorul SCOTT se va conecta la baza de date ca
SYSDBA sau SYSOPER cu comanda CONNECT.
Exemplu:
GRANT SYSDBA TO scott

GRANT SYSOPER TO scott


CONNECT scott/tiger AS SYSDBA
CONNECT scott/tiger AS SYSOPER
Administrarea fiierului cu parole include opera iile de definire a
fiierului cu parole, setarea parametrului de ini ializare a bazei de date
REMOTE_LOGIN_PASSWORDFILE, adugarea de utilizatori n acest
fiier i ntreinerea fiierului cu parole.
Crearea fiierului cu parole se execut cu utilitarul ORAPWD, care
are trei parametrii: FILE, PASSWORD i ENTRIES, dintre care primii doi
sunt obligatorii, iar ultimul este op ional. Aceti parametrii definesc numele
fiierului cu parole, parola pentru utilizatorul SYS i respectiv numrul de
utilizatori care pot executa activit i de administrator (DBA). Setarea
parametrului de iniializare REMOTE_LOGIN_PASSWORDFILE cu una
din valorile NONE, EXCLUSIVE i SHARED permite utilizarea fiierului
cu parole.Valoarea NONE determin ca baza de date SQL s func ioneze
fr fiier de parole, valoarea EXCLUSIVE determin ca fiierul de parole
s fie folosit exclusiv de ctre o singur baz de date, iar valoare SHARED
determin ca fiierul de parole s fie folosit de ctre mai multe baze de date.
Pentru a avea un grad mare de securitate pentru baza de date, va
trebui ca imediat dup crearea fiierului cu parole parametrul de ini ializare
REMOTE_LOGIN_PASSWORDFILE s fie setat pe valoarea
EXCLUSIVE.
Adugarea de utilizatori n fiierul cu parole se face la momentul
atribuirii privilegiilor SYSDBA sau SYSOPER unui anumit utilizator.
Exemplu:
1. Se creeaz fiierul cu parole conform indicaiilor de mai sus;
2. Se seteaz parametrul de iniializare
REMOTE_LOGIN_PASSWORDFILE cu valoarea EXCLUSIVE;
3. Se conecteaz utilizatorul SYS, cu parola CHANGE_OF_INSTALL
ca SYSDBA folosind comanda
CONNECT SYS/change_of_install AS SYSDBA
4. Se pornete o instan i se creeaz o baz de date, dac este
necesar, sau se monteaz i se deschide o baz de date existent;
5. Se creeaz utilizatorii care se doresc a fi administratori i care s
fie adugai n fiierul cu parole, folosind comanda
CREATE USER user1 IDENTIFIED BY parola1
6. Se atribuie unul din privilegiile SYSDBA sau SYSOPER acestui
utilizator cu una din comenzile:
GRANT SYSDBA TO user1 sau GRANT SYSOPER TO user1

7. Utilizatorul USER1 este adugat n fiierul cu parole i se poate


conecta acum ca SYSDBA sau SYSOPER cu acest nume de
utilizator n loc de numele SYS, folosind una din comenzile:
CONNECT USER1/parola1 AS SYSDBA
sau
CONNECT USER1/parola1 AS SYSOPER
Listarea membrilor fiierului cu parole se face din viziunea
$PWFILE_USERS folosind comanda
SELECT * FROM V$PWFILE_USERS
ntreinerea fiierului cu parole se refer la executarea activit ilor
de extindere, relocare, tergere sau schimbare a strii acestui fiier.
2. CREAREA, PORNIREA I OPRIREA UNEI BAZE DE DATE
SQL
Configurarea serverului SQL presupune urmtoarele activit i:
Instalarea sistemului SQL, care const n instalarea nucleului
SQL pe server, a instrumentelor (tools-urilor) de aplica ie pe sta ii;
Evaluarea resurselor fizice ale calculatorului pe care se va instala
serverul SQL i baza de date;
Definirea structurii logice a bazei de date i a strategiei de salvare
(backup);
Crearea i deschiderea bazei de date;
Implementarea bazei de date proiectate, prin definirea segmentelor
de revenire (rollback), a tabelelor spa iu i a obiectelor bazei de date;
Salvarea bazei de date i definirea utilizatorilor bazei de date, n
concordan cu licen a SQL.
Pentru a crea o baz de date SQL trebuie s avem suficient
memorie pentru pornirea unei instan e SQL i pentru crearea tuturor
obiectelor proiectate ale bazei de date. Dac la momentul instalrii s-a creat
i o baz de date ini ial atunci aceasta poate fi dezvoltat astfel nct s
cuprind, n final, toate obiectele bazei de date proiectate. De asemenea
aceast baz de date ini ial poate fi tears i n locul ei s se creeze o nou
baz de date. Dac am folosit o versiune anterioar SQL se poate crea o
baz de date nou n ntregime, dac nu ne mai intereseaz vechea baz de
date, altfel putem migra aceast baz de date la noua versiune SQL.
Crearea unei baze de date se face n urmtorii pai:
Salvarea complet a bazei de date existente;
Crearea fiierului cu parametrii folosit la pornirea bazei de date.
Editarea noului fiier cu parametrii, astfel nct parametrii acestuia
s corespund cerin elor noii baze de date.

Controlul identificatorului instan ei SQL, care trebuie s fie identic


cu numele bazei de date setat n parametrul DB_NAME;
Pornirea utilitarul Entreprice Manager i conectarea la SQL ca
administrator.
Pornirea unei instane SQL (System Global Area i procesele
background) cu op iunea Startup Nomount.
Crearea noii bazei de date folosind comanda SQL CREATE
DATABASE, prin intermediul creia SQL execut: crearea
fiierelor de date (data files), fiierelor de control (control files) i a
fiierelor de refacere (redo log) ale bazei de date; crearea tabelei
spa iu SYSTEM i a segmentului rollback SYSTEM; crearea
dic ionarului de date; crearea utilizatorilor SYS i SYSTEM;
specific setul de caractere care va fi folosit la memorarea datelor n
baza de date; monteaz i deschide baza de date pentru utilizare.
Salvarea integral a bazei de date.
Parametrii de ini ializare a bazei de date furnizeaz valorile necesare
pentru func ionarea acesteia sub o anumit instan SQL. Acetia se
personalizeaz prin intermediul unui fiier text, numit fiierul cu parametrii
de ini ializare. Acesta este citit la momentul pornirii bazei de date de ctre
serverul SQL. Pentru a face eventuale modificri, baza de date trebuie
oprit complet i repornit dup ce s-au efectuat astfel de modificri.
Mul i parametrii de ini ializare se folosesc pentru ajustarea i
creterea performan elor bazei de date. Specificarea parametrilor se
realizeaz dup urmtoarele reguli:
To i parametrii sunt op ionali;
n fiierul cu parametrii se vor fi introduce numai parametrii i
comentarii;
Semnul (#) marcheaz nceputul unui comentariu, restul liniei fiind
ignorat;
Serverul SQL are valori asumate pentru fiecare parametru;
Parametrii pot fi specifica i n orice ordine;
Fiierul de parametrii nu este case-sensitive ;
Pentru a introduce mai mul i parametrii pe o linie acetia se vor
separa prin spa iu:
PROCESSES = 100 SAVEPOINTS = 5 OPEN_CURSORS = 10
Unii parametrii, ca de exemplu ROLLBACK_SEGMENTS, accept
valori multiple, acestea putndu-se specifica ntre paranteze i
separate prin virgul, sau fr paranteze i virgule, ambele sintaxe
fiind valide, astfel:
ROLLBACK_SEGMENTS = (SEG1, SEG2, SEG3, SEG4, SEG5)

ROLLBACK_SEGMENTS = SEG1 SEG2 SEG3 SEG4 SEG5

Caracterul (/) folosete pentru marcarea ntreruperii scrierii unui


parametru pe o linie i continuarea lui pe linia urmtoare, imediat
fr nici un spa iu n fa , astfel:
ROLLBACK_SEGMENTS = (SEG1, SEG2, \
SEG3, SEG4, SEG5)
Parametrul IFILE se poate introduce ntr-un fiier cu parametrii alt
fiier cu parametrii, astfel:
IFILE = COMMON1.ORA
Se pot folosi trei niveluri de imbricare. n exemplu de mai sus
fiierul COMMON1.ORA poate con ine un al doilea parametru IFILE
pentru fiierul COMMON2.ORA, care la rndul su poate con ine un al
treilea parametru IFILE pentru fiierul COMMON3.ORA. De asemenea, se
pot utiliza mai mul i parametrii IFILE n acelai fiier, astfel:
IFILE = DBPARMS.ORA
IFILE = GCPARMS.ORA
IFILE = LOGPARMS.ORA
Dac valoarea unui parametru con ine caractere speciale, atunci
caracterul special trebuie precedat de caracterul de comutare (\) sau ntreaga
valoare este inclus ntre caracterele ( ), ca n exemplul de mai jos:
DB_DOMAIN = JAPAN.ACME\#.COM
sau
DB_DOMAIN = "JAPAN.ACME#.COM"
Pentru schimbarea valorii unui parametru, aceasta se editeaz n
fiierul cu parametrii. Cnd instan a SQL este repornit aceasta va folosi
noua valoare a parametrului.
C iva parametrii de ini ializare sunt dinamici, n sensul c valorile
acestora se pot modifica prin procedeul de mai sus sau n timp ce o instan
ruleaz, folosind comenzile SQL: ALTER SESSION, ALTER SYSTEM
sau ALTER SYSTEM DEFERRED cu sintaxele:
ALTER SESSION SET nume_parametru = valoare
ALTER SYSTEM SET nume_parametru = valoare
ALTER SYSTEM SET nume_parametru = valoare DEFERRED
Comanda ALTER SESSION schimb valoarea unui parametru
numai la nivelul sesiunii care a lansat-o, dup repornirea bazei de date se va
utiliza iari valoarea din fiierul cu parametrii.
Comanda ALTER SYSTEM modific valoarea global a
parametrului, la nivelul ntregului sistem, deci pentru toate sesiunile active,
dup repornirea bazei de date se va utiliza iari valoarea din fiierul cu
parametrii.

Comanda ALTER SYSTEM DEFERRED modific valoarea global


a parametrului nu pentru sesiunile active, ci pentru sesiunile viitoare, care
vor fi active dup repornirea bazei de date.
Afiarea valorilor curente ale parametrilor de ini ializare ai bazei de
date se face cu comanda SHOW PARAMETERS, afiarea fcndu-se n
ordinea alfabetic a parametrilor. Listarea la imprimant a parametrilor
afia i se face cu comanda SPOOL.
Parametrii de ini ializare se pot grupa n:
Parametrii derivai sunt cei ale cror valori se calculeaz pornind de la
valorile altor parametrii. Normal valorile acestora nu trebuie modificate;
Parametrii globali prefixai cu GC sunt folosi i pe sistemele care
suport SQL Parallel Server;
Parametrii dependeni de sistemul de operare sunt cei ale cror valori
sunt dependente de specificul sistemului de operare gazd. Exemplu:
DB_BLOCK_BUFFERS care indic numrul ariilor de date (data
buffers) din memoria principal sau DB_BLOCK_SIZE care indic
mrimea unui bloc de date;
Parametrii de tip variabil sunt cei ce pot lua anumite valori care s
determine performan ele sistemului sau anumite limite de func ionare.
Exemplu: OPEN_CURSORS dac i se d valoarea 10 se vor putea
deschide maxim 10 cursoare, iar DB_BLOCK_BUFFERS prin valorile
pe care le va lua nu va impune anumite limite dar va modifica
performan ele sistemului;
Parametrii statici sunt cei ale cror valori nu se pot modifica n timpul
unei sesiuni sau cu baza de date pornit;
Parametrii dinamici sunt cei ale cror valori se pot modifica, aa cum sa artat mai sus cu comenzile ALTER SESSION, ALTER SYSTEM sau
ALTER SYSTEM DEFERRED;
Aa cum s-a prezentat mai sus compania SQL furnizeaz un fiier
ini ial cu parametrii cu ajutorul cruia putem s pornim o baz de date
Pentru a personaliza baza de date conform cerin elor beneficiarului,
administratorul va trebui s seteze valori noi pentru anumi i parametrii
specifica i mai jos, astfel:
DB_NAME definete numele bazei de date. Se formeaz dintr-un ir de
maximum opt caractere. Dac nu se furnizeaz, SQL atribuie bazei de
date un nume standard. Acesta se gsete n fiierul cu parametrii
furnizat o dat cu software-ul SQL. n timpul creerii bazei de date
numele acesteia este scris n fiierele de date, de control i de log.
Exemplu: DB_NAME = BAZA1

DB_DOMAIN este format dintr-un ir de caractere i definete


domeniul din re ea cruia apar ine baza de date, de obicei este definit de
numele organiza iei creia apar ine baza de date. Dac se utilizeaz
numele domeniului din Internet, atunci partea adresei de e-mail care
urmeaz dup caracterul @ este foarte bun pentru a fi folosit ca
valoare pentru acest parametru.
Exemplu: DB_DOMAIN = BUC.ORG.COM
GLOBAL_NAMES definete numele global al bazei de date n cadrul
re elei de calculatoare i este format din numele bazei de date i numele
domeniului separate prin punct. Acest parametru mai poate lua i
valorile: TRUE (caz n care se for eaz ca numele global al bazei de
date s fie identic cu cel al bazei de date) sau FALSE (numele global nu
are semnifica ie, nu se utilizeaz).
Exemplu: GLOBAL_NAMES =FALSE
CONTROL_FILES definete numele fiierelor de control ce vor fi
create pentru baza de date(se va furniza pentru fiecare fiier calea
complet de acces la acesta). Este recomandat ca s se defineasc cel
pu in dou fiiere de control, care s fie plasate pe dou discuri diferite.
Exemplu: CONTROL_FILES =diska:cntrl1.ora,diskb:cntrl2.ora
LOG_FILES specific numrul maxim de grupuri de fiiere de log ce
pot fi utilizate pentru o baz de date. Ia valori de la 2 la 255. Acest
parametru specific totodat i numrul minim de fiiere de log ce pot fi
deschise pentru o baz de date.
DB_FILE_MULTIBLOCK_READ_COUNT definete numrul de
blocuri citite simultan pentru accesarea unei tabele a bazei de date. Este
folosit pentru optimizarea parcurgerii totale a unei tabele atunci cnd se
caut o anumit valoare a unei coloane aferent unui rnd din aceasta.
REMOTE_LOGIN_PASSWORDFILE specific dac se folosete sau
nu fiierul cu parole pentru identificarea utilizatorilor ce pot executa
activit i de administrator. Poate lua valorile: NONE nu se folosete
fiierul de parole iar utilizatorul care va executa activit i de
administrare trebuie s fie autentificat de ctre sistemul de operare
gazd; EXCLUSIVE se folosete un singur fiier cu parole pentru o
singur baz de date. Pe lng utilizatorii SYS i SYSTEM i al i
utilizatori pot executa sarcini de administrare; SHARED se folosete un
singur fiier cu parole pentru mai multe baze de date, caz n care singurii
utilizatori ce pot executa activit i de administrare sunt SYS i
SYSTEM. n acest caz nu se pot aduga al i utilizatori n fiierul cu
parole.

DB_FILES specific numrul maxim de fiiere de date ce pot fi


deschise de ctre o baz de date. De fiecare dat cnd se modific acest
parametru baza de date se oprete i apoi se repornete.
LOG_CHECKPOINT_INTERVAL specific frecven a punctelor de
control (checkpoites) ;
LOG_CHECKPOINT_TIMEOUT specific timpul maxim dintre
dou puncte de control n secunde;
PROCESSES specific numrul maxim de utilizatori care se pot
conecta simultan la baza de date, iar acest numr trebuie s fie mai mare
dect numrul total de procese background, Job Queue i Parallel Query;
ROLLBACK_SEGMENTS definete toate segmentele rollback pe
care o instan le poate acapara la momentul pornirii. Valoarea acestui
parametru se d sub forma unei liste de valori.
Exemplu:
ROLLBACK_SEGMENTS = (rbseg1, rbseg2, rbseg3, rbseg4)
LICENSE_MAX_SESSIONS specific numrul maxim de utilizatori
concuren iali ce pot fi admii n timpul unei sesiuni;
LICENSE_MAX_USERS specific numrul maxim de utilizatori ce
pot fi crea i pentru o baz de date. LICENSE_MAX_SESSIONS i
LICENSE_MAX_USERS nu pot avea simultan valori diferite de zero,
deci unul din aceti parametrii trebuie s fie setat pe zero;
LICENSE_SESSIONS_WARNING specific numrul de utilizatori
concuren iali. Dac se depete, se emite un mesaj de aten ionare;
TRANSACTIONS_PER_ROLLBACK_SEGMENT
specific
numrul tranzac iilor concurente permise pe un segment rollback;
AUDIT_TRAIL activeaz sau dezactiveaz scrierea rndurilor n
fiierul de audit. nregistrrile de audit nu se scriu dac parametrul are
valoarea NONE sau lipsete.
Zona de memorie SGA (System Global Area) con ine urmtoarele
structuri de memorie: database buffer cache, redo log buffer i shared pool.
Database Buffer Cache este por iunea din SGA ce con ine blocurile de date
citite din fiierele de date ale bazei de date. Redo log buffer este zona n care
se pstreaz informa ii despre modificrile efectuate n baza de date. Shared
pool este o zon care con ine la rndul su trei structuri de memorie: library
cache, dictionary cache i control structures. Dic ionarul de date al bazei de
date este citit n zonele library cache i dictionary cache.
Mrimea SGA este influen at de valorile parametrilor urmtori:
DB_BLOCK_SIZE definete, n bytes, mrimea unui singur bloc de
date. Valorile tipice pentru acest parametru sunt 2048 i 4096;

DB_BLOCK_BUFFERS specific numrul de buffere ale bazei de date


disponibile n zona database buffer cache, a crei mrime este egal cu
DB_BLOCK_SIZE * DB_BLOCK_BUFFERS;
LOG_BUFFER determin mrimea n bytes a zonei redo log buffer
SHARED_POOL_SIZE specific mrimea n bai i a ariei Shared pool.
Acest parametru poate accepta valori numerice urmate de literele "K"
sau "M", unde "K" nseamn c numrul va fi multiplicat cu 1000, iar
"M" nseamn c numrul va fi multiplicat cu 1000000.
OPEN_CURSORS specific numrul maxim de cursoare pe care o
sesiune le poate deschide simultan. Valoarea asumat este de 50. Este
bine ca acest numr s fie ct mai mare pentru a nu avea probleme cu
rularea unei aplica ii.
TRANSACTIONS specific numrul maxim de tranzac ii concurente.
O valoare mare a acestui parametru determin mrirea zonei de memorie
SGA.

Exemple de creare a unei baze de date


1) CREATE DATABASE;
n acest caz se creaz o baz de date SQL n care to i parametrii comenzii
CREATE DATABASE iau valorile standard.
2) CREATE DATABASE baza1
LOGFILE GROUP 1 ('diskb:log1.log', 'diskc:log1.log') SIZE 50K,
GROUP 2 ('diskb:log2.log', 'diskc:log2.log') SIZE 50K
MAXLOGFILES 5
MAXLOGHISTORY 100
MAXDATAFILES 10
ARCHIVELOG
CHARACTER SET US7ASCII
DATAFILE 'diska:datfile1.dat' SIZE 2M
DATAFILE
'disk1:datfile2.dbf' AUTOEXTEND ON
'disk2:datfile3.dbf' AUTOEXTEND ON NEXT 10M
MAXSIZE UNLIMITED;
Dup crearea unei baze de date, instan a SQL poate fi lsat s
ruleze, iar baza de date este deschis i montat pentru utilizare normal.
Pentru opririle i pornirile ulterioare se poate utiliza SQL Enterprise
Manager.
Pornirea i oprirea bazei de date

O baz de date i instan a SQL se poate porni cu utilitarul SQL


Enterprise Manager folosind fereastra de dialog Startup Database. O
instan i o baz de date asociat se pot porni n mai multe moduri.
Pornirea instan ei fr montarea bazei de date se face atunci cnd
dorim s crem o baz de date. Activitatea se execut din fereastra de dialog
Startup Database prin selectarea butonului radio Startup Nomount;
Pornirea instan ei i montarea bazei de date, aceasta rmnnd
nchis se execut atunci cnd dorim s executm anumite activit i de
ntre inere: redenumirea fiierelor de date; adugarea, tergerea sau
redenumirea fiierelor redo log; recuperarea integral a bazei de date;
Aceast pornire se execut din fereastra de dialog Startup Database prin
selectarea butonului radio Startup Mount. Montarea bazei de date se poate
execut i dup pornirea unei instan e fr baz de date montat, cu ajutorul
comenzii SQL ALTER DATABASE cu op iunea MOUNT.
Exemplu: SQL> ALTER DATABASE baza1 MOUNT;
Pornirea instan ei, montarea bazei de date i deschiderea acesteia se
face n mod nerestricionat (accesibil tuturor utilizatorilor care au cu
privilegiul CREATE SESSION) sau restricionat (accesibil doar
utilizatorilor de tip DBA, utilizatorilor cu privilegiile CREATE SESSION i
RESTRICTED SESSION).
n modul de pornire restric ionat se pot executa activit i ca:
recrearea indecilor; exportul sau importul datelor bazei de date; ncrcarea
datelor cu utilitarul SQL*Loader; blocarea temporar a accesului
utilizatorilor obinui i la baza de date. Pornirea n mod nerestricionat se
face din fereastra de dialog Startup Database prin selectarea butonului radio
Startup Open. Pornirea n mod restricionat se face din fereastra de dialog
Startup Database prin selectarea butonului radio Restrict
Deschiderea unei baze de date se poate face dup ce instan a fost
pornit, baza de date montat dar nchis, cu ajutorul comenzii SQL ALTER
DATABASE cu op iunea OPEN.
Exemplu: SQL> ALTER DATABASE baza1 OPEN;
Transformarea modului de pornire normal a unei baze de date n
modul restric ionat se poate face i cu comanda SQL ALTER SYSTEM cu
op iunea ENABLE RESTRICTED SESSION , iar revenirea la situa ia ini ial
se face cu aceeai comand dar cu op iunea DISABLE RESTRICTED
SESSION
Exemplu:
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

n anumite circumstan e este posibil ca activit ile de pornire a bazei de


date i instan ei SQL s se execute altfel dect n mod uzual. Astfel putem
avea:
pornirea forat a unei instane, care se poate realiza atunci cnd
instan a curent nu poate fi oprit cu succes prin folosirea butoanelor
radio Normal sau Immediate din fereastra de dialog Startup. n acest caz
se poate for a pornirea unei noi instan e SQL, care va determina
oprirea instan ei anterioare aflat n situa ia de mai sus.
pornirea unei instane, montarea bazei de date i pornirea procesului
de recuperare a bazei de date, a tabelelor spaiu sau a fiierelor de
date, care se execut atunci cnd tim c mediul bazei de date are nevoie
de recuperare.
pornirea n modul exclusiv sau paralel, care se face atunci cnd avem
un server SQL care permite accesul mai multor instan e la aceeai
baz de date.
pornirea automat a bazei de date la momentul pornirii sistemului de
operare, se face dac dorim acest lucru.
pornirea unei instane i a unei baze de date la distan, se face atunci
cnd serverul SQL este o parte a unui sistem de baze de date
distribuite.
Oprirea unei baze de date se poate face n dou moduri: normal sau
for at.
Modul normal, n care oprirea bazei de date se face ca revers al
opera iei de pornire normal, sens n care se execut nchiderea bazei de
date, demontarea bazei de date i oprirea instan ei SQL. Activitatea se
execut din fereastra de dialog Shutdown Database prin selectarea butonului
radio Normal. Oprirea unei baze de date n condi ii normale presupune
executarea de ctre SQL a urmtoarelor activit i: oprirea conectrilor la
baza de date; deconectarea tuturor utilizatorilor; la urmtoarea pornire a
bazei de date nu se pornesc procedurile de recuperare.
Modul forat se poate execut n dou moduri: imediat sau prin
anularea instan ei.
Oprirea imediat a bazei de date se execut n cazul unui incident
iminent. n cadrul acestei opriri se execut instruc iunea SQL aflat n
lucru i orice alt tranzac ie nefinalizat este anulat prin procesul de
rollback; to i utilizatorii conecta i sunt deconecta i imediat.
Oprirea se face din fereastra de dialog Shutdown Database prin
selectarea butonului Immediate.

Oprirea prin anularea instan ei se execut dac baza de date sau


una din aplica iile sale func ioneaz anormal i nici una din metodele de
oprire anterioare nu func ioneaz. Aceast oprire se execut din fereastra de
dialog Shutdown prin setarea butonului radio Abort.
n timpul acestei opriri se finalizeaz instruc iunile SQL aflate
n lucru, tranzac iile nefinalizate nu mai sunt aduse la starea anterioar
momentului nceperii acestora (nu mai sunt anulate prin procesul de roll
back), iar to i utilizatorii sunt deconecta i imediat.
3. CREAREA I ACTUALIZAREA TABELELOR
Comanda de creare a unei tabele, CREATE TABLE, realizeaz fie
definirea unei tabele, urmnd ca introducerea de date s se efectueze
ulterior, fie definirea i ncrcarea cu date a unei tabele, chiar n momentul
creerii ei, folosind sintaxele:
CREATE TABLE nume-tabel
(spec-col [NOT NULL],...)
SPACE definire-spaiu [PCTFREE n] |
CLUSTER nume-cluster (nume-col,...)];
CREATE TABLE nume-tabel
[(nume-col [NOT NULL],...)]
[SPACE definire-spatiu [PCTFREE n]
CLUSTER nume-cluster (nume-col,...)]
[AS cerere]
Unde:
spec-col cuprinde nume-col, format, mrime.
nume-col este numele coloanei din tabel.
format reprezint formatul coloanei din tabel.Formatele acceptate
sunt specificate n tabelul urmtor:
Tipul
datelor
Char

Formatul

Explica ii

CHAR( mrime)

Date

DATE

Date alfanumerice. Marimea maxim a coloanei este


de 240 caractere.
Permit introducerea cmpurilor de tip dat.
Exemplu: January 1, 4712 BC to December 31,
4712 AD

Long

LONG

LONG VARCHAR
LONG ROW
Numerice NUMBER
NUMBER (mrime)
NUMBER (ntregi
zecimali)
NUMBER(*)
DECIMAL
FLOAT
INTEGER
INTEGER (mrime)

RAW

SMALLINT
RAW(mrimea)
LONGRAW

Date caracter de mrime variabil, ntr-o tabel


trebuie s fie definit doar o coloan de tip LONG.
La fel ca LONG.
Date binare RAW.
Date numerice de mrime implicit.
Date numerice de mrime specificat.
Date numerice n baza zece.
La fel ca datele de tip NUMBER.
La fel ca datele de tip NUMBER.
Nu accept descrierea mrimii coloanei.
La fel ca datele de tip NUMBER.
Nu accept descrierea mrimii zecimalelor.
La fel ca date de tip INTEGER
Date binare RAW. Mrimea maxim este 240 octe i.
Date de tip LONG.

n cazul celei de-a doua sintaxe, tipul i mrimea coloanelor vor fi


copiate din rezultatul ob inut n urma specificrii AS cerere. n ambele
sintaxe se utilizeaz alte cuvinte cheie sau parametrii, care au urmtoarea
semnifica ie:
NULL sau NOT NULL se refer la cmpurile din coloane care pot avea sau
nu valori nule. Clauzele nume-col [NOT NULL] se pot repeta pentru
maximum 254 de coloane.
SPACES desemneaz modelul de alocare a spa iului pentru tabela ce se
creaz. Modelul este creat n prealabil cu CREATE SPACES. Dac
parametrul SPACE este omis, pentru to i parametrii de spa iu vor fi utilizate
valorile implicite din comanda CREATE SPACE.
PCTFREE permite specificarea unei alte valori dectt cea implicit de 20%
pentru spa iul lsat liber. Are aceeai func ie ca i n comanda CREATE
SPACE.
CLUSTER este parametrul care indic faptul c tabela va fi inclus n
clusterul cu numele nume-cluster. Introducerea datelor n tabela va declana
memorarea lor n ordinea indicelui de cluster.
Nume-col se refer la numele coloanelor din tabel care corespund
coloanelor din cluster.
Exemplu:

S se creeze tabelele: PRODUSE, CLIEN I, PRETURI SALARIATI,


DEPOZITE, COMENZI ce intr n componen a bazei de date COMBAZA.
SQL> CREATE TABLE PRODUSE
2 (CODD NUMBER(6) NOT NULL,
3 CODP NUMBER(5) NOT NULL,
4 DENP CHAR(11),
5 STOC NUMBER(6),
6 DATACRT DATE,
7 UM CHAR(3));
Table created.
SQL> CREATE TABLE CLIEN I
2 (CODC NUMBER(6) NOT NULL,
3 DENC CHAR(11),
4 LOC CHAR(11),
5 STR CHAR(16),
6 NRCHARC3),
7 CONTNUMBER(11),
8 TEL NUMBER(8),
9 TFAX NUMBER(8))
Table created.
SQL> CREATE TABLE PRETURI
2 CODP NUMBER(5) NOT NULL,
3 PRETMAX NUMBEB(9,2),
4 PRETMIN NUMBER(9,2), 6 DATAI DATE,
6 DATASF DATE);
Table created.
SQL> CREATE TABLE SALARIATI
2 (MARCA NUMBER(4) NOT NULL,
3 NUME CHAR(16),
4 FUNCT CHAR(7),
6 CODD NUMBER(G) NOT NULL, 6 SALA NUMBER(9,2)
7 VENS NUMBER(9.2),
8 CODS NUMBER(4) NOT NULL);
Table created.
SQL> CREATE TABLE DEPOZITE
2 (CODD NUMBER(6) NOT NULL,
3 DEND NUMBER(6) NOT NULL,
4 NRSAL NUMBER(2));
Table created.
SQL> CREATE TABLE COMENZI
2 (NRCOM NUMBER(6) NOT NULL,

3 CODP NUMBER(5) NOT NULL,


4 CODC NUMBEIK6) NOT NULL,
5 DATAL DATE,
6 CANT NUMBER(7),
7 PRE NUMBER(9-2));
Table created.
Modificarea unei tabele presupune adugarea de noi coloane la
sfritul acesteia sau modificarea tipurilor unor coloane deja existente.
Comanda care realizeaz aceste opera ii este ALTER TABLE. Sintaxa ei
este:
ALTER TABLE table {ADD | MODIFY}
(spec-col [NULL | NOT NULL,...])
unde:
ADD adaug la sfritul tabelei noi coloane care ini ial au valori nule;
ulterior, prin actualizare, aceste coloane se vor completa cu date.
MODIFY schimb definirea unei coloane existente. Modificarea tipului sau
mrimii unei coloane presupune ca aceasta s con in numai valori nule.
spec-col reprezint numele, formatul i mrimea coloanei ce se va aduga
sau se va modifica.
NULL se refer la faptul c valorile din coloan ce se adaug/modific sunt
nule.
NOT NULL specific faptul c o coloan nu poate avea valori nule (NOT
NULL). Unei coloane deja existente i se poate ataa parametrul NOT
NULL numai dac aceasta con ine valori nenule.
Exemple:
1) S se adauge la tabela DEPOZITE o nou coloan CANTDEP ce nu a
fost prevzut ini ial.
SQL> ALTER TABLE DEPOZITE ADD
2 (CANTDEP NUMBER(7));
Table altered.
2) S se modifice atributele coloanei CANTDEP (respectiv mrirea acesteia
cu dou unit i).
SQL> ALTER TABLE DEPOZITE MODIFY
2 (CANTDEP NUMBER(9));
Table altered.

Pentru tergerea unei tabele ntr-o baz de date se utilizeaz


comanda DROP TABLE. Sintaxa ei este:
DROP TABLE nume-tabel:
n general, nu se pot terge tabelele create de al i utilizatori. La
tergerea unei tabele. se terg automat indecii corespunztori (create fie de
ctre proprietarul tabelei, fiu de ctre al i utilizatori) i privilegiile conferite
n legtur cu ea. Rmn, ns, viziunile i sinonimele referitoare la tabela
tears, care vor deveni invalide. Va trebui fie ca acestea s fie terse, fie s
se defineasc sau s se redefineasc tabela n aa fel inct viziunile i
sinonimele s devin valide.
Exemplu:
S se stearg tabela DEPOZITE.
SQL> DROP TABLE DEPOZITE;
Table dropped.
Se pot modifica numele atribuite tabelelor, sau sinonimelor utiliznd
comanda RENAME. Sintaxa ei este:
RENAME nume-vechi TO nume-nou;
unde:
nume-vechi i nume-nou sunt constante de tip ir de caractere (nu se scriu
ntre ghilimele sau apostrofuri).
4. CREAREA I ACTUALIZAREA INDECILOR
n vederea ob inerii de performan e superioare privind accesul la
tabelele unei baze de date se pot construi indeci folosind comanda
CREATE INDEX.
Comanda are ca efect crearea unui index la o tabel, index care va
con ine cte o intrare pentru fiecare valoare care apare n coloana specificat
pentru tabela respectiv. Aceast coloan se numete coloana de index.
Sintaxa comenzii CREATE INDEX este:
CREATE [UNIQUE] INDEX nume-index
ON nume-tabela (nume-col [ASC | DESC], nume-col [ASC | DESC],...)
[COMPRESS | NOCOMPRESS]
[SYSSORT | NOSYSSORT]
[ROWS =n][PCTFREE = {20 | n}];

unde:
UNIQUE se refer la faptul c tabela nu va con ine dou rnduri cu aceleai
valori n coloanele index (deci nu vor exista dubluri n coloana index). Dac
se omite, tabela poate con ine oricte asemenea rnduri care s aib n
coloana index aceeai valoare.
ASC|DESC precizeaz ordinea n care va fi pstrat indexul: ascendent sau
descendent.
COMPRESS indic faptul c indecii pot fi comprima i, reducndu-se n
acest mod spa iul necesar memorrii acestora i mrindu-se viteza
opera iilor care folosesc indecii. Comprimarea nu permite gsirea ntr-un
index a valorii unui anumit cmp fr s acceseze tabela. NOCOMPRESS
suprim comprimarea indecilor.
SYSSORT specific faptul c procedura standard SQL de sortare este
folosit pentru a crea un index. NOSYSSORT este folosit pentru depanare.
ROWS specific numrul aproximativ de rnduri ce urmeaz a fi indexate.
Acest numr este utilizat pentru a optimiza sortarea n SYSSORT. Clauza
nu are efect n SQL*Plus.
PCTFREE specific, n momentul crerii indexu-lui, procentul din spa iul
pentru index ce trebuie s rmn liber pentru actualizri. Nu are efect
asupra extensiilor alocate dup crearea indexului.
Indexul creat permite creterea vitezei de acces la datele unei tabele
prin intermediul coloanei index datorit faptului c se vor cuta rndurile
corespunztoare valorilor coloanei index, fr a citi ntreaga tabel.
Deoarece indexul i tabela trebuie actualizate, introducerile, tergerile i
modificrile n cmpul de valori ale coloanei index necesit un timp mai
mare. De aceea, se recomand crearea de maxim 3 indeci pentru o tabel.
In func ie de necesit i, se pot creea i terge n mod dinamic indeci.
Indecii crea i pentru o singur tabel trebuie s aib nume distincte.
Pentru tabele diferite pot fi crea i indeci cu acelai nume. n momentul
tergerii acestor indeci trebuie specificat tabela din care fac parte.
Comanda de validare a unui index este VALIDATE INDEX.
Aceast comand verific integritatea indexului specificat pentru o anumit
tabel. Dac pe tabela respectiv a fost creat un singur index, al crui nume
va fi specificat n comand, atunci numele tabelei poate fi omis. Comanda
VALIDATE INDEX are sintaxa:
VALIDATE INDEX nume-index
[ON nume-tabel] [WITH LIST];
unde:

WITH LIST salveaz informa iile referitoare la index ntr-un fiier.


nume-index este numele indexului ce urmeaz a fi validat. Dac indexul este
valid, comanda va afia un mesaj corespunztor (Index validated). Ob inerea
oricrui alt mesaj va determina tergerea indexului i recrearea lui.
tergerea unui index din baza de date se realizeaz cu ajutorul comenzii
DROP INDEX, cu sintaxa:
DROP INDEX nume-index [ON nume-tabel];
Dac pe o anumit tabel a fost creat un singur index, numele tabelei
respective poate fi omis n linia de comand. Este posibil ca doi indeci
crea i pe tabele diferite s aib acelai nume. n acest caz, n linia de
comand vor aprea att numele indexului ct i al tabelei pentru care a fost
creat. Se recomand numai tergerea indecilor proprii.
Exemple:
1) S se creeze un index cu numele SUMAR pentru coloana FUNCT din
tabela SALARIA I.
SQL> CREATE INDEX SUMAR
2 ON SALARIATI(FUNCT);
Index created
2) S se creeze un index cu numele MARCA pentru coloana MARCA din
tabela SALARIA I.
SQL> CREATE INDEX MARCA
2 ON SALARIAT(MARCA);
Index created.
3) S se creeze un index cu numele MARCA din pentru coloana MARCA
clia tabela SALARIA I cu suprimarea comprimrii lui.
SQL> CREATE INDEX MARCA
2 ON SALARIATI(MARCA) NOCOMPRESS;
Index created.
4) S se verifice integritatea indexului SUMAR.
SQL> VALIDATE INDEX SUMAR;
Index validated.
6) S se verifice integritatea indexului MARCA pentru tabela SALARIA I.
SQL> VALIDATE INDEX MARCA ON SALARIA I;
Index validated.
7) S se tearg indexul SUMAR.
SQL> DROP INDEX SUMAR;
Index dropped.
8) S se tearg indexul MARCA din tabela SALARIA I.
SQL> DROP INDEX MARCA ON SALARIA I;

Index dropped.
5. CREAREA I ACTUALIZAREA TABELELOR I INDECILOR
PARTI IONA I
Parti ionarea este procesul de mpr ire a tabelelor i indecilor
foarte mari n mai multe tabele, i respectiv indeci, mai mici numite parti ii
pentru a le putea manipula mai uor.
O dat definite parti iile, instruc iunile SQL pot accesa i manipula
aceste parti ii n loc de a manipula ntreaga tabel sau ntregul index din care
au provenit.
Toate parti iile au aceleai atribute logice ca i tabela sau indexul din
care au provenit. De exemplu toate parti iile unei tabele au aceleai coloane
cu aceleai constrngeri de integritate ca i tabela, iar parti iile unui index
sunt construite dup aceeai coloan ca i indexul din care au provenit.
Fiecare parti ie este memorat ntr-un segment propriu aflat n
aceeai tabel spa iu sau n tabele spa iu diferite. Plasarea parti iilor n tabele
spa iu diferit prezint urmtoarele avantaje semnificative:
Riscul pierderii datelor poate fi diminuat;
Salvarea i restaurarea parti iilor se poate face independent unele fa de
altele;
Se poate realiza o echilibrare a opera iilor de I/O prin maparea parti iilor
pe discuri diferite.
O parti ie este definit de urmtoarele:
Numele partiiei identific n mod unic parti ia n schema de obiecte a
unui utilizator;
Referirea unei partiii se face n context obligatoriu cu numele tabelei
sau indexului din care provine. Numele unei parti ii poate s apar n
instruc iuni DDL i DML, precum i n utilitarele Import/Export i
SQL*Loader.
Exemplu:
ALTER TABLE tab10 DROP PARTITION part1;
Aria de cuprindere a partiiei este format din rndurile tabelei sau
indexului, care apar in acesteia bazat pe valorile coloanele ce definesc
parti ia. Aria de cuprindere este definit prin clauzele:
PARTITION BY RANGE ( coloana1, colana2, )
i
VALUES LESS THAN (valoare1, valoare2, )

unde coloana1, coloana2, formeaz lista coloanelor. n func ie de


valorile acestora se stabilesc rndurile din tabel sau index care apar in
parti iei. Coloanele dup care se face parti ionarea nu trebuie s con in
valori de tip NULL, iar numrul lor nu poate fi mai mare de ct 16;
valoare1, valoare2, formeaz lista valorilor coloanelor. n func ie ele
se selecteaz rndurile pentru a fi incluse n parti ie. Aceste valori
formeaz limita superioar a parti iei. Limitele partiiei definesc
mul imea rndurilor tabelei sau indexului ce vor fi incluse n aceasta.
Orice parti ie are dou limite, limita inferioar a crei valoare este
definit de valoarea LESS THAN din definirea parti iei precedente i
care este inclus n partiie, i limita superioar este definit de
valoarea LESS THAN din definirea parti iei curente, valoare care nu
este inclus n partiie. De la aceast regul face excep ie prima parti ie
care nu are limit inferioar. Parti ionarea nu se poate face dup
pseudocoloanele LEVEL, ROWID sau MISLABEL. Ca valoare n
clauza LESS THAN a ultimei parti ii se poate specifica i
MAXVALUE, care reprezint o valoare virtual egal cu infinit. Cheia
de partiionare este un set de valori format din valorile coloanelor de
parti ionare aferente unui rnd al parti iei. Specificarea unei valorii alta
dect MAXVALUE pentru parametrul LESS THAN impune o
constrngere implicit de tip CHECK la nivel de tabel, cu aceast
valoare.
Reguli de partiionare a tabelelor si a indecilor
Partiionarea tabelelor se face respectnd cteva reguli esen iale, astfel:
O tabel poate fi parti ionat dac nu este inclus ntr-un grup de tabele
sau nu con ine tipurile de date LOB, LONG, LONG RAW sau obiect;
O tabel parti ionat sau neparti ionat poate avea indeci i parti iona i
i/sau neparti iona i;
Atributele fizice ale unei parti ii pot fi specificate ini ial prin comanda
CREATE TABLE pentru crearea parti iei implicit sau explicit.
Specificarea implicit se face prin furnizarea atributelor fizice pentru
tabel i nespecificarea acestora pentru parti ie n clauza PARTITION.
Atributele fizice implicite pot fi ulterior modificate cu comanda ALTER
TABLE MODIFY DEFAULT ATTRIBUTES. Specificarea explicit
se face prin furnizarea acestora n clauza PARTITION, caz n care
valorile atributelor fizice ale parti iei vor suprascrie valorile atributelor
fizice implicite ale tabelei. Atributele fizice explicite pot fi ulterior
modificate cu comenzile
ALTER TABLE MODIFY PARTITION

sau
ALTER TABLE MOVE PARTITION
Partiionarea indecilor se face respectnd cteva reguli:
Un index poate fi parti ionat dac nu este inclus ntr-un grup de indeci
sau nu este definit pentru o tabel inclus ntr-un grup de tabele;
Indecii pot fi de patru categorii: locali prefixai, locali neprefixai,
globali prefixai i globali neprefixai. Indecii globali pot fi parti iona i
sau neparti iona i. Un index este local dac cheile dintr-o parti ie
oarecare a acestuia refer rnduri aflate ntr-o singur parti ie a tabelei
pentru care a fost creat. Indexul local este prefixat dac este definit pe
un set de coloane dintre care cea mai din stnga este coloana dup care a
fost parti ionat att indexul local, ct i tabela pe care a fost creat acesta.
De exemplu, presupunem c avem tabela TAB10 i indexul su
INDEX10, care au fost parti iona i dup coloanele COL1 i CIOL2.
Dac indexul INDEX10 este definit pe coloanele (COL1, COL2,
COL3), atunci el este local prefixat pentru c n partea cea mai din
stnga(prefix) a listei coloanelor de indexare se afl coloanele COL1 i
COL2 dup care s-a fcut partajarea tabelei i a indexului su. Dac
indexul INDEX10 ar fi definit pe coloanele (COL1, CO23) atunci
indexul este local neprefixat. Indecii locali nu pot fi parti iona i cu
clauza BY RANGE, aceast clauz se aplic numai pentru indecii
globali. Un index este global dac cheile dintr-o parti ie oarecare a
acestuia refer rnduri aflate n mai multe parti ii ale tabelei pentru care
a fost creat. La fel ca i n cazul indexului local putem avea index global
prefixat i index global neprefixa. Indexul global arat faptul c
partiionarea acestuia este definit de utilizator i nu trebuie s fie
echivalent cu parti ionarea tabelei pentru care se creeaz.
Definirea atributelor fizice ale indecilor comport aceleai reguli ca la
definirea atributelor fizice ale parti iilor unei tabele, cu deosebirea c
aici se folosesc pentru crearea unui index comenzile:
CREATE INDEX
sau
ALTER TABLE SPLIT PARTITION,
iar pentru modificarea atributelor fizice comenzile SQL
ALTER INDEX MODIFY PARTITION
sau
ALTER INDEX REBUILD PARTITION.

Crearea partiiilor unei tabele i ale unui index


Crearea parti iilor este similar cu cea a crerii tabelelor sau
indecilor.
Crearea partiiilor unei tabele se face cu comanda CREATE TABLE
folosind i clauza PARTITION.
Exemplu:
Avem tabela FACTURI ce cuprinde documente din anii 1999 2002. Tabela are printre alte coloane si coloanele AN, LUNA, ZI i dorim s
parti ionm tabela n trei parti ii, astfel nct parti ia 1 s con in date din
anii 1999 i 2000, parti ia 2 date din anul 2001, iar parti ia 3 date din anul
2001. Cu comanda de mai jos vom crea cele 3 parti ii, astfel:
CREATE TABLE facturi
(numar_factura NUMBER (12),
nume_furnizor VARCHAR(25),
an
NUMBER(4),
luna
NUMBER(2),
zi
NUMBER(2))
STORAGE (INITIAL 100K NEXT 50K) LOGGING
PARTITION BY RANGE (an, luna, zi)
(PARTITION p1_1999_2000 VALUES LESS THAN (2001, 13, 32)
TABLESPACE tabsp_1 NOLOGGING,
PARTITION p1_2001 VALUES LESS THAN (2002, 13, 32)
TABLESPACE tabsp_2 NOLOGGING,
PARTITION p1_2002 VALUES LESS THAN (2001, 13, 32)
TABLESPACE tabsp_3 NOLOGGING);
Crearea partiiilor unui index se face cu comanda CREATE
INDEX folosind i clauza PARTITION. Activitatea comport unele
diferen e de la un tip de index la altul, conform exemplelor de mai jos:
Exemple:
1) Crearea unui index local prefixat pentru tabela de mai sus cu
specificarea parti iilor:
CREATE INDEX index_loc_prefix ON facturi (an, luna, zi,
numr_factur)
LOCAL (PARTITION p1 TABLESPACE tabsp1,
PARTITION p2 TABLESPACE tabsp1,
PARTITION p3 TABLESPACE tabsp1);
2) Crearea unui index local prefixat pentru tabela de mai sus fr
specificarea parti iilor:
CREATE INDEX index_loc_prefix ON facturi (an, luna, zi,
numr_factur) LOCAL;

3) Crearea unui index local neprefixat pentru tabela de mai sus cu


specificarea parti iilor:
CREATE INDEX index_loc_prefix ON facturi
LOCAL (PARTITION p1 TABLESPACE tabsp1,
PARTITION p2 TABLESPACE tabsp1,
PARTITION p3 TABLESPACE tabsp1);
4) Crearea unui index local neprefixat pentru tabela de mai sus fr
specificarea parti iilor:
CREATE INDEX index_loc_prefix ON facturi (an, lun, zi)
LOCAL;
5) Crearea unui index global prefixat pentru tabela de mai sus cu
specificarea numelui parti iilor i a parametrului GLOBAL:
CREATE INDEX index_loc_prefix ON facturi (an, luna, zi,
numr_factur)
GLOBAL PARTITION BY RANGE (an, luna, zi)
(PARTITION p1_1999_2000 VALUES LESS THAN (2001, 13, 32)
TABLESPACE tabsp_1 NOLOGGING,
PARTITION p1_2001 VALUES LESS THAN (2002, 13, 32)
TABLESPACE tabsp_2 NOLOGGING,
PARTITION p1_2002
VALUES LESS THAN (2001, 13, 32)
TABLESPACE tabsp_3 NOLOGGING);
6) Crearea unui index global prefixat pentru tabela de mai sus fr
specificarea numelui parti iilor i a parametrului GLOBAL:
CREATE INDEX index_loc_prefix ON facturi (an, luna, zi,
numr_factur)
PARTITION BY RANGE (an, luna, zi)
(PARTITION VALUES LESS THAN (2001, 13, 32)
TABLESPACE tabsp_1 NOLOGGING,
PARTITION VALUES LESS THAN (2002, 13, 32)
TABLESPACE tabsp_2 NOLOGGING,
PARTITION VALUES LESS THAN (2001, 13, 32)
TABLESPACE tabsp_3 NOLOGGING);
7) Crearea unui index global prefixat pentru tabela de mai sus cu
specificarea numelui parti iilor i a parametrului GLOBAL, cu un
numr de parti ii diferit de cel al parti iilor tabelei pe care se creaz i cu
alte coloane de parti ionare dect cele dup care s-a parti ionat tabela:
CREATE INDEX index_loc_prefix ON
facturi
(an,lun,
numr_factur)
GLOBAL PARTITION BY RANGE (an, lun)
(PARTITION p1_1999_2001 VALUES LESS THAN (2002, 13)
TABLESPACE tabsp_1 NOLOGGING,

PARTITION p1_2001 VALUES LESS THAN (2003, 13)


TABLESPACE tabsp_2 NOLOGGING);
Intreinerea partiiilor
ntreinere a partiiilor se realizeaz prin executarea activit ilor de
modificare, mutare, adugare, distrugere, trunchiere, splitare, reunire a
acestora, precum i schimbarea partiiilor i reconstruirea partiiilor index.
Modificarea unei parti ii a unei tabele se face cu comanda ALTER
TABLE cu clauza MODIFY PARTITION. Cu aceast comand se
pot modifica atributele fizice ale parti iei sau ale parti iei indexului
aferent.
Mutarea partiiilor unei tabele sau index se face pentru a schimba
tabela spa iu n care rezid acestea din diverse considerente, dintre care
cele de ob inere a unor performan e n exploatarea sunt cele mai
frecvente. Opera ia se execut cu comanda ALTER TABLE cu
op iunea MOVE PARTITION.
Exemplu:
ALTER TABLE tab10 MOVE PARTITION part1 TABLESPACE
tabsp10 NOLOGGING;
Mutarea parti iei unei tabele care con ine date, determin necesitatea
recrerii tuturor indecilor locali sau globali ataa i acesteia.
Adugarea unor noi parti ii se poate executa doar pentru o tabel
parti ionat sau un index local. Opera ia se execut cu comanda ALTER
TABLE cu op iunea ADD PARTITION.
Exemplu:
ALTER TABLE tab100 ADD PARTITION part1 VALUES LESS
THAN (935);
O nou parti ie poate fi adugat doar dup parti ia cu limita
superioar cea mai mare. Dac dorim s adugm o parti ie la nceput,
ntre parti iile existente sau dup ultima parti ie care are limita
superioar egal cu valoarea MAXVALUE, atunci acest lucru se poate
realiza prin splitarea unei parti ii, n cazul de fa prima, una adiacent
cu locul de inserare a noii parti ii, i respectiv ultima parti ie. Dac
pentru tabela parti ionat creia i adugm o nou parti ie exist un
index local, atunci SQL creeaz automat o parti ie de index pentru
noua parti ie adugat.
Distrugerea partiiilor unei tabele se face dup anumite reguli func ie
de situa iile n care se afl parti ia, cu ajutorul comenzii ALTER
TABLE cu op iunea DROP PARTITION. Distrugerea partiiei unei
tabele care conine date i a indexului global se poate face lsnd

nealtera i indecii globali n timpul distrugerii parti iei, dup care acetia
vor fi recrea i sau tergnd toate rndurile parti iei cu comanda
DELETE dup care distrugem parti ia. Aceast comand actualizeaz
indecii globali. Distrugerea partiiei unei tabele care conine date i a
constrngerilor refereniale de integritate se poate face dezactivnd
constrngerile de integritate, distrugnd parti ia i apoi reactivnd
constrngerile de integritate. tergerea rndurilor parti iei cu comanda
DELETE, apoi distrugem parti ia.
Distrugerea partiiilor unui index se face dup anumite reguli func ie
de situa iile n care se afl parti ia, cu ajutorul comenzii ALTER
INDEX cu op iunea DROP PARTITION. O parti ie a unui index local
nu poate fi distrus, ea se distruge implicit atunci cnd se distruge
parti ia tabelei creia i corespunde. O parti ie fr date a unui index
global poate fi distrus. Dac o parti ie a unui index global con ine date,
atunci prin distrugerea acesteia parti ia urmtoare devine invalid i
trebuie recreat;
Trunchierea partiiilor unei tabele se face cu comanda ALTER
TABLE cu op iunea TRUNCATE PARTITION i are ca efect
tergerea tuturor rndurilor de date din aceast parti ie i a parti iei
corespunztoare a indexului local asociat, dac exist. Parti iile
indecilor nu pot fi trunchiate, singur trunchiere posibil este cea
specificat mai sus. Trunchierea unei parti ii a unei tabele i a indecilor
globali asocia i i/sau a constrngerilor de integritate referen ial se face
dup aceleai reguli ca i opera ia de distrugere.
Splitarea partiiilor unei tabele sau ale unui index se face cu comanda
ALTER TABLE/INDEX cu op iunea SPLIT PARTITION. O parti ie
a unei tabele ce con ine date, prin splitare to i indecii asocia i devin
inutilizabili i ca atare acetia trebuie recrea i. Numai parti ia fr date
nu invalideaz indecii. Parti ia unui index poate fi splitat numai dac
indexul este global i nu con ine date, cci parti ia unui index local se
spliteaz automat atunci cnd se spliteaz parti ia tabelei creia i
corespunde.
Fuzionarea sau reunirea parti iilor unei tabele sau ale unui index se
face cu ajutorul comenzilor ALTER TABLE/INDEX i cu una din
op iunile DROP PARTITION sau EXCHANGE PARTITION, pentru
c o op iune explicit de fuzionare nu exist. O parti ie a unei tabele
poate fi reunit cu alt parti ie numai dac nu are indeci globali sau
constrngeri de integritate referen iale asociate. Fuzionarea unei parti ii
a unei tabele se face totdeauna cu parti ia imediat superioar.
Presupunem c avem tabela TAB10 cu parti iileP1, P2, P3 i P4 i vrem

s reunim parti ia P2 cu P3, se vor exporta datele din tabele P2, se


execut comanda ALTER TALE tab10 DROP PARTITION p2 ,
dup care importm datele exportate n parti ia P3.
Fuzionarea sau reunirea partiiilor unui index local se face implicit
cnd se reunesc parti iile corespunztoare ale acestora, iar fuzionarea a
dou parti ii P2 i P3, care con in date, ale unui index global, se poate
face astfel:
ALTER INDEX index_global DROP PARTITION p2;
ALTER INDEX index_global REBUILD PARTITION p3;
Schimbarea partiiilor realizeaz transformarea unei parti ii a unei
tabele ntr-o tabel neparti ionat sau o tabel neparti ionat ntr-o
parti ie a unei tabele parti ionate. Opera ia se execut cu comanda
ALTER TABLE cu op iunea EXCHANGE PARTITION.
6. CREAREA I ACTUALIZAREA VEDERILOR
O viziune (vedere sau tabel virtual) este o form de prezentare a
datelor din una sau mai multe tabele sau viziuni pentru un utilizator,
ob inut prin executarea unei cereri. O viziune este tratat ca o tabel i se
mai numete i tabel virtual.
Utilizatorul care creeaz viziunea trebuie s aib privilegiul
CREATE VIEW sau CREATE ANY VIEW. Proprietarul viziunii trebuie s
aib, n mod explicit, acordate privilegiile de acces la toate obiectele referite
de ctre viziune, privilegii ce nu pot fi ob inute prin intermediul rolului. De
asemenea, func ionalitatea unei viziuni depinde de privilegiile proprietarului
acesteia. De exemplu, dac proprietarul viziunii are privilegiul SELECT
pentru tabela din care s-a creat viziunea (numit i tabel de baz), atunci
acesta poate executa prin intermediul viziunii doar opera ii de SELECT din
tabel.
Opera ia se execut cu comanda SQL CREATE VIEW, astfel:
1)
CREATE VIEW v10 AS
SELECT col1, col2, col4
FROM tab2
WHERE col1 = 20;
Crearea unei viziuni v10, cu coloanele col1, col2 i col4, ca un
subset de date din tabela tab2, care are coloanele col1,col2,col3,col4,col5
2)
CREATE VIEW v11 AS
SELECT col1, col2, col4, col7
FROM tab2, tab3
WHERE tab2.col1 = tab3.col1;

Crearea viziunii v11ca reuniune a unor date din tabelele tab2


(col1,col2,col3,col4,col5) i tab3 (col1, col8, col9):
Dac n timpul crerii unei viziuni SQL detecteaz anumite erori
acestea sunt semnalate, iar dac se folosete op iunea FORCE viziunea este
totui creat cu starea INVALID. Cu aceast op iune o vedere poate fi creat
chiar dac tabela sau tabelele de baz nu exist. Viziunea astfel creat va fi
valid, deci va pute fi utilizat, abia dup ce se va crea tabela de baz, iar
proprietarul viziunii va primi drepturile necesare de utilizare a acestora.
Vederea de tip reuniune (vedere join) este definit ca vederea care
cumuleaz rnduri din mai multe tabele. Modificarea unei astfel de vederi se
face respectndu-se condi ia de cheie rezervat. O tabel se numete tabel
cu cheie rezervat dac orice cheie a acesteia poate fi cheie n vederea tip
reuniune a crei tabel de baz este. Altfel spus, o tabel cu cheie rezervat
are cheile rezervate n cadrul vederii join. Prin intermediul unei astfel de
vederi se pot actualiza date (UPDATE, DELETE sau INSERT) numai n
tabela de baza care con ine cheia sau cheile rezervate, cu condi ia
obligatorie ca op iunea SELECT de creare a vederii s nu conin una din
clauzele DISTINCT, GROUP BY, START WITH, CONNECT BY,
ROWNUM i nici o operaie de setare de tip UNION, UNION ALL,
INTERSECT sau MINUS. Deci prin intermediul unei vederi de tip reuniune
se pot modifica date numai asupra coloanelor care se mapeaz pe tabela de
baz care con ine cheia sau cheile rezervate. Cu ajutorul vederilor
ALL_UPDATABLE_COLUMNS, DBA_UPDATABLE_COLUMNS i
USER_UPDATABLE_COLUMNS din dic ionarul de date se pot ob ine
informa ii despre coloanele vederii de tip reuniune ce pot fi modificate.
Inlocuirea unei vederi este opera ia de recrearea acesteia i se
execut prin distrugerea vederii i recrearea acesteia si redefinirea vederii cu
clauza OR REPLACE.
Exemplu:
CREATE OR REPLACE VIEW v10 AS
SELECT col1, col2 FROM tab2
WHERE col1 = 30;
nainte de a nlocui o vedere, trebuie avute n vedere urmtoarele
efecte:
nlocuirea unei vederi determin nlocuirea defini iei acesteia din
dic ionarul de date;
Dac n vedere nlocuit a existat clauza CHECK OPTION, iar n
defini ia noii vederi nu mai este inclus, aceast clauz este distrus;
Toate vederile i programele PL/SQL dependente de vedere nlocuit
devin invalide.

Distrugerea vederilor se execut cu comanda DROP VIEW .


Vederea partiionat mparte o tabel foarte mare n buc i mai mici
numite parti ii i le reunete pe acestea pentru a se ob ine performan e n
administrare i regsirea datelor. Cererile care folosesc anumite intervale de
valori conforme cu cele folosite la crearea parti iilor vor regsi date numai
din parti iile aferente acestora. O vedere parti ionat se creeaz folosind
constrngerea de integritate CHECK sau clauza WHERE. Considerm
tabelele t1, t2 i t3 cu aceleai coloane, deci pot fi considerate parti ii ale
unei tabele care la nsumeaz.
Exemplu:
ALTER TABLE t1 ADD CONSTRAINT c1 CHECK (col1 between
0 and 1000);
ALTER TABLE t2 ADD CONSTRAINT c1 CHECK (col1 between
1000 and 10000);
ALTER TABLE t3 ADD CONSTRAINT c1 CHECK (col1 between
10000 and 100000);
CREATE VIEW v10 AS
SELECT * FROM t1 UNION ALL
SELECT * FROM t2 UNION ALL
SELECT * FROM t3;
CREATE VIEW v10 AS
SELECT * FROM t1 WHERE col1 between 0
and 1000
UNION ALL
SELECT * FROM t2 WHERE col1 between 1000
and 10000
UNION ALL
SELECT * FROM t3 WHERE col1 between 10000 and 100000);
7. CREAREA I ACTUALIZAREA SECVEN ELOR
Secvenele sunt numere unice de identificare a coloanelor unei
tabele i pot fi utilizate la efectuarea diferitelor opera ii ntr-o aplica ie.
Crearea unei secven e se execut cu comanda CREATE
SEQUENCE, astfel:
CREATE SEQUENCE secv_1 INCREMENT BY 1
START WITH 1
NOMAXVALUE
CACHE 10;
unde:
INCREMENT BY arat valoare cu care se incrementeaz o secven curent
pentru a se ob ine secven a urmtoare,

START WITH este valoarea de pornire a secven ei(prima valoare),


NOMAXVALUE arat c nu avem o limit superioar pn unde se pot
genera secven e,
CACHE definete numrul de secven e viitoare care se pstreaz anticipat n
memorie pentru ob inerea unor performan e superioare. Cnd aceast
valoare se epuizeaz SQL ncarc n memorie urmtorul se de secven e.
Modificarea unei secven e se face cu comanda SQL ALTER
SEQUENCE i poate opera asupra parametrilor ini iali ai comenzii de
creare a secven ei.
Parametrul de ini ializare SEQUENCE_CACHE_ENTRIES
determin numrul secven elor care pot fi inute n memorie de SQL.
Distrugerea secven elor se face cu comanda SQL DROP
SEQUENCE.
Referirea secven elor se face cu pseudocoloanele NEXTVAL i
CURRVAL , n care:
NEXTVAL genereaz urmtoarea valoare a secven ei. Referirea se face prin
nume_secven.NEXTVAL.
Exemple:
1)
CREATE SEQUENCE secv1;
INSERT INTO tab1 (COL1, COL2) VALUES (secv1.NEXTVAL,
300);
CURRVAL definete valoarea curent a secven ei i se refer prin
nume_
2)
INSERT INTO tab10
(COL4, COL5)
VALUES
(secv1.CURRVAL, 1300);
INSERT INTO tab10
(COL4, COL5)
VALUES
(secv1.CURRVAL, 2 300);
Valoarea NEXTVAL poate fi referit o singur dat, iar valoarea
CURRVAL de mai multe ori, cu condi ia ca valoarea NEXTVAL s fi fost
referit, deci secven a curent s fi fost creat.
8. CREAREA I ACTUALIZAREA SINONIMELOR
Sinonimul este un alt nume (alias) pentru o tabel, o vedere,
secven , procedur, func ie sau pachet. Sinonimul poate fi public sau
privat. Sinonimul public este inclus n schema unui grup de utilizatori numit
PUBLIC i este accesibil tuturor utilizatorilor, iar cel privat apar ine numai
unui anumit utilizator.
Crearea sinonimului se face cu comanda CREATE SYNONYM i
se distruge cu comanda DROP SYNONYM.
Exemple:

Crearea unui sinonim privat:


CREATE SYNONYM sin1 FOR tab10;
Crearea unui sinonim public:
CREATE PUBLIC SYNONYM sin10 FOR tab10;
Distrugerea unui sinonim:
DROP SYNONYM sin1;
DROP PUBLIC SYNONYM sin10;
9. CREAREA I ACTUALIZAREA GRUPURILOR DE TABELE I A
GRUPURILOR DE INDECI
Grupul de tabele (cluster) este o metod de memorare comprimat
a unor tabele de date care au coloane comune i care sunt foarte des folosite
mpreun.
Cheia grupului (key cluster) este coloana sau grupul de coloane pe
care tabelele grupate le au comune. Cheia grupului se va specifica atunci
cnd se creeaz acesta i atunci cnd se creeaz tabelele ce vor fi incluse n
grup. Fiecare valoare a cheii de grup se va memora o singur n cadrul
grupului de tabele sau al grupului de indeci indiferent de cte ori apare
aceasta n tabelele grupului.
Coloanele care se aleg pentru a fi definite cheile de grup sunt cele
folosite cel mai mult pentru a reuni tabelele atunci cnd se execut o
anumit cerere. Cea mai bun cheie de grup este aceea care are suficiente
valori unice, astfel nct rndurile care se grupeaz dup aceasta s poat fi
incluse ntr-un singur bloc de date. Astfel dac avem prea puine rnduri pe
o cheie de grup ob inem o pierdere a spa iului de memorie i performan e
neglijabile, iar dac avem prea multe timpul de cutare suplimentar, cutare
n mai multe blocuri de date, va duce la degradarea performan elor.
Setarea parametrilor de memorie PCTFREE i PCTUSED trebuie
fcut cu mare grij, astfel nct s nu afectm spa iul utilizat pentru
inserarea rndurilor i nici pe cel ce va fi folosi pentru actualizarea datelor
aferente rndurilor inserate n bloc. Valorile acestor parametrii folosite la
definirea grupului sunt automat utilizate i pentru tabelele ce vor fi grupate.
Chiar dac vom specifica aceti parametrii la crearea unei tabele n cadrul
grupului ei vor fi ignora i.
Specificarea spaiului necesar pentru memorarea rndurilor aferente
unei chei de grup se face prin intermediul clauzei SIZE a comenzii SQL
CREATE CLUSTER. Valoarea acestui parametru este specificat n bytes i
reprezint spa iul ce trebuie rezervat n cadrul blocului de date aferent
grupului pentru memorarea valorii sau valorilor cheii de grup. Prin
intermediul acestuia, SQL determin numrul rndurilor de date ce ncap

ntr-un bloc de date al grupului. Dac SIZE este specificat astfel nct ntrun bloc de date s ncap dou chei de grup atunci spa iul acestui bloc este
folosit de ambele chei, iar dac un bloc de date nu poate cuprinde toate
rndurile aferente unei chei de grup, cheia de grup se memoreaz o singur
dat, iar blocurile de date se nln uiesc de blocul n care se afl cheia de
grup. Dac ntr-un bloc de date ncap mai multe chei de grup, atunci acesta
poate s apar in mai multor lan uri de date.
Specificarea locului (tabelei spaiu) n care s fie plasat grupul de
tabele i grupul index asociat este obligatorie la crearea acestor grupuri.
Crearea grupului de tabele (cluster) se face cu comand SQL
CREATE CLUSTER. Se va crea nti grupul de tabele i apoi tabelele ce vor
face parte din grup. Atributele fizice se furnizeaz o singur dat, doar
pentru grup nu i pentru tabele.
Exemplu:
CREATE CLUSTER grup1 (col1 NUMBER (5))
PCTUSED 75 PCTFREE 10
SIZE 600
TABLESPACE tabsp1
STORAGE (INITIAL 200k
NEXT 290k
MINEXTENTS 3
MAXEXTENTS 25
PCTINCREASE 30);
CREATE TABLE tab1 (col1 NUMBER(5) PRIMARY KEY, col2
NUMBER (10), ) CLUSTER grup1 (col1);
CREATE TABLE tab2 (col3 NUMBER(5) PRIMARY KEY, col4
NUMBER (10), ,
col1 NUMBER (5) REFERENCE tab1(col1)) CLUSTER grup1
(col1);
unde col1 este cheia grupului.
Crearea grupului de indeci (cluster) se face cu comand SQL
CREATE INDEX cu clauza ON CLUSTER. Se va crea nti grupul de tabele
i apoi grupul de indeci asociat.
Exemplu:
CREATE INDEX index1
ON CLUSTER grup1
INITRANS 2
MAXTRANS 5
TABLESPACE tabsp2GR

PCTFREE 10
STORAGE (INITIAL 50k
NEXT 50k
MINEXTENTS 3
MAXEXTENTS 25
PCTINCREASE 30);
Modificarea grupurilor de tabele sau de indeci se face cu
comanda SQL ALTER CLUSTER. Elementele ce pot face obiectul
modificrii sunt atributele fizice ale grupului.