You are on page 1of 126

UNIVERSITATEA DIN BACĂU

FACULTATEA DE INGINERIE

Gheorghe Hazi

BAZE DE DATE II
(ORACLE)

CURS PENTRU UZUL STUDENŢILOR

Bacău - 2007
Baze de date Oracle

CUPRINS

1. Introducere ............................................................................................................4
1.1. Caracteristici principale ale bazei de date Oracle...........................................4
1.2. Concepte şi facilităţi ale bazei de date Oracle................................................6
2. Arhitectura bazei de date Oracle..........................................................................10
2.1. Structura fizică a bazei de date......................................................................10
2.2. Structura logică a bazei de date.....................................................................11
2.3. Instanţa Oracle..............................................................................................12
2.4. Procesarea instrucţiunilor SQL.....................................................................16
3. Unelte de bază pentru administrare......................................................................18
3.1. Oracle Universal Installer (OUI)...................................................................18
3.2. Oracle Database Configuration Assistant (DBCA).......................................19
3.3. SQL Plus........................................................................................................20
3.4. Oracle Enterprise Manager (OEM)...............................................................24
4. Managementul unei instanţe oracle .....................................................................26
4.1. Parametrii de iniţializare...............................................................................26
4.2. Pornirea şi oprirea bazei de date...................................................................29
5. Crearea unei baze de date…………………………………………………….....32
5.1. Cerinţe pentru crearea unei baze de date.......................................................32
5.2. Crearea manuală a bazei de date...................................................................33
6. Dicţionarul bazei de date şi vederi.......................................................................38
6.1. Obiecte ale bazei de date...............................................................................38
6.2. Vederi statice ale bazei de date......................................................................39
6.3. Vederi dinamice ale bazei de date.................................................................46
7. Managementul fişierelor bazei de date.................................................................50
7.1. Fişierele de control........................................................................................50
7.2. Fişierele jurnal (redo log)..............................................................................52
7.3. Tablespace şi fişiere de date..........................................................................55
8. Managementul tabelelor şi a datelor.....................................................................58
8.1. Tipuri de date.................................................................................................58
8.2. Tipuri de tabele.............................................................................................60
8.3. Crearea unei tabele.........................................................................................60
8.4. Specificarea clauzelor de stocare...................................................................62
8.5. Modificarea şi ştergerea tabelelor.................................................................63
8.6. Managementul indecşilor..............................................................................65
9. Integritatea datelor şi restricţii în baza de date......................................................67
9.1. Metode de control a integrităţii datelor..........................................................67
9.2. Stări ale restricţiilor........................................................................................67
9.3. Verificarea restricţiilor...................................................................................68
9.4. Utilizarea cheilor în tabele.............................................................................68
9.5. Crearea, modificarea şi ştergerea restricţiilor................................................68
Cuprins
-2-
Baze de date Oracle

10. Managementul utilizatorilor şi securitatea informaţiilor....................................72


10.1. Utilizarea profilelor pentru utilizatori...............................................72
10.2. Scheme şi utilizatori în baza de date.................................................76
10.3. Crearea şi administrarea utilizatorilor..............................................77
10.4. Administrarea privilegiilor...............................................................79
10.5. Administrarea rolurilor.....................................................................81
11. SQL în ORACLE................................................................................................84
11.1. Oracle SQL Plus...............................................................................84
11.2. Particularităţi SQL în Oracle............................................................86
12. Programe stocate în baza de date........................................................................95
12.1. Administrarea pachetelor de programe.............................................95
12.2. Mediul de programare PL/SQL.........................................................97
12.2.1. Structuri de control..........................................................................100
12.2.2. Executarea SQL în mediul PL/SQL................................................102
12.2.3. Tratarea erorilor în PL/SQL............................................................106
13. Utilitare ale bazei de date Oracle
13.1. Exportul datelor în ORACLE..........................................................108
13.2. Importul datelor în ORACLE..........................................................111
13.3. SQL LOADER.................................................................................113
14. Monitorizarea şi optimizarea funcţionării bazei de date....................................115
14.1. Monitorizarea funcţionării bazei de date..........................................115
14.2. Managementul automat al stocării....................................................117
14.3. Managementul automat al memoriei................................................118
14.4. Salvarea şi restaurarea bazei de date................................................118

Bibliografie.........................................................................................................127

Cuprins
-3-
Baze de date Oracle

1. INTRODUCERE

În general, o bază de date reprezintă o colecţie de date tratate unitar. Scopul unei
baze de date este acela de a stoca şi regăsi informaţiile. Serverul de bază de date este
soluţia prin care se rezolvă managementul informaţiei. De cele mai multe ori un server
manipulează o cantitate mare de informaţii, cu acces simultan a mai multor utilizatori a
aceloraşi informaţii. Baza de date previne accesul neautorizat şi oferă soluţii eficiente
pentru recuperarea informaţiilor în cazul unor incidente.
Baza de date Oracle a apărut în versiunea 1 în anul 1978. Ea a fost scrisă în
limbaj de asamblare şi rula pe sisteme PDP-11 (în România Independent şi Coral) pe
sisteme de operare RSX cu 128 k memorie. Versiunea 2, prima versiune comercială, a
apărut în 1979. Această versiune a fost prima baza de date relaţională bazată pe SQL.
Firma a luat numele de Oracle în 1982. Ultimele versiuni au apărut în 1998 (versiunea
8), 2001 (versiunea 9), 2003 (versiunea 10g).
În acest curs vom studia versiunea 10 g.

1.1. Caracteristici principale ale bazei de date Oracle

Câteva caracteristici sunt date în tabelele 1.1÷1.5


Tabelul 1.1
Caracteristici principale baza de date Oracle 10 g - date
Tip de dată Limite Observaţii
Fişier binar max 4 GB
BLOB (Binary 8÷128 TB Numărul de coloane BLOB este
Large OBject) limitat numai de numărul maxim
de coloane dintr-un tabel
VARCHAR2 4000 bytes
(şir de caractere)
NUMBER ±10125 Cu reprezentarea mantisei pe 38
de biţi

Tabelul 1.2
Caracteristici principale baza de date Oracle 10 g
Limite ale bazei d date
Caracteristică Tip limită Valoare
Mărimea blocului Minim 2048 bytes
bazei de date Maxim 32 K
Mărime fişier bază Maxim Limita maximă admisă de SO
de date uzual 222 x 4 M
Fişiere de control Minim 1 – Se recomandă 2 sau mai
multe stocate pe discuri fizice
diferite
Număr de fişiere al Maxim/tablespace 1022
bazei de date Maxim pe baza de 65533
date
Tablespace (spaţii Număr maxim pe 64 K
pentru tabele) bază de date Nu poate depăşi numărul de
fişiere al bazei de date

Introducere
-4-
Baze de date Oracle

Tabelul 1.3
Caracteristici principale baza de date Oracle 10 g
Limite logice ale bazei de date
Caracteristică Tip limită Valoare
Număr de coloane Maxim/tabelă 1000
Restricţii Maxim/coloană nelimitat
Subqueries Maxim de nivele Nelimitat în clauza FROM
într-o interogare 255 în clauza WHERE
SQL
Linii Număr maxim într- Nelimitat
o tabelă
Număr tabele Maxim/bază de Nelimitat
date
Număr utilizatori Maxim 2147483638

În ceea ce priveşte sistemul de operare şi serverul de bază de date, există 18


variante pentru diverse sisteme de operare şi platforme hardware. Avem variante pentru
UNIX, LINUX, WINDOWS 32, WINDOWS 64, pe mai multe variante de procesoare şi
hardware.
Oracle este o bază de date obiectuală şi relaţională. Este o bază de date
obiectuală întrucât suportă obiecte (componente care pot stoca date, efectua prelucrări şi
trimite mesaje către alte obiecte). Este o bază de date relaţională întrucât în discţionarul
bazei de date sunt scrise relaţiile între tablele şi restricţiile impuse câmpurilor.
Baza de date are o structură logică şi una fizică. Întrucât structura logică este
separată de cea fizică, se poate modifica structura fizică (din condiţii de eficienţă) fără a
afecta structura logică.
Oracle 10g utilizează conceptul de „grid computing”. Se operează cu sisteme
care sunt formate din mai multe entităţi care funcţionează ca un întreg. Se realizează o
balanţă între beneficiile unui sistem unic şi un sistem flexibil răspândit în mai multe
locaţii.
Resursele IT cuprind:
• infrastructura – hardware şi software care creează condiţiile pentru stocarea
datelor şi mediu pentru execuţia programelor
• aplicaţii – programele şi fluxul specific procesului
• date (informaţii).
„Grid computing„ – se bazează pe următoarele principii:
• virtualizare – resurse individuale (calculatoare, discuri, aplicaţii şi informaţii)
sunt grupate pentru a putea fi utilizate de utilizatori sau aplicaţii
• oferirea de resurse atunci când se solicită acest lucru, cu optimizarea
sistemului în ansamblu.
Fiecare bază de date este constituită din unul sau mai multe fişiere fizice. Există
fişiere de date care stochează colecţii de tabele numit tablespace. Baza de date cuprinde
şi fişiere de control care conţin date despre structura fizică a acesteia: numele bazei de

Introducere
-5-
Baze de date Oracle
date, fişierele de date, fişierele jurnal (redo log). De obicei, din motive de siguranţă,
există mai multe copii ale fişierului de control. Fişierele jurnal înregistrează toate
modificările din baza de date cu scopul de a putea reface starea acesteia la un moment
dat. Şi aceste fişiere pot avea mai multe copii pe mai multe discuri.
Fiecare bază de date este împărţită logic pe mai multe tablespaceuri. Există două
tablespace utilizate de baza de date SYSTEM şi SYSAUX.
Obiectele bazei de date sunt reţinute logic într-o schemă. O schemă reprezintă
toate obiectele din baza de date deţinute de un utilizator al bazei de date. Principale
obiecte conţinute într-o schemă sunt:
¾ tabele
¾ vederi – sunt tabele virtuale rezultate ale unei interogări tip SQL
¾ indecşi
¾ clustere – o grupare de două sau mai multe tabele care folosesc
aceeaşi coloană
¾ secvenţe – sistem automat de generare a unui şir de numere cu un
anumit pas
¾ sinonime – este un alias (un nume suplimentar) pentru tabele,
secvenţe, proceduri, etc.

1.2. Concepte şi facilităţi ale bazei de date Oracle

Oracle include câteva mecanisme pentru a realiza următoarele funcţii de bază:


• acces concurent pentru mai mulţi utilizatori cu timpi cât mai mici
• informaţiile trebuie citite şi modificate într-o manieră consistentă – o
informaţie văzută sau modificată de un utilizator nu poate fi modificată de alţi
utilizatori până când utilizatorul nu încheie lucrul cu acea informaţie
În acest scop baza de date asigură următoarele:
- citirea consistentă a informaţiilor
ƒ garantează că setul de date generat de o interogare respectă un
moment clar şi că datele nu se modifică în timpul integorării
ƒ asigură că cei care citesc baza de date nu aşteaptă alţi
utilizatori care accesează aceeaşi informaţie
ƒ asigură că cei care scriu date nu aşteaptă pe cei care citesc
aceeaşi informaţie
ƒ asigură că cei care scriu o informaţie în baza de date aşteaptă
numai alţi utilizatori care încearcă să modifice aceeaşi linie
dintr-un tabel al bazei de date
Metoda simplă prin care se asigură aceste lucruri este crearea
unei imagini parţiale a bazei de date pentru fiecare utilizator.
- utilizarea unor înregistrări temporare (undo records) – atunci când un
utilizator modifică o informaţie modificarea este văzută numai de
acel utilizator atâta timp cât el nu realizează comiterea (scrierea în
baza de date). Atâta timp cât informaţiile rămân în memorie sau în

Introducere
-6-
Baze de date Oracle
tablespace specific ca informaţii necomise, ceilalţi utilizatori văd
informaţiile nemodificate.
- tranzacţii numai în citire – de obicei interogările reflectă situaţia la un
moment dat al bazei de date. Totuşi dacă vrem să efectuăm mai multe
interogări pe o bază de date, toate reflectând acelaşi moment, se
utilizează tranzacţii în citire.
- mecanisme de blocare – dacă o dată este modificată de un utilizator
se blochează modificarea de către alţi utilizatori până la comiterea ei
cu scopul ca toţi utilizatorii să vadă datele modificate de utilizatorii
precedenţi. Blocarea este automată, fără intervenţia utilizatorilor.
Pentru activităţi de administrare baza de date poate fi trecută în mod restrictiv
prin oprire şi deschidere cu restricţii.

Principalele facilităţi oferite de baza de date Oracle sunt:


- Real Appliation Clusters (RAC) – cuprinde câteva instanţe Oracle care rulează
în mai multe calculatoare care funcţionează în grup, baza de date fiind văzută logic ca
una singură.
- portabilitate – aşa cum am arătat mai sus bazele de date Oracle au fost
dezvoltate pe mai multe platforme software şi hardware. La trecerea unei baze de date
de pe o platformă pe alta aplicaţiile rulează fără nici o modificare. Acest lucru este
asigurat de faptul că codul de bază (PL/SQL) este identic pe toate platformele.
- facilităţi de administrare – administrarea de către administratori (DBA – Data
Base Administrator) presupune pe, lângă crearea bazei de date, monitorizarea şi
asigurarea funcţionări cu viteză cât mai mare. Pentru a uşura munca de administrare s-a
creat un utilitar Oracle Enterprise Manager. De la distanţă se pot efectua următoarele
activităţi:
- administrarea completă a bazei de date
- diagnosticarea, modificarea şi customizarea mai multor baze de date
- programarea lucrărilor în baza de date
- monitorizarea funcţionării bazei de date în reţea
- SQL *Plus – este un mediu text sau grafic care permite introducerea şi testarea
procedurilor SQL. Permite executarea interogărilor SQL şi a blocurilor PL/SQL
(module de program). Permite efectuarea multor alte task-uri adiţionale.
- controlul automat al stocării fişierelor de date, control şi de jurnal – Automatic
Storage Management (ASM) – permite controlul automat al stocării datelor pe mai
multe discuri ataşate bazei de date. Redistribuirea fişierelor se face ori de câte ori
dimensiunea unuia dintre ele se modifică.
- programatorul de lucrări – permite un sistem complex de planificarea a
lucrărilor în baza de date
- facilităţi de salvare şi restaurare a bazei de date
- recuperarea bazei de date după diverse incidente
- flexibile posibilităţi de salvare
- disponibilitatea bazei de date pe perioada salvării
Baza de date dispune de un utilitar forte puternic RMAN (Recovery Manager)
care asigură restaurarea automată a datelor în caz de incident utilizând fişierele jurnal
Introducere
-7-
Baze de date Oracle
(redo log) şi ultima salvare validă. Alte utilitare în acest sens sunt Oracle Flashback şi
Oracle Data Gurad. Prin Oracle Flashback (figura 1.1) se asigură protecţia în cazul
incidentelor umane (de exemplu ştergerea voită a unei tabele) prin stocarea unor copii
parţiale ale bazei de date direct pe discurile active. La un incident nu mai este nevoie de
restaurare. Prin Oracle Data Guard se întreţine o bază de date suplimentară, situată în alt
loc. Salvarea suplimentară se face automat (figura
1.2).
Alte facilităţi ale bazei de date Oracle sunt:
- Data Warehousing – un modul utilizat
pentru stocarea şi regăsirea datelor cu
caracter istoric. Faţă de bazele de date
obişnuite, în acest caz actualizarea
informaţiilor nu reprezintă o prioritate ci
regăsirea, după cât mai multe criterii
- vederi materializate – reprezintă
rezultatul unei interogări stocat într-o
schemă separată
- procesarea paralelă a interogărilor –
permite împărţirea unei interogări în mai Figura 1.1
multe componente care se execută în Oracle Flashback
paralel
- online analytical processing (OLAP) – reprezintă o facilitate prin care
prelucrările sunt făcute o dată cu actualiazrea bazei de date în scopul
generării rapide a unor informaţii. Se oferă o serie de funcţii pentru prelucrări
complexe.

Figura 1.2
Oracle Data Guard

Introducere
-8-
Baze de date Oracle
- partiţionarea tabelelor – permite segmentarea tablelor după mai multe
criterii fapt ce permite căutarea paralelă în mai multe segmente care
pot fi stocate în tablespace diferite.
- câmpuri BLOB, CLOB – în care se pot stoca fişiere binare,
nestructurate de mari dimensiuni (video, muzică, imagini, diverse
documente)
- Oracle Text – oferă un motor pentru indexarea şi regăsirea
documentelor, util pentru realizarea unor baze de date pentru stocarea
şi regăsirea documentelor
- Oracle Intermedia – oferă obiecte şi metode pentru stocarea şi
manipularea informaţiilor tip sunet, video, text.
- Oracle Spatial – oferă o serie de obiecte şi metode pentru stocarea şi
prelucrarea informaţiilor geografice
- module de securitate - permit o serie de funcţii avansate cum ar fi:
ƒ prevenirea accesului neautorizat
ƒ auditarea accesului la informaţii (pe ore, tabele, etc);
ƒ limitarea resurselor pentru un utilizator
ƒ drepturi de acces pe obiecte, mergând până la nivel de
coloană din tabel sau chiar la nivel de linie (row level security
– RLS)
ƒ drepturi de acces pe tipuri de operaţii (citire, scriere, ştergere)
- controlul integrităţii informaţiilor prin restricţiile scrise în dicţionarul
bazei de date. Restricţiile permise sunt:
ƒ NOT NULL – câmpul trebuie completat obligatoriu
ƒ UNIQUE KEY – un câmp al unei coloane dintr-un tabel nu
poate avea două valori identice
ƒ PRIMARY KEY – cheie primară în tabel, valori unice şi
nenule
ƒ FOREIGN KEY – valoarea trebuie să se regăsească ca o
cheie primară în alt tabel, numit tabel părinte
ƒ CHECK – permite stabilirea unor limite pentru valorile unui
câmp. Câmpul trebuie să satisfacă o expresie logică.
- trigere – sunt proceduri care se activează automat atunci când au loc
evenimente în baza de date (citire, scriere, înserare, modificare)
- interogări distribuite – optimizează volumul de date transferat atunci
când se efectuează interogări pe mai multe baze de date distribuite în
spaţiu
- replicarea datelor – proceduri automate pentru replicarea unor
informaţii în mai multe baze de date
- dezvoltarea de aplicaţii – se bazează pe SQL şi PL/SQL care poate fi
scris în proceduri stocate, în medii de dezvoltare proprii (Oracle
Developper) dar şi interfeţe avansate pentru Java, C++, Vizual Basic,
XML, COBOL.
- utilizarea unui număr mare de variantă de limbă, inclusiv română.

Introducere
-9-
Baze de date Oracle

2. ARHITECTURA BAZEI DE DATE ORACLE

O bază de date Oracle conţine:


• un server de bază de date rulând un sistem de operare (UNIX, LINUX,
WINDOWS)
• fişierele bazei de date
• o instanţă Oracle cuprinzând procesele care gestionează accesul la baza de date.

2.1. Structura fizică a bazei de date

Fişierele bazei de date au o structură fizică şi o structură logică. Structura fizică


cuprinde un set de fişiere ale sistemului de operare (figura 2.1).

BAZA DE DATE ORACLE


Fisier cu
Fisiere de Fisiere jurnal Arhiva
parametrii Fisiere de date
control (Redo log) jurnale

Fisier
parole

Figura 2.1
Structura fizică a bazei de date
Fişierele de date conţin datele stocate în baza de date. Există două fişiere care sunt
utilizate de baza de date: SYSTEM01.DBF şi SYSAUX01.DBF şi care sunt create
automat o dată cu generarea bazei de date. În fişierul SYSTEM01.DBF se stochează
structura logică tablespace SYSTEM care conţine dicţionarul bazei de date (în mai
multe tabele) şi procedurile stocate ale bazei de date. SYSAUX01.DBF conţine
tablespace SYSAUX în care se stochează structuri mari de date utilizate intern de
ORACLE. De obicei, pentru utilizatori se creează tablespace USERS stocat în fişierul
UERS01.DBF. În procesul de funcţionare datele nu sunt scrise imediat în baza de date
ci sunt stocate în memorie (pentru rapiditate), scrierea în fişiere făcându-se în
background.
Fişierele de control conţin informaţiile necesare pentru a menţine şi pentru a
verifica integritatea bazei de date. Au implicit denumirea CONTROL01.CTL,
CONTROL02.CTL, CONTROL03.CTL, cele trei fişiere fiind identice. Numărul de
fişiere de control poate fi mai mare sau mai mic şi se recomandă stocarea lor în locuri
(harddiscuri diferite). Informaţiile stocate sunt date despre fişierele de date ale bazei de
date, fişierele redo log, numele bazei de date, etc. Sunt utilizate la deschiderea bazei de
date. De asemenea sunt utilizate la recuperarea bazei de date după incidente.
Fişierele jurnal (redo log) sunt utilizate pentru înregistrarea modificărilor efectuate

Arhitectura bazei de date Oracle


- 10 -
Baze de date Oracle
asupra datelor. Există două sau mai multe asemenea fişiere identice şi au rolul de a
recupera datele în caz de incident. Operaţiile asupra bazei de date se scriu rapid în
aceste fişiere.
Fişierul de parametrii conţine parametrii dinamici de configurare a bazei de date
care sunt stabiliţi la pornirea bazei de date. Principalii parametrii se referă la
configurarea zonelor de memorie. De obicei este un fişier ASCII.
Fişierul cu parole conţine parolele utilizatorilor privilegiaţi care pot starta sau opri
baza de date.
Fişierele arhivă cu jurnale conţin arhive ale fişierelor jurnal mai vechi. Prezenţa
lor este opţională.
Pe lângă fişierele de mai sus baza de date mai generează fişiere cu mesaje de
eroare şi cu înregistrări privind funcţionarea bazei de date. Acestea sunt fişiere ASCII şi
sunt utile administratorilor pentru depanarea unor erori şi pentru îmbunătăţirea
funcţionării bazei de date.

2.2. Structura logică a bazei de date

Baza de date este divizată din punct de vedere logic în mai multe unităţi numite
tablespace. Acestea grupează informaţii logice legate de obiecte la un loc. De exemplu
un tablespace grupează toate obiectele unei aplicaţii. Tablesapce pot fi gestionate de
administratori sau automat de către procesele din baza de date.
Blocurile de date sunt entităţile cele mai mici cu care operează baza de date. Un
bloc de date conţine un număr de blocuri ale sistemului de operare (de obicei 4 K).
Valorile uzuale ale dimensiunii blocului de date sunt 4096 sau 8192 bytes. Structura
unui bloc de date este dată în figura 2.2.
Extensiile sunt următorul nivel de
alocare a spaţiului în baza de date. Ele
reprezintă numărul de blocuri alăturate cu care
creşte spaţiul alocat într-un singur pas.
Segmentul reprezintă un set de extensii.
Toate datele sunt stocate în segmente. O
tabelă reprezintă cel puţin un segment de date.
Un caz particular îl reprezintă segmentul de
rollbak utilizat pentru stocarea mişcărilor
necomise.
Legătura între blocuri de date extensii şi
segment este arătată în figura 2.3.
Schema şi obiectele ei. O schemă
reprezintă o colecţie de obiecte ale bazei de
date. O schemă este proprietatea unui Figura 2.2
utilizator al bazei de date. Nu există o legătură Structura unui bloc de
date
obligatorie între tablespace şi schema, în
sensul că o schemă poate fi stocată în mai multe tablespace. O schemă poate conţine:
- tabele – reprezintă unitatea de bază în care Oracle stochează date accesibile direct
utilizatorilor. Fiecare tabelă conţine coloane şi linii.
Arhitectura bazei de date Oracle
- 11 -
Baze de date Oracle
- indecşi – reprezintă structuri opţionale asociate tabelelor care permit regăsirea
rapidă a informaţiilor. Sunt create din una sau mai multe coloane ale tabelei
asociate. Modificarea unei tabele, în sensul adăugării sau ştergerii de rânduri,
conduce automat la modificarea indecşilor.
- vederi – reprezintă o prezentare
customizată a unor informaţii din una sau
mai multe tabele. Ele reprezintă rezultatul
unei interogări în baza de date. Ca şi
tabelele, vederile pot fi modificate cu unele
restricţii. Oferă un nivel de securitate
superior, ascunzând unele informaţii (linii
sau coloane) din tabele.
- clustere – grupează una sau mai multe
tabele care au în comun o coloană şi care
adesea sunt utilizate împreună. Ca şi
indecşii, clusterele nu afectează aplicaţiile,
însă utilizarea lor creşte performanţa.
- sinonime – sunt nume suplimentare alocate
pentru tabele, vederi, secvenţe, proceduri,
funcţii, pachete de programe.
- secvenţe – reprezintă un generator automat
de numere, cu un anumit pas.
- proceduri, funcţii, pachete – module de
program scris în PL/SQL
- legături către alte baze de date – sunt Figura 2.3
definiţii ale unor legături către o bază de date Legătura între segment, extensii şi
situată în reţea (local sau internet) blocuri de date
- trigere – sunt proceduri stocate în baza de
date care se activează la evenimente specifice (înserare, modificare, ştergere,
vizulalizare)
- vederi materializate – sunt vederi care sunt stocate în baza de date, într-o schemă
separată, utilizate pentru calcule efectuate în tabele, distribuirea informaţiei, etc.

2.3. Instanţa Oracle

Reprezintă procesele care rulează în background şi buferele de date.


Pentru a-şi îndeplini funcţiunile baza de date utilizează două structuri importante
de memorie: System Global Area (SGA) şi Program Global Area (PGA), figura 2.4.
System Global Area reprezintă o zonă de memorie care conţine date şi informaţii
de control pentru o instanţă Oracle. Memoria este alocată la pornirea instanţei şi este
eliberată la oprirea ei. Utilizatorii care accesează baza de date utilizează în comun date
stocate în SGA. Pentru performanţe bune este necesar ca SGA să aibă o dimensiune cât
mai mare (peste 200 MB). SGA este structurată în mai multe zone :
- zonă de manevră pentru date din baza de date
- zona de manevră pentru fişiere jurnal
Arhitectura bazei de date Oracle
- 12 -
Baze de date Oracle
- shared pool – zonă de memorie care conţine biblioteci de programe, buffere
pentru execuţia paralelă, structuri de control

Figura 2.4
Structura memoriei utilizată de o bază de date Oracle

- java pool – utilizat pentru execuţia sesiunilor Java (date şi cod)


- buffer chache - pentru date din dicţionarul bazei de date
- streams pool – zonă opţională pentru managementul sistemului de transmitere
a datelor în flux
- large pool – zonă de memorie opţională pentru diverse operaţii cum ar fi
legături cu alte baze de date sau operaţii de intrare/ieşire.
- alte informaţii
O parte din SGA conţine informaţii despre starea bazei de date, despre procesele
din backgound care sunt active. Această zona este zona fixă a SGA.

Program Global Area reprezintă zona de memorie alocată aplicaţiei utilizator.


Zona depinde de modul de configurare a bazei de date cu utilizatorii (zonă de memorie
folosită în comun de mai mulţi utilizatori sau alocare de memorie separat pentru fiecare
utilizator). Este utilizată pentru execuţia lucrărilor specifice utilizatorilor: SQL (inclusiv
sortări) , cursoare, informaţii despre sesiunea utilizatorului.

Fiecare utilizator conectat la baza de date rulează două module de cod: codul
specific aplicaţiei şi codul executat în baza de date. În figura 2.5 sunt reprezentate
procesele executate pentru un server configurat cu memorie dedicată fiecărui utilizator.
Oracle rulează o serie de procese proprii pentru a asigura satisfacerea cerinţelor
necesare proceselor utilizator. Procesele de pe server în combinaţie cu cele ale clientului
Oracle realizează următoarele funcţii:
• desface în componente comanda SQL trimis de aplicaţie
Arhitectura bazei de date Oracle
- 13 -
Baze de date Oracle

Figura 2.5
Procese în baza
de date Oracle

• citeşte blocurile de date în zone de memorie comune din SGA, dacă blocurile nu
erau deja încărcate în memorie
• returnează datele aplicaţiei care a emis cererea.
Pentru a realiza funcţiile necesare, baza de date rulează câteva procese numite
procese background. O instanţă Oracle poate avea mai multe procese background, însă
nu toate sunt prezente în acelaşi timp.
Procesele background pot include următoarele:
• Database Writer Process (DBWn)
• Log Writer Process (LGWR)
• Checkpoint Process (CKPT)
• System Monitor Process (SMON)
• Process Monitor Process (PMON)
• Recoverer Process (RECO)
• Job Queue Processes
• Archiver Processes (ARCn)
• Queue Monitor Processes (QMNn)
• Alte procese
În multe sisteme de operare procesele sunt pornite o dată cu lansarea instanţei
Oracle. În figura 2.6 sunt prezentate interacţiunea între diferite procese ale bazei de
date.
Database Writer Process (DBWn) – scrie în fişierele de date înregistrările din
memorie care au fost modificate. Dacă, în urma monitorizării, scrierea se face greu,
atunci pot fi activate mai multe procese de scriere (până la 20). Scrierea pe disc se face
urmând următoarele reguli:
- dacă nu există spaţiu liber în memoria cache atunci se dă o comandă de scriere
- scrierea se face periodic pentru a se apropia de checkpoint (punct de salvare),
adică apropierea între scrierea în fişiere jurnal şi scrierea în baza de date

Arhitectura bazei de date Oracle


- 14 -
Baze de date Oracle
- se urmăreşte scrierea simultană a unui număr cât mai mare de blocuri pentru a
creşte eficienţa

Figura 2.6
Legătura
între
procese

Log Writer Process (LGWR) – este responsabil cu managementul scrierii


jurnalelor bazei de date pe disc. Redo log buffer are un caracter circular, adică
informaţiile legate de manevrele în baza de date sunt scrie după principiul primul sosit,
primul servit. Se urmăreşte asigurarea unui spaţiu permanent în zona de manevră de
memorie. LGWR scrie zone continue din memorie, ceea ce asigură o viteză mărită de
scriere.
Scrierea se realizează:
- atunci în utilizatorul comite tranzacţiile sale
- la fiecare 3 secunde
- atunci când buferele din memorie sunt pline
- atunci când DBWn scrie bufere; dacă DBWn constată că există bufere redo log
aferente înregistrărilor nescrise, dă comanda LGWR să scrie aceste înregistrări
- dacă există mai multe fişiere redo log, ele se scriu simultan
Checkpoint Process (CKPT) – este o comandă care se dă bazei de date pentru a
scrie toate datele aferente acelui moment. Acest lucru este util pentru restaurări. Scrierea
datelor se face de către procesele specifice (DBWn, LGWR).
Arhitectura bazei de date Oracle
- 15 -
Baze de date Oracle
System Monitor Process (SMON) – realizează recuperarea datelor dacă este
necesar. Procesul este responsabil pentru ştergerea segmentelor temporare care nu încap
în spaţiul alocat în tablespace temporar. Dacă un tablespace este offline procesul
încearcă recuperarea atunci când este posibil. În modul Real Application Clusters,
SMON încearcă recuperarea atunci când un procesor cade sau când o instanţă Oracle
cade.
Process Monitor Process (PMON) – realizează recuperarea datelor dacă procesele
utilizator dau eroare. Eliberează memoria ocupată de datele aferente procesului
utilizator blocat. Verifică periodic starea proceselor şi le reporneşte dacă sau oprit
accidental.
Recoverer Process (RECO)- este un proces utilizat în cazul bazelor de date distribuite
care rezolvă automat incidentele. Asigură conectarea automată la altă bază de date în
cazul unor probleme în sisteme distribuite. Este prezent numai în instanţele care permit
tranzacţii distribuite.
Job Queue Processes – Se utilizează în cazul prelucrărilor serie care rulează lucrări
programate pentru utilizatori (de obicei periodic). Sunt administrate dinamic.
Archiver Processes (ARCn) – Copiază fişierele jurnal într-un spaţiu de stocare separat,
pentru arhivare. Pot exista mai multe procese de arhivare în paralel, până la 10. LGWR
startează automat numărul de procese necesar. Procesul este activ dacă baza de date este
setată în modul ARCHIVELOG.

Queue Monitor Processes (QMNn) - este un proces opţional pentru dacă se utilizează
facilitatea de lucru în flux. Pot fi până la 10 procese.

2.4. Procesarea instrucţiunilor SQL

Cele 5 instrucţiuni SQL: SELECT, UPDATE, MERGE (selecţia datelor din din
una sau mai multe surse şi pentru a modifica sau însera date într-un tabel sau într-o
vedere), INSERT şi DELETE se execută în mod diferit. Pe lângă aceste instrucţiuni care
intră în categoria DML (Data Manipulation Language), mai sunt instrucţiuni pentru
definirea structurilor de date DDL (Data Definition Language).
Paşii la executarea unei interogări (SELECT) sunt:
• Analiza
o Caută o instrucţiune identică
o Verifică sintaxa, numele obiectelor vizate şi privilegiile (drepturile
utilizatorului)
o Blochează obiectele pe perioada analizei
o Creează şi stochează un plan de execuţie
• Execută legătura între date şi variabile
• Execută interogarea propriu-zisă
• Returnează rândurile procesului utilizator
În cazul instrucţiunilor DML paşii sunt
- Analiza şi legătura cu variabile sunt similare interogărilor
- Execuţie

Arhitectura bazei de date Oracle


- 16 -
Baze de date Oracle
o Dacă datele şi blocurile undo nu sunt în memorie, atunci procesele din
server aduc aceste informaţii din fişierele de date în zona de manevră
pentru date.
o Procesele de pe server blochează rândurile care urmează a fi
modificate. Blocurile undo sunt utilizate pentru stoca imaginea iniţială
a datelor, care pot fi restaurate ulterior
o Blocurile de date din memorie înregistrează noile valori
o Procesele de pe server înregistrează blocurile undo şi modifică
blocurile de date. Ambele modificări au loc în zona de manevră pentru
date (Database Buffer Cache).
În cazul instrucţiunilor DDL (crearea de obiecte, acordarea de drepturi, etc) este
specific faptul că utilizatorul accesează dicţionarul bazei de date. Paşii de execuţie sunt
analiza, blocarea dicţionarului de date (zona modificată) şi execuţia.

Arhitectura bazei de date Oracle


- 17 -
Baze de date Oracle

3. UNELTE DE BAZĂ PENTRU ADMINISTRARE


Oracle oferă o mai multe variante de administrare cum ar fi utilizarea
comenzilor SQL Plus sau utilizarea unor utilitare puternice care uşurează munca de
administrare. Aceste utilitare de administrare sunt o parte uneltele oferite de Oracle 10g.
În acest capitol vom studia următoarele utilitare:
- Oracle Universal Installer
- Oracle Database Configuration Assistant
- SQL Plus
- Oracle Enterprise Manager

3.1. Oracle Universal Installer (OUI)

Este un utilitar bazat pe tehnologia WEB care permite instalarea/configurarea


componentelor Oracle (baze de date, dezvoltator de aplicaţii, etc) utilizând ca sursă un
CD sau o locaţie http.
Funcţiile principale sunt:
• instalarea produselor Oracle
• dezinstalare produselor Oracle
• clonarea unei instalări dintr-o sursă către o altă destinaţie păstrând
configuaţia
• completarea şi modificarea unor componente pentru eliminarea unor
deficienţe
• trecerea unei instalări la o versiune superioară
Specific unei instalări oracle este Oracle Home. Oracle Home este un context în
sistemul în care se execută componenta respectivă, iar în sistemul de operare
WINDOWS are un folder separat.
Contextul conţinut de Oracle Home se referă la următoarele:
• directorul în care produsul Oracle este instalată
• setarea căii respective în variabila de mediu “PATH”
• grupul de programe asociate cu produsul respectiv
• serviciile de sistem care rulează pentru acest produs
Există mai multe moduri de instalare a unui produs Oracle:
- modul interactiv – utilizează o interfaţă grafică (GUI) în care utilizatorul
trebuie să specifice, pas cu pas, configurările solicitate. Se utilizează atunci
când se instalează un număr mic de produse Oracle, pe un număr redus de
calculatoare gazdă.
- modul interactiv cu răspunsuri preluate dintr-un fişier ASCII. Se utilizează
atunci când configurările instalărilor sunt comune pentru toate sistemele pe
care se face instalarea.
- modul tăcut – semănă cu modul precedent, însă interfaţa grafică nu mai este
afişată

Unelte pentru administrarea bazei de date


- 18 -
Baze de date Oracle
- modul de instalare cluster – se utilizează atunci când se utilizează o bază de
date în cluster (mai multe servere fizice care se comportă în ansamblu ca o
bază de date Oracle unică)
OUI utilizează Java Runtime Environment (JRE) care trebuie să fie instalat, în
versiunea solicitată, pe sistemul respectiv. De asemenea necesită minim 32 MB
memorie şi 60-70 MB spaţiu pe disc.
OUI se bazează pe un inventar al componentelor unui produs oracle. Inventarul
este stocat în format XML (Extensible Markup Language). În sistemele WINDOWS
inventarul este stocat în \Program Files\Oracle\Inventory. Există un inventar central
(pentru toate produsele Oracle) şi inventare pe produse.

3.2. Oracle Database Configuration Assistant (DBCA)

Este un utilitar puternic care permite crearea interactivă a unei baze de date. Se
recomandă a fi utilizat pentru crearea bazelor de date customizate, pentru un număr
redus de instalări.
Paşii pentru crearea bazei de date sunt:
1. Conectarea la sistem cu drepturi de administrare.
2. Lansare DBCA
WINDOWS
Start > Programs > Oracle - home_name > Configuration and Migration
Tools > Database Configuration Assistant
UNIX – la prompt
dbca
3. Apare pagina Welcome. Se dă click Next.
4. Se selectează Create a Database şi se apasă Next.
5. În pagina Database Templates se poate alege
Data Warehouse, General Purpose sau Transaction Processing
Data Warehouse – se utilizează pentru stocarea volumelor de date de mari
dimensiuni, având de obicei un caracter istoric. Accesul utilizatorilor la date este
de obicei în citire.
Transaction Processing – se utilizează pentru baze de date cu un număr mare de
utilizatori care modifică datele în mod concurent.
6. În pagina Database Identification se introduce numele global al bazei de
date sub forma nume_global.nume_domeniu şi SID-ul bazei de date (Oracle
system identifier). Numele (SID-ul) bazei de date trebuie să fie unic în
domeniu. Se tastează Next.
7. În pagina Management Options se permite instalarea şi configurarea Oracle
Enterprise Manager. Dacă este instalat Oracle Management Agent, atunci se
poate selecta Use Grid Control for Database Management (adică
managementul centralizat a tuturor bazelor de date din domeniu). Se apasă
Next.
8. Se introduce parola pentru administratorii bazei de date (SYS – proprietarul
bazei de date şi SYSTEM). Poate fi setat o parolă unică sau parole separate.
Unelte pentru administrarea bazei de date
- 19 -
Baze de date Oracle
9. Se selectează opţiunea de stocare a datelor File System, Automatic Storage
Management (dacă sunt mai multe discuri fizice alocate bazei de date), sau
Raw Devices (discuri neformatate administrate de Oracle).
10. Se specifică locaţiile pentru fişierele bazei de date. Opţiunile sunt:

Use Database File Locations from Template—Permite stocarea fişierelor


bazei de date în locaţia specificată în model. Această opţiune permite
modificarea ulterioară a fişierelor bazei de date şi a locaţiilor.

Use Common Location for All Database Files—Permite stabilirea unui nou
home pentru fişierele bazei de date. Şi în acest caz se poate modifica ulterior
locaţia.

Use Oracle-Managed Files—Se permite DBCA managemetul direct al fişierele


bazei de date.
11. Se configurează opţiunile de restaurare a bazei de date. Se poate seta Flash
Recovery Area (spaţiu de manevră pentru salvarea unei zone intermediare
de date) utilă pentru recuperare. Se poate seta opţiunea de arhivarea a
fişierelor jurnal.
12. Se selectează generarea schemelor de date tip exemplu utile pentru învăţare
şi testare.
13. Se setează configurarea memoriei. Se poate alege:
Typical – se setează numai procentul din memoria fizică alocată bazei de
date şi se poate afişa alocarea pentru SGA şi PGA.
Custom – se poate configura mai detaliat memoria alocată
14. Se setează dimensiunea blocului de date care este unitatea de măsură pentru
transferul datelor. Implicit 8 kB. Se setează numărul maxim de procese
utilizator conectate simultan la baza de date. Minim este 6, implicit 150.
15. Se setează setul de caractere utilizat în baza de date. Acesta este specific
ţării. Pentru România se alege EE8ISO8859P2 sau EE8MSWIN1250.
16. Se setează modul de conectare a utilizatorilor la baza de date:
Dedicated Server Mode – se alocă spaţiu de memorie separată pentru fiecare
utilizator. Acest mod este util dacă numărul de utilizatori este mic sau utilizatorii
au sesiuni cu timpi mari de conectare.
Shared Server Mode – se alocă zonă de memorie comună pentru mai mulţi
utilizatori care pot fi serviţi în serie. Se precizeză numărul de zone utilizator
create la pornirea instanţei.
17. Se afişează configurarea fişierelor de stocare şi se dă comanda de creare a
bazei de date.
Modulul permite ştergerea şi modificarea bazei de date.

3.3. SQL Plus

Este o componentă foarte importantă a bazei de date care se instalează cu orice


variantă de bază de date. Există trei variante a componentei:
Unelte pentru administrarea bazei de date
- 20 -
Baze de date Oracle
- varianta cu linie de comandă
- variantă grafică (GUI)
- varianta web (iSQL Plus).
SQL Plus are propriile comenzi şi mediu de lucru şi oferă accesul la baza de date
pentru administrare, configurare şi testare. Permite introducerea şi executarea
comenzilor SQL, procedurilor PL/SQL şi a comenzilor proprii SQL Plus.
Pot fi executate următoarele operaţii:
• generarea şi executarea interogărilor SQL, cu formatarea rezultatelor
• examinarea structurilor şi obiectelor bazei de date
• dezvoltarea şi executarea unor pachete de comenzi SQL şi proceduri PL/SQL
• administrarea bazei de date

Lansarea SQL Plus se face din start menu. După activare trebuie introduse
numele utilizatorului, parola şi şirul de conectare (figura 3.1):

Figura 3.1
Macheta pornire SQL Plus

Şirul de conectare este definit în fişierul tnsnames.ora situat în calea


<oracle_home>\network\admin. Conţinutul acestui fişier ASCII este de forma:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.229)(PORT =
1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
şirul de conectare fiind ORCL. În acest fişier sunt precizate:
- protocolul (de obicei TCP/IP)
- gazda (host) – se introduce numele serverului care găzduieşte baza de date
sau adresa de IP
- portul de acces – implicit 1521
- tipul accesului – DEDICATED – pentru situaţia în care PGA este alocat
fiecărui utilizator sau SHARED
- numele instanţei care gestionează baza de date – în cazul nostru ORCL

Unelte pentru administrarea bazei de date


- 21 -
Baze de date Oracle
După introducerea datelor de mai sus apare mediul GUI SQL Plus (figura 3.2)

Figura 3.2
Mediul SQL Plus

După conectare se poate schimba utilizatorul cu comenzi de forma:


SQL> connect utilizator/parolă@şir_de_conectare, de exemplu
SQL> connect system/george@orcl
Ieşirea din mediu se face cu c-da:
SQL> EXIT
SQL Plus permite manevrarea comenzilor potrivit tabelului 3.1:
Tabelul 3.1
Comenzi din tastatură SQL Plus
Comanda Descriere
Home Deplasarea la începutul buferului ecran
End Deplasarea la sfârşitul buferului ecran
Page Up Afişare pagină precedentă bufer ecran
Page Down Afişare pagină următoare bufer ecran
CTRL + Page Up Afişare partea stângă ecran curent
CTRL + Page Down Afişare partea dreaptă ecran curent
ALT+F3 Căutare
F3 Continuă căutarea
CTRL+C Copiere (dacă nu este în execuţie o comandă)
CTRL+C Opreşte comanda în curs de execuţie
CTRL+V Paste
SHIFT+DEL Şterge buferul ecran

Introducerea şi executarea comenzilor SQL Plus


Există comenzi proprii ale mediului şi comenzi adresate bazei de date la care
suntem conectaţi. Comenzile adresate bazei de date se termină cu caracterul „;”.
De exemplu:

Unelte pentru administrarea bazei de date


- 22 -
Baze de date Oracle
SQL> connect hr/hr@orcl
SQL> select * from departments;

DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID


------------- ------------------------------ ---------- -----------
10 Administration 200 1700
20 Marketing 201 1800
30 Purchasing 114 1700
40 Human Resources 203 2400
50 Shipping 121 1500
60 IT 103 1400
70 Public Relations 204 2700
80 Sales 145 2500
90 Executive 100 1700
100 Finance 108 1700
110 Accounting 205 1700
Principalele comenzi proprii ale mediului sunt:
Tabelul 3.2
Comenzi proprii ale mediului SQL Plus
Comanda Descriere Exemplu
@ Execută fişierul script @d:\oracle\test.sql
specificat
@@ Execută fişierul script @@d:\oracle\test_nou.sql
specificat care lansează alte
scripturi căutate în acelaşi
folder
/ Execută ultima c-dă SQL sau bloc
PL/SQL
ACCEPT Citeşte de la consolă o linie şi Accept nume char prompt
stochează într-o variabilă "Introduceti numele:"
BREAK Specifică formatări care se vor BREAK ON DEPARTMENT_ID SKIP
efectua în rapoarte PAGE
COMPUTE Calculează şi afişează linii de BREAK ON JOB_ID SKIP 1;
sumar sau afişează definiţiile COMPUTE SUM LABEL 'TOTAL' OF
COMPUTE SALARY ON JOB_ID;
SELECT JOB_ID, LAST_NAME,
SALARY
FROM EMP_DETAILS_VIEW
WHERE JOB_ID IN ('AC_MGR',
'SA_MAN')
ORDER BY JOB_ID, SALARY;
CONNECT Conectarea unui utilizator la CONN sys/george@orcl AS
baza de date SYSDBA
CLEAR Şterge definiţii anterioare CLEAR BREAKS
pentru BREAK, COMPUTE, SQL
COLUMN Specifică atributele afişării COLUMN last_name HEA ‘Nume
pentru coloane, cum ar fi: salariat’ JUS C
- text cap coloană COLUMN salary HEA ‘Salariu’
- alinierea text cap coloană JUS C format 99999.99
- formatarea numerelor SELECT last_name, salary from
- scrierea conţinutului coloanei employees order by salary
pe mai multe linii desc;

DESCRIBE Descrie structura unui obiect al DESCR employeees


bazei de date
DISCONNECT Deconectarea utilizatorului DISC
curent de la baza de date
EDIT Editează (cu un editor text) ED
ultima c-dă SQL sau un fişier
ASCII

Unelte pentru administrarea bazei de date


- 23 -
Baze de date Oracle
EXECUTE Execută o instrucţiune PL/SQL Variable xxx varchar2(50)
Execute select last_name into
:xxx from employees where
employee_id=100
GET Încarcă un fişier din sistem în GET d:\Oracle\tes.sql
buferul SQL Plus
HELP Oferă informaţii despre comenzile HELP ACCEPT
proprii ale mediului
HOST Transmite o comandă sistemului de HOST dir
operare
PASSWORD Modifică parola unui utilizator PASSWORD hr
PAUSE Afişează un test atunci când PAU ’<Tastati ENTER>’
utilizatorul trebuie să apese o
tastă
PRINT Afişează valoarea unei variabile PRINT xxx
de legătură
PROMPT Afişează un mesaj pe ecran PROMPT ’Acum introduceti x’
RECOVER Recuperarea datelor pentru una RECOVER DATABASE
sau mai multe tablespace, fişiere
de date sau întrega bază de date
REMARK Comentariu într-un script REMARK ’Acum testez procedura
SQL’
RUN Echivalent cu /
SAVE Salvează buferul SQL într-un SAVE TEST
fişier sistem
SET Setează caracteristicile mediului SET PAUSE ON
SQL Plus SET PAUSE ’Tastati <ENTER>’
SPOOL Permite salvarea răspunsurilor SPOOL raspuns.txt
într-un fişier al sistemului de SPOOL OFF
operare
START Similar @, @@ START test.sql
STARTUP Porneşte o instanţă Oracle STARTUP
PFILE=’D:\Oracle\orcl.ini’
OPEN
SHUTDOWN Opreşte o instanţă Oracle SHUTDOWN
VARIABLE Defineşte o variabilă de legătură VARIABLE xxx varchar2(50)
utilă pentru proceduri PL/SQL

3.4. Oracle Enterprise Manager (OEM)

Este o componentă importantă pentru administrarea bazei de date Oracle care


utilizează tehnologia web. Principalele activităţi care pot fi efectuate sunt:
- crearea şi modificarea obiectelor bazei de date cum ar fi tablespace, tabele,
indecşi
- administrarea utilizatorilor bazei de date
- salvări şi recuperări ale bazei de date
- importul şi exportul de date
- monitorizarea bazei de date
Pentru funcţionarea OEM trebuie să fie activat serviciul aferent în sistemul de
operare. Pentru WINDOWS acesta are numele: OracleDBConsoleORACLE_SID.
Lansarea OEM se face din Internet Explorer la adresa:
http://hostname:portnumber/em
unde hostname este gazda bazei de date (IP sau nume server), iar portnumber numărul
portului pentru care a fost configurat (implicit 1158).
Unelte pentru administrarea bazei de date
- 24 -
Baze de date Oracle

Figura 3.3
Pagina de început OEM

După lansare se afişează pagina din figura 3.3 din care se pot activa opţiunile
dorite.

Unelte pentru administrarea bazei de date


- 25 -
Baze de date Oracle

4. MANAGEMENTUL UNEI INSTANŢE ORACLE

4.1. Parametrii de iniţializare


Configurarea unei baze de date Oracle şi funcţionalităţile de bază sunt stabilite
în parametrii de iniţializare. Aceştia sunt încărcaţi o dată cu pornirea instanţei. Unii
dintre ei sunt setaţi la crearea bazei de date, alţii pot fi modificaţi ulterior.
Parametrii de iniţializare se împart într-o serie de grupuri de iniţializare.
Principalele funcţiuni pentru parametrii de iniţializare sunt:
• setarea limitelor pentru întreaga bază de date
• setarea limitelor pentru utilizatori şi procese
• setarea limitelor resurselor pentru baza de date
• îmbunătăţirea performanţelor bazei de date (parametrii variabili)
Administratorii bazei de date pot utiliza parametrii de iniţializare pentru:
¾ optimizarea performanţei prin ajustarea structurii memoriei cum ar fi
numărul de bufere de memorie
¾ setarea limitelor bazei de date cum ar fi numărul maxim de utilizatori
¾ specifică numele de fişierelor sau directoarelor cerute de baza de date

Parametrii de iniţializare pot fi stocaţi în două variante:


- fişier de parametrii server (SPFILE), binar
- fişier de iniţializare independent (PFILE), ASCII
Parametrii de iniţializare sunt memoraţi implicit în SPFILE. SPFILE este \stocat
de obicei în <Oracle_home>\dbs.
La crearea bazei de date se generează un fişier ASCII cu parametrii de
iniţializare ASCII dar ulterior el nu mai este actualizat.
Avantajul utilizării SPFILE este acela că la pornirea de la distanţă a unei baze de
date nu este necesară existenţa unei copii locale (pe sistemul de pe care se face
startarea).
La pornirea manuală se poate însă specifica un fişier de iniţializare separat
(ASCII) tip PFILE.
De asemenea se poate crea o copie ASCII a SPFILE cu o c-dă de forma:
SQL> create pfile='D:\Oracle\product\10.2.0\db_1\dbs\Hazi_init.ora' from
SPFILE='D:\Oracle\product\10.2.0\db_1\dbs\spfileHazi.ora';
Afişarea valorilor curente ai parametrilor se face cu c-da:
SQL> SHOW PARAMETERS
Parametrii care sunt modificabili pot fi schimbaţi cu una din comenzile:
ALTER SESSION SET parameter_name = value
ALTER SYSTEM SET parameter_name = value [DEFERRED]

Parametrii de bază sunt daţi în tabelul 4.1.

Mangementul unei instanţe Oracle


- 26 -
Baze de date Oracle

Tabelul 4.1
Parametrii de iniţializare principali

Nr. Nume parametru Descriere Valoare/ Modifica


Crt. Implicit bil
1. CLUSTER_DATABASE Specifică dacă baza de date True/false Nu
funcţionează în modul Real False
Application Clusters
2. COMPATIBLE Specifică compatibilitatea cu minim Nu
versiuni mai vechi 9.2.0
10.0.0
3. CONTROL_FILES Specifică fişierele de control 1-8 nume de Nu
ale bazei de date fişiere
4. DB_BLOCK_SIZE Specifică dimensiunea 2048 -32768 Nu
blocurilor de date care 8192
reprezintă unitatea de pentru
manipularea datelor
5. DB_CREATE_FILE_DE Specifică locaţia pentru \Oracle\ Da
ST fişierele de date Oracle. Se product\
specifică calea sau grupul de 10.2.0\orada
discuri ta\SID
6. DB_DOMAIN Prezintă locaţia logică a bazei Nu
de date în reţea ’’
7. DB_NAME Specifică identificatorul bazei Nu
de date (până la 8 caractere)
8. DB_RECOVERY_FILE Specifică locaţia pentru zona \Oracle\prod Da
_DEST de restaurare a bazei de date. uct\10.2.0\fl
Se specifică calea sau grupul ash_recover
de discuri. y_area\SID
9. DB_RECOVERY_FILE Specifică în bytes Da
_DEST_SIZE dimensiunea spaţiului alocat
pentru zona de recuperare
10. JOB_QUEUE_PROCES Specifică numărul maxim de 0-999 Da
SES procese care pot fi create 0
pentru executarea unei lucrări
11. LOG_ARCHIVE_DEST Specifică fişierul curent care Da
_n stochează arhiva de jurnale
12. NLS_LANGUAGE Specifică limba implicită Pentru Da
pentru mesajele bazei de date. România:
romanian
13. NLS_TERRITORY Specifică numele ţării pentru La noi Da
numerotarea zilelor şi Romania
săptămânilor
14. OPEN_CURSORS Specifică numărul maxim de 0-65535 Da
cursoare deschise simultan 50
15. PGA_AGGREGATE_T Specifică dimensiunea pentru 10 MB Da
ARGET operaţii de manevră în zona sau 20%

Mangementul unei instanţe Oracle


- 27 -
Baze de date Oracle
utilizator (de ex. Sortări) SGA
16. PROCESSES Specifică numărul maxim de Min. 6 Nu
procese utilizator implicit 40
17. REMOTE_LISTENER Specifică numele sistemului în Da
care rulează LISTENER-ul
(dacă acesta nu rulează local)
18. REMOTE_LOGIN_PAS Specifică dacă se verifică NONE sau Nu
SWORDFILE fişierul de parole. Pentru SHARED
NONE accesul este acordat de
sistemul de operare
19. ROLLBACK_SEGMEN Specifică (după nume) un Nu
TS segment pentru operaţiile
nedefinitive care va fi utilizat
de instanţă
20. SESSIONS Parametru derivat din Nu
PROCESSES care indică
numărul maxim de sesiuni
(există şi sesiuni sistem)
21. SGA_TARGET Specifică dimensiunea Da
maximă pentru procesele din
SGA. Dacă este precizat,
dimensiunile proceselor
Buffer cache
(DB_CACHE_SIZE)
Shared pool
(SHARED_POOL_SIZE)
Large pool
(LARGE_POOL_SIZE)
Java pool
(JAVA_POOL_SIZE)
Streams pool
(STREAMS_POOL_SIZE)
sunt alocate automat
22. SHARED_SERVERS Specifică numărul de procese ≤ Da
utilizator alocate la pornirea MAX_SHA
instanţei dacă modul de lucru RED_
este SHARED SERVERS

23. STAR_TRANSFORMA Specifică modul în care se TRUE Da


TION_ENABLED aplică optimizarea FALSE
interogărilor bazei de date TEMP_DIS
ABLE
24. UNDO_MANAGEMEN Specifică modul de alocare a AUTO Nu
T segmentelor pentru tranzacţiile MANUAL
nedefinitive
25. UNDO_TABLESPACE Specifică numele pentru Primul liber Da
tablespace în care se alocă
automat segmentele UNDO

Mangementul unei instanţe Oracle


- 28 -
Baze de date Oracle

4.2. Pornirea şi oprirea bazei de date


După instalarea bazei de date pe sistemul gazdă se creează o serie de servicii
care pot fi gestionate de sistemul de operare. De exemplu pe sistemele WINDOWS,
aceste servicii sunt date în figura 4.1.

Figura 4.1
Servicii aferente BD Oracle pentru
platformele WINDOWS

Serviciile arătate în figură au următoarele funcţiuni:


- DBConsole – serviciu utilizat de OEM
- ClrAgent – este utilizat în modul .NET pentru proceduri externe cu mai
multe ramuri executate simultan (control şi configurare)
- JobScheduler – programarea lucrărilor în baza de date
- TNSListener – serviciu de ascultare pentru conectarea clienţilor la baza de
date
- ServiceSID – baza de date propriu-zisă
Pentru funcţionarea bazei de date sunt necesare ultimele două. Rezultă că un
mod comod pentru pornirea/oprirea bazei de date este acela de a porni/opri aceste
servicii. Pornirea/oprirea se poate face din sistemul de operare (figura 4.2).

Figura 4.2
Pornire servicii în baza de date
în WINDOWS

Pornirea se poate face manual prin


click pe Start. Pornirea se poate face
şi automat, la încărcarea sistemului
de operare, setând Startup type pe
Automatic.
Oprirea se poate face manual prin
click pe Stop.

Mangementul unei instanţe Oracle


- 29 -
Baze de date Oracle
O altă variantă de a porni/opri baza de date este utilizarea SQL Plus. Varianta
este mai flexibilă oferind mai multe opţiuni necesare pentru administrare. Însă pentru a
funcţiona din SQL Plus instanţa trebuie să aibă serviciul rezident.
Pornirea se face cu c-da startup (figura 4.3):

Figura 4.3
Pornire baza de date cu SQL
Plus

Există câteva opţiuni ale comenzii:


- nomount – utilizat în procesul de creare a bazei de date
- mount – utilizat pentru operaţii de administrare cum ar fi restaurarea bazei de
date după un incident, sau pentru activarea sau dezactivarea arhivării
fişierelor jurnal
- open – deschidere pentru lucru
- restrict – baza de date deschisă dar nu se permite conectarea utilizatorilor
obişnuiţi, lucru util pentru salvări sau alte acţiuni de administrare.
Dacă s-a pornit baza de date cu c-da nomount, montarea bazei de date se face cu
c-da:
SQL> ALTER DATABASE MOUNT;
Apoi:
SQL> ALTER DATABASE OPEN;
Trecerea la o sesiune cu restricţii se face cu c-da:
SQL> ALTER SESSION ENABLE RESTRICTED SESSION;
Oprirea se face cu c-da shutdown (figura 4.4):

Figura 4.4
Oprire baza de date cu SQL Plus

Alte opţiuni de oprire sunt:


- abort – se abandonează tranzacţiile în curs şi se opreşte baza de date. La
următoarea pornire se activează procedura de recuperare.
- immediate – nu se permite noi conexiuni, tranzacţiile necomise se
abandonează se deconectează utilizatorii şi se opreşte baza de date;
- transactional – se permite închiderea tranzacţiilor începute înainte de oprire.

Baza de date poate fi pornită/oprită şi cu ajutorul utilitarului Recovery Manager,


RMAN.

Mangementul unei instanţe Oracle


- 30 -
Baze de date Oracle
De asemenea pornirea/oprirea bazei de date se poate face şi cu OEM (figura
4.5).

Figura 4.5
Oprire baza de date cu OEM

La utilizarea OEM, pornirea, oprirea se face cu confirmarea parolei pentru


sistemul pe care este instalată baza de date.

O instanţă Oracle poate fi pornită şi cu o c-dă dată din sistemul de operare:


> ORADIM –STARTUP – SID nume_sid –SPFILE
iar serviciul de listener se porneşte cu c-da:
> LSNRCTL START

Oprirea cu utilitarul ORADIM:


> ORADIM –SHUTDOWN –SID nume_sid –SHUTMODE IMMEDIATE
> LSNRCTL STOP.

Mangementul unei instanţe Oracle


- 31 -
Baze de date Oracle

5. CREAREA UNEI BAZE DE DATE

5.1. Cerinţe pentru crearea unei baze de date

Există mai multe variante pentru crearea unei baze de date:


• Utilizarea Database Configuration Assistant (DBCA) aşa cum am arătat la
paragraful 3.2.
• Utilizarea comenzii CREATE DATABASE. În această variantă sunt
necesare câteva acţiuni suplimentare cum ar fi crearea utilizatorilor, crearea
tablespace temporar, generarea vederilor din dicţionarul bazei de date,
precum şi instalarea pachetelor de proceduri stocate în baza de date. Toate
acestea se realizează prin lansarea unor scripturi, majoritatea dintre ele fiind
livrate cu baza de date. Asemenea scripturi pot fi generate opţional cu
DBCA. Ele pot fi editate ulterior pentru a fi generată o bază de date
customizată.
De asemenea o bază de date într-o versiune mai veche (de exemplu 7,8,9) poate
fi upgradată la versiunea 10g.
Înainte de crearea unei baze este necesară planificarea dimensiunilor şi structurii
acesteia. Principalele activităţi în acest sens sunt:
¾ estimarea spaţiului necesar pentru tabele de date şi indecşi;
¾ stabilirea amplasamentului pe harddiscuri a fişierelor bazei de date;
¾ stabilirea numelui global al bazei de date, prin stabilirea variabilelor de
iniţializare DB_NAME, DB_DOMAIN;
¾ analiza şi stabilirea datelor din fişierul de iniţializare
¾ stabilirea setului de caractere pentru stocarea datelor. Dacă utilizatori diferiţi
utilizează seturi de caractere diferite (de exemplu englez şi român) atunci
trebuie ales un set care include toate caracterele. Se recomandă setul
AL32UTF8 care acoperă tipurile de date XML.
¾ stabilirea dimensiunii blocului de date DB_BLOCK_SIZE. Acesta nu poate
fi modificat ulterior. La crearea unor tablespace-uri noi poate fi stabilită şi o
altă dimensiune a blocului de date.
¾ stabilirea dimensiunii pentru tablespace sistem SYSAUX. Acesta conţine
date auxiliare din tablespace SYSTEM (facilităţi extensii).
¾ stabilirea unui tablespace implicit pentru utilizatori pentru a evita accesul
utilizatorilor la tablespace SYSTEM. Automat se creează tablespace USERS.
¾ planificarea realizării unui tablespace pentru segmentele UNDO.
¾ proiectarea unui sistem de salvări şi restaurări pentru evitarea pierderii
datelor.
¾ studierea opţiunilor de lansare şi oprire a unei instanţe ORACLE.
Înaintea de crearea unei baze de date trebuie să fie îndeplinite următoarele
condiţii:
ƒ modulele ORACLE necesare trebuie să fie instalate (ORACLE_HOME,
căile şi utilitarele necesare)

Crearea unei baze de date


- 32 -
Baze de date Oracle
ƒ utilizatorul trebuie să aibă drepturi de administrare pe sistemul respectiv
ƒ sistemul respectiv să aibă memorie suficientă (de obicei >= 1 GB RAM)
pentru ca instanţa să pornească
ƒ suficient spaţiu pe disk pentru stocarea fişierelor de date.
Crearea automată a bazei a fost prezentată la prezentarea DBCA.

5.2. Crearea manuală a bazei de date

La crearea manuală a bazei de date se scriu scripturi manual sau automat după
care acestea se lansează secvenţial, urmărind la fiecare pas rezultatele. Înainte de
lansarea procesului de creare a bazei de date trebuie creat un fişier de iniţializare.
Conţinutul unui fişier de iniţializare:
########################################################################
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
########################################################################
###########################################
# Cache and I/O
###########################################
db_block_size=8192
db_file_multiblock_read_count=16
###########################################
# Cursors and Library Cache
###########################################
open_cursors=300
###########################################
# Database Identification
###########################################
db_domain=""
db_name=test
###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=D:\oracle\product\10.2.0\admin\test\bdump
core_dump_dest=D:\oracle\product\10.2.0\admin\test\cdump
user_dump_dest=D:\oracle\product\10.2.0\admin\test\udump
###########################################
# File Configuration
###########################################
control_files=("D:\oracle\product\10.2.0\oradata\test\control01.ctl",
"D:\oracle\product\10.2.0\oradata\test\control02.ctl",
"D:\oracle\product\10.2.0\oradata\test\control03.ctl")
db_recovery_file_dest=D:\oracle\product\10.2.0\flash_recovery_area
db_recovery_file_dest_size=2147483648
###########################################
# Job Queues
###########################################
job_queue_processes=10
###########################################
# Miscellaneous
###########################################
compatible=10.2.0.1.0
###########################################
# NLS
###########################################
nls_language="ROMANIAN"
nls_territory="ROMANIA"

Crearea unei baze de date


- 33 -
Baze de date Oracle

###########################################
# Processes and Sessions
###########################################
processes=150
###########################################
# SGA Memory
###########################################
sga_target=167772160
###########################################
# Security and Auditing
###########################################
audit_file_dest=D:\oracle\product\10.2.0\admin\test\adump
remote_login_passwordfile=EXCLUSIVE
###########################################
# Shared Server
###########################################
dispatchers="(PROTOCOL=TCP) (SERVICE=testXDB)"
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=16777216

###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_tablespace=UNDOTBS1
În continuare prezentăm un exemplu de script pentru crearea unei baze de date.
A. Fişierul de comenzi (BAT) principal:
mkdir D:\oracle\product\10.2.0\admin\test\adump
mkdir D:\oracle\product\10.2.0\admin\test\bdump
mkdir D:\oracle\product\10.2.0\admin\test\cdump
mkdir D:\oracle\product\10.2.0\admin\test\dpdump
mkdir D:\oracle\product\10.2.0\admin\test\pfile
mkdir D:\oracle\product\10.2.0\admin\test\udump
mkdir D:\oracle\product\10.2.0\db_1\cfgtoollogs\dbca\test
mkdir D:\oracle\product\10.2.0\db_1\database
mkdir D:\oracle\product\10.2.0\flash_recovery_area
mkdir D:\oracle\product\10.2.0\oradata\test
set ORACLE_SID=test
D:\oracle\product\10.2.0\db_1\bin\oradim.exe -new -sid TEST -startmode
manual -spfile
D:\oracle\product\10.2.0\db_1\bin\oradim.exe -edit -sid TEST -startmode auto -
srvcstart system
D:\oracle\product\10.2.0\db_1\bin\sqlplus /nolog
@D:\oracle\product\10.2.0\admin\test\scripts\test.sql

Se observă că primele linii creează folderele necesare pentru crearea şi stocarea


bazei de date.
- adump – (audit dump) conţine fişiere ASCII de auditare a bazei de date
- bdump – (background dump) mesaje de alertare a emise de baza de date
Crearea unei baze de date
- 34 -
Baze de date Oracle
- cdump – (core dump) mesaje emise de procesele din baza de date când sunt
probleme grave
- pfile – folderul care conţine pfile generat la crearea bazei de date
- udump (user dump) mesaje generate de utilizatori DBA sau dezvoltatori
Comenzile care lansează ORADIM creează efectiv instanţa Oracle (prima) şi o
reconfigurează (a doua). Ultima linie lansează SQLPLUS şi scriptul test.sql care
lansează succesiv scripturile pentru crearea şi configurarea bazei de date.
B. Scriptul test.sql
set verify off
PROMPT specify a password for sys as parameter 1;
DEFINE sysPassword = &1
PROMPT specify a password for system as parameter 2;
DEFINE systemPassword = &2
PROMPT specify a password for sysman as parameter 3;
DEFINE sysmanPassword = &3
PROMPT specify a password for dbsnmp as parameter 4;
DEFINE dbsnmpPassword = &4
host D:\oracle\product\10.2.0\db_1\bin\orapwd.exe
file=D:\oracle\product\10.2.0\db_1\database\PWDtest.ora password=&&sysPassword
force=y
@D:\oracle\product\10.2.0\admin\test\scripts\CreateDB.sql
@D:\oracle\product\10.2.0\admin\test\scripts\CreateDBFiles.sql
@D:\oracle\product\10.2.0\admin\test\scripts\CreateDBCatalog.sql
@D:\oracle\product\10.2.0\admin\test\scripts\JServer.sql
@D:\oracle\product\10.2.0\admin\test\scripts\odm.sql
@D:\oracle\product\10.2.0\admin\test\scripts\context.sql
@D:\oracle\product\10.2.0\admin\test\scripts\xdb_protocol.sql
@D:\oracle\product\10.2.0\admin\test\scripts\ordinst.sql
@D:\oracle\product\10.2.0\admin\test\scripts\interMedia.sql
@D:\oracle\product\10.2.0\admin\test\scripts\cwmlite.sql
@D:\oracle\product\10.2.0\admin\test\scripts\spatial.sql
@D:\oracle\product\10.2.0\admin\test\scripts\emRepository.sql
@D:\oracle\product\10.2.0\admin\test\scripts\netExtensions.sql
@D:\oracle\product\10.2.0\admin\test\scripts\postDBCreation.sql
Linia host orapwd lansează utilitarul orapwd.exe şi înregistrează utilizatorul sys
ca având drepturi de administrare (SYSDBA).
Următoarele linii lansează alte scripturi pentru crearea şi configurarea bazei de
date.
C. Scriptul pentru crearea bazei de date, CreateDB.sql
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool D:\oracle\product\10.2.0\admin\test\scripts\CreateDB.log
startup nomount pfile="D:\oracle\product\10.2.0\admin\test\scripts\init.ora";
CREATE DATABASE "test"
MAXINSTANCES 8
Crearea unei baze de date
- 35 -
Baze de date Oracle
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE 'D:\oracle\product\10.2.0\oradata\test\system01.dbf' SIZE 300M
REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE 'D:\oracle\product\10.2.0\oradata\test\sysaux01.dbf' SIZE
120M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE
'D:\oracle\product\10.2.0\oradata\test\temp01.dbf' SIZE 20M REUSE AUTOEXTEND
ON NEXT 640K MAXSIZE UNLIMITED
SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE
'D:\oracle\product\10.2.0\oradata\test\undotbs01.dbf' SIZE 200M REUSE
AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
CHARACTER SET EE8ISO8859P2
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 ('D:\oracle\product\10.2.0\oradata\test\redo01.log') SIZE
51200K,
GROUP 2 ('D:\oracle\product\10.2.0\oradata\test\redo02.log') SIZE 51200K,
GROUP 3 ('D:\oracle\product\10.2.0\oradata\test\redo03.log') SIZE 51200K
USER SYS IDENTIFIED BY "&&sysPassword" USER SYSTEM
IDENTIFIED BY "&&systemPassword";
spool off
D. Scriptul pentru crearea fişiere de date CreateDBFiles.sql
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool D:\oracle\product\10.2.0\admin\test\scripts\CreateDBFiles.log
CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE
'D:\oracle\product\10.2.0\oradata\test\users01.dbf' SIZE 5M REUSE AUTOEXTEND
ON NEXT 1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
ALTER DATABASE DEFAULT TABLESPACE "USERS";
spool off
E. Scriptul pentru crearea vederilor din baza de date CreateDBCatalog.sql
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool D:\oracle\product\10.2.0\admin\test\scripts\CreateDBCatalog.log
@D:\oracle\product\10.2.0\db_1\rdbms\admin\catalog.sql;
@D:\oracle\product\10.2.0\db_1\rdbms\admin\catblock.sql;
@D:\oracle\product\10.2.0\db_1\rdbms\admin\catproc.sql;
@D:\oracle\product\10.2.0\db_1\rdbms\admin\catoctk.sql;
@D:\oracle\product\10.2.0\db_1\rdbms\admin\owminst.plb;
connect "SYSTEM"/"&&systemPassword"
@D:\oracle\product\10.2.0\db_1\sqlplus\admin\pupbld.sql;
Crearea unei baze de date
- 36 -
Baze de date Oracle
connect "SYSTEM"/"&&systemPassword"
set echo on
spool D:\oracle\product\10.2.0\admin\test\scripts\sqlPlusHelp.log
@D:\oracle\product\10.2.0\db_1\sqlplus\admin\help\hlpbld.sql helpus.sql;
spool off
F. Script pentru configurarea serverului pentru a lula Java JServer.sql
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool D:\oracle\product\10.2.0\admin\test\scripts\JServer.log
@D:\oracle\product\10.2.0\db_1\javavm\install\initjvm.sql;
@D:\oracle\product\10.2.0\db_1\xdk\admin\initxml.sql;
@D:\oracle\product\10.2.0\db_1\xdk\admin\xmlja.sql;
@D:\oracle\product\10.2.0\db_1\rdbms\admin\catjava.sql;
@D:\oracle\product\10.2.0\db_1\rdbms\admin\catexf.sql;
spool off

G. Scripul pentru configurarea finală a bazei de date


onnect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool D:\oracle\product\10.2.0\admin\test\scripts\postDBCreation.log
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
create spfile='D:\oracle\product\10.2.0\db_1\database\spfiletest.ora' FROM
pfile='D:\oracle\product\10.2.0\admin\test\scripts\init.ora';
shutdown immediate;
connect "SYS"/"&&sysPassword" as SYSDBA
startup ;
alter user SYSMAN identified by "&&sysmanPassword" account unlock;
alter user DBSNMP identified by "&&dbsnmpPassword" account unlock;
select 'utl_recomp_begin: ' || to_char(sysdate, 'HH:MI:SS') from dual;
execute utl_recomp.recomp_serial();
select 'utl_recomp_end: ' || to_char(sysdate, 'HH:MI:SS') from dual;
host D:\oracle\product\10.2.0\db_1\bin\emca.bat -config dbcontrol db -silent -
DB_UNIQUE_NAME test -PORT 1521 -EM_HOME D:\oracle\product\10.2.0\db_1 -
LISTENER LISTENER -SERVICE_NAME test -SYS_PWD &&sysPassword -SID test
-ORACLE_HOME D:\oracle\product\10.2.0\db_1 -DBSNMP_PWD
&&dbsnmpPassword -HOST hga -LISTENER_OH D:\oracle\product\10.2.0\db_1 -
LOG_FILE D:\oracle\product\10.2.0\admin\test\scripts\emConfig.log -SYSMAN_PWD
&&sysmanPassword;
spool D:\oracle\product\10.2.0\admin\test\scripts\postDBCreation.log
exit;

După crearea bazei de date reconfigurarea acesteia se face prin comenzi SQL,
cele mai utilizate fiind ALTER DATABASE, ALTER SYSTEM, ALTER SESSION.

Crearea unei baze de date


- 37 -
Baze de date Oracle

6. DICŢIONARUL BAZEI DE DATE ŞI VEDERI

6.1. Obiecte ale bazei de date

Pe lângă date, o bază de date Oracle conţine o serie de obiecte necesare


administrării şi bunei funcţionări. Cele mai importante dintre acestea sunt:
¾ dicţionarul bazei de date – cuprinde descrierea obiectelor conţinute în baza
de date
¾ tablele cu performanţa dinamică – conţine informaţii folosite de
administratorii bazei de date pentru monitorizare şi mărirea performanţelor
acesteia
¾ pachete PL/SQL stocate – unităţi de program care completează
funcţionalităţile bazei de date. Ele sunt create cu pachetul catproc.sql, rulat
după crearea bazei de date.
¾ trigere – proceduri lansate la diferite evenimente în baza de date, cum ar fi
modificarea tabelelor de date sau a vederilor.
Dicţionarul bazei de date cuprinde un set de tabele şi vederi read only care
conţin informaţii despre baza de date. Dicţionarul este actualizat atunci când se execută
comenzi de definire sau modificare a structurilor de date (DDL – Data definition
language). De asemenea execuţia comenzilor DML (Data manipulation language), care
pot duce la extinderea tabelelor, conduc la modificarea dicţionarului. Dicţionarul este
important nu numai pentru administratori, ci şi pentru utilizatori obişnuiţi şi proiectanţii
de aplicaţii. Pentru a se accesa dicţionarul bazei de date se utilizează comenzi SQL.
Dicţionarul bazei de date cuprinde două părţi:
• tabele de bază – conţin informaţii despre baza de date. Aceste tabele sunt
create o dată cu baza de date (comanda CREATE DATABASE). În aceste
tabele datele sunt scrise numai de către serverul Oracle. Multe dintre
informaţii sunt stocate criptat. Un exemplu de tabele de bază este IND$ care
conţine informaţii despre indecşii din baza de date. Toate informaţiile sunt
stocate în tablespace SYSTEM.
• vederi ale bazei de date – acestea sunt interogări ale tabelelor de bază care
oferă informaţii pentru utilizatori. Vederile din baza de date sunt create de
scriptul catalog.sql, script rulat după crearea bazei de date.
Vederile bazei de date oferă informaţii despre:
ƒ structura logică şi fizică a bazei de date;
ƒ definiţia şi alocarea de spaţiu pentru obiecte (tabele, vederi, indecşi,
sinonime, secvenţe, proceduri, funcţii, pachete, trigere, etc)
ƒ valori implicite ale coloanelor;
ƒ restricţiile bazei de date;
ƒ utilizatori;
ƒ roluri;
ƒ privilegii ale utilizatorilor;

Dicţionarul bazei de date şi vederi


- 38 -
Baze de date Oracle
ƒ rezultate ale auditării bazei de date, cum ar fi cine a accesat sau modificat
obiecte ale bazei de date.

Dicţionarul bazei de date este utilizat de Oracle pentru a găsi informaţii despre
utilizatori, obiectele din scheme şi structuri de stocare.
Orice utilizator Oracle poate accesa în citire dicţionarul pentru informaţii despre
baza de date.
Pentru vederile bazei de date s-au create sinonime publice. Mare parte din dicţionar
este reţinut în SGA pentru acces rapid. O parte dintre vederile bazei de date sunt
accesibile tuturor utilizatorilor, pe când altele sunt accesibile numai unor utilizatori.
Vederile bazei de date sunt statice şi dinamice.

6.2. Vederi statice ale bazei de date

Se referă la informaţiile statice ale bazei de date, care sunt reflectate de tabele.
Există trei seturi de vederi statice, prefixate ca atare:
- DBA – arată informaţii despre întreaga bază de date. Sunt accesibile numai
utilizatorilor cu privilegiul SELECT ANY TABLE. Acest privilegiu este acordat
utilizatorilor care au atribuit rolul DBA.
- ALL – arată informaţii despre toate obiectele la care utilizatorul are acces,
cuprinzând obiectele din schema proprie cât şi din alte scheme asupra cărora are
drepturi în citire.
- USER – arată informaţii numai despre obiectele utilizatorului curent. Nu sunt
necesare privilegii pentru a fi accesate.

În continuare vom prezenta câteva vederi utilizate mai des.


1. DBA_USERS – afişează informaţii despre utilizatorii bazei de date.
Vederea conţine următoarele câmpuri:
Coloana Tip câmp NULL Descriere
USERNAME VARCHAR2(30) NOT NULL Nume utilizator
USER_ID NUMBER NOT NULL ID utilizator
PASSWORD VARCHAR2(30) Parola criptată
ACCOUNT_STATU VARCHAR2(32) NOT NULL Starea contului:
S
• OPEN
• EXPIRED
• EXPIRED(GRACE)
• LOCKED(TIMED)
• LOCKED
• EXPIRED &
LOCKED(TIMED)
• EXPIRED(GRACE) &
LOCKED(TIMED)
• EXPIRED & LOCKED

Dicţionarul bazei de date şi vederi


- 39 -
Baze de date Oracle
Coloana Tip câmp NULL Descriere
• EXPIRED(GRACE) &
LOCKED

LOCK_DATE DATE Data la care contul a fost blocat dacă


starea lui este LOCKED
EXPIRY_DATE DATE Data expirării contului
DEFAULT_TABLE VARCHAR2(30) NOT NULL Tablespace implicit pentru date
SPACE
TEMPORARY_TAB VARCHAR2(30) NOT NULL Tablespace temporar implicit
LESPACE
CREATED DATE NOT NULL Data creării utilizatorului
PROFILE VARCHAR2(30) NOT NULL Numele profilului utilizatorului
INITIAL_RSRC_CO VARCHAR2(30) Grupul în care este încadrat
NSUMER_GROUP utilizatorul din punt de vedere al
alocării resurselor
EXTERNAL_NAME VARCHAR2(400 Nume extern al utilizatorului
0)

Exemplu
SQL> select username, user_id, account_status, default_tablespace,
temporary_tablespace from dba_users;

USERNAME USER_ID ACCOUNT_STATUS DEFAULT_TABLESPACE TEMPORARY_


TABLESPACE
------------------------------------------------------------------------------
SYS 0 OPEN SYSTEM TEMP
SYSTEM 5 OPEN SYSTEM TEMP
ANONYMOUS 28 OPEN SYSAUX TEMP
HR 33 OPEN USERS TEMP
MDSYS 32 EXPIRED & LOCKED SYSTEM TEMP
OUTLN 11 EXPIRED & LOCKED SYSTEM TEMP
DIP 18 EXPIRED & LOCKED SYSTEM TEMP
TSMSYS 20 EXPIRED & LOCKED SYSTEM TEMP
FLOWS_FILES 34 EXPIRED & LOCKED SYSAUX TEMP
CTXSYS 25 EXPIRED & LOCKED SYSAUX TEMP
DBSNMP 23 EXPIRED & LOCKED SYSAUX TEMP
FLOWS_020100 35 EXPIRED & LOCKED SYSAUX TEMP
XDB 27 EXPIRED & LOCKED SYSAUX TEMP

13 înregistrări selectate.

2. DBA_TABLESPACES – Afişează informaţii despre tablespace componente ale


bazei de date
Informaţiile afişate sunt:

Dicţionarul bazei de date şi vederi


- 40 -
Baze de date Oracle
Coloană Tip dată NULL Descriere
TABLESPACE_NAME VARCHAR2(30) NOT NULL Nume tablespace
BLOCK_SIZE NUMBER NOT NULL Dimensiunea blocului
INITIAL_EXTENT NUMBER Valoarea iniţială extent size
NEXT_EXTENT NUMBER Valoarea incrementală extent
size
MIN_EXTENTS NUMBER NOT NULL Numărul minim de extensii
MAX_EXTENTS NUMBER Numărul maxim de extensii
PCT_INCREASE NUMBER Valoarea procentului de creştere
pentru extent size
MIN_EXTLEN NUMBER Numărul minim de extensii
pentru acest tablespace
STATUS VARCHAR2(9) Stare tablespace:
• ONLINE
• OFFLINE
• READ ONLY
CONTENTS VARCHAR2(9) Conţinut tablespace:
• UNDO
• PERMANENT
• TEMPORARY
LOGGING VARCHAR2(9) Existenţa unor fişiere log
• LOGGING
• NOLOGGING
FORCE_LOGGING VARCHAR2(3) S-a forţat modul log? (YES) sau
(NO)
EXTENT_MANAGEME VARCHAR2(10) Indică dacă extinderile sunt
NT gestionate prin dicţionar
(DICTIONARY) sau local
(LOCAL)
ALLOCATION_TYPE VARCHAR2(9) Tip de alocare a extensiilor
• SYSTEM
• UNIFORM
• USER
RETENTION VARCHAR2(11) Specifică reţinerea segmentelor
undo:
• GUARANTEE
• NOGUARANTEE
• NOT APPLY
BIGFILE VARCHAR2(3) Fişier de mari dimensiuni sau
nu (YES/NO)

Dicţionarul bazei de date şi vederi


- 41 -
Baze de date Oracle
Exemplu :
SQL> select tablespace_name, block_size, initial_extent, status,
contents,segment_space_management from dba_tablespaces;

TABLESPACE_NAME BLOCK_SIZE INITIAL_EXT STATUS CONTENTS SEGMEN


------------------------------------------------------------------
SYSTEM 8192 65536 ONLINE PERMANENT MANUAL
UNDOTBS1 8192 65536 ONLINE UNDO MANUAL
SYSAUX 8192 65536 ONLINE PERMANENT AUTO
TEMP 8192 1048576 ONLINE TEMPORARY MANUAL
USERS 8192 65536 ONLINE PERMANENT AUTO
EXAMPLE 8192 65536 ONLINE PERMANENT AUTO

6 înregistrări selectate.

3. DBA_DATA_FILES – afişează informaţii despre fişierele bazei de date


Informaţii afişate:
Coloană Tip dată NULL Descriere
FILE_NAME VARCHAR2(513) Nume fişier al bazei de date
FILE_ID NUMBER NOT NULL ID al fişierului bazei de date
TABLESPACE_ VARCHAR2(30) NOT NULL Nume
NAME
BYTES NUMBER Dimensiune în bytes
BLOCKS NUMBER NOT NULL Dimensiunea blocului Oracle
STATUS VARCHAR2(9) Stare: AVAILABLE sau INVALID
(INVALID – de exemplu un fişier al
tablespace a fost şters)
RELATIVE_FN NUMBER Numărul relativ al fişierului
O
AUTOEXTENSI VARCHAR2(3) Indicator auto extensibilitate
BLE
MAXBYTES NUMBER Dimensiunea maximă în bytes
MAXBLOCKS NUMBER Dimensiunea maximă în blocuri
INCREMENT_B NUMBER Numărul de blocuri utilizat la
Y autoextindere
USER_BYTES NUMBER Dimensiunea din fişier disponibil
pentru date (bytes)
USER_BLOCKS NUMBER Număr de bocuri disponibile pentru
date
ONLINE_STAT VARCHAR2(7) Starea on line:
US • SYSOFF
• SYSTEM
• OFFLINE

Dicţionarul bazei de date şi vederi


- 42 -
Baze de date Oracle
Coloană Tip dată NULL Descriere
• ONLINE
• RECOVER

Exemplu:
SQL> select * from dba_data_files;
FILE_NAME FILE_ID T_NAME
BYTES BLOCKS STATUS REL_FNO AUT MAXBYTES MAXBLOCKS
INCR_BY USER_BYTES USER_BLOCKS ONLINE
------------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\USERS01.DBF 4 USERS
125829120 15360 AVAILABLE 4 YES 3,4360E+10 4194302
160 125763584 15352 ONLINE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\SYSAUX01.DBF 3 SYSAUX
251658240 30720 AVAILABLE 3 YES 3,4360E+10 4194302
1280 251592704 30712 ONLINE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\UNDOTBS01.DBF 2 UNDOTBS1
31457280 3840 AVAILABLE 2 YES 3,4360E+10 4194302
640 31391744 3832 ONLINE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\SYSTEM01.DBF 1 SYSTEM
503316480 61440 AVAILABLE 1 YES 3,4360E+10 4194302
1280 503250944 61432 SYSTEM
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\EXAMPLE01.DBF 5 EXAMPLE
104857600 12800 AVAILABLE 5 YES 3,4360E+10 4194302
80 104792064 12792 ONLINE

4. DBA_DB_LINKS – afişează legăturile cu alte baze de date


Coloană Tip dată NULL Descriere
OWNER VARCHAR2(30) NOT NULL Proprietarul database link
DB_LINK VARCHAR2(128) NOT NULL Numele database link
USERNAME VARCHAR2(30) Numele utilizatorului din
baza de date străină
HOST VARCHAR2(2000) Şirul de conectare Oracle
CREATED DATE NOT NULL Data creării legăturii

5. DBA_VIEWS – afişează vederile bazei de date

6. USER_OBJECTS – afişează obiectele aflate în proprietatea utilizatorului curent


Coloană Tip dată NULL Descriere
OBJECT_NAME VARCHAR2(30) NOT Nume obiect
NULL
SUBOBJECT_NAME VARCHAR2(30) Nume subobiect (de
examplu, partiţie)
OBJECT_ID NUMBER NOT ID obiect în dictionar
Dicţionarul bazei de date şi vederi
- 43 -
Baze de date Oracle
Coloană Tip dată NULL Descriere
NULL
DATA_OBJECT_ID NUMBER ID obiect în dicţionar
pentru segmental care
conţine obiectul
OBJECT_TYPE VARCHAR2(19) Tipul obiectului (de ex.
TABLE, INDEX)
CREATED DATE NOT Data creării obiectului
NULL
LAST_DDL_TIME DATE NOT Data ultimei modificări prin
NULL DDL (inclusiv grant şi
revoke)
TIMESTAMP VARCHAR2(20) Data şi ora modificării (şir
caractere)
STATUS VARCHAR2(7) Stare obiect (VALID,
INVALID, sau N/A)
TEMPORARY VARCHAR2(1) Dacă obiectul este temporar
(Y/N)
GENERATED VARCHAR2(1) Dacă a fost generat de
sistem (Y) sau (N)

Exemplu

SQL> conn hr/hr@hazi


Conectat.
SQL> select rpad(object_name,30), object_type, created from user_

RPAD(OBJECT_NAME,30) OBJECT_TYPE CREATED


------------------------------ ------------------- ----------
REGIONS TABLE 13-05-2007
REG_ID_PK INDEX 13-05-2007
COUNTRIES TABLE 13-05-2007
COUNTRY_C_ID_PK INDEX 13-05-2007
LOCATIONS TABLE 13-05-2007
LOC_ID_PK INDEX 13-05-2007
LOC_CITY_IX INDEX 13-05-2007
LOC_STATE_PROVINCE_IX INDEX 13-05-2007
LOC_COUNTRY_IX INDEX 13-05-2007
DEPARTMENTS TABLE 13-05-2007
DEPT_ID_PK INDEX 13-05-2007
DEPT_LOCATION_IX INDEX 13-05-2007
JOBS TABLE 13-05-2007
JOB_ID_PK INDEX 13-05-2007
EMPLOYEES TABLE 13-05-2007
EMP_EMAIL_UK INDEX 13-05-2007
EMP_EMP_ID_PK INDEX 13-05-2007

Dicţionarul bazei de date şi vederi


- 44 -
Baze de date Oracle
EMP_DEPARTMENT_IX INDEX 13-05-2007
EMP_JOB_IX INDEX 13-05-2007
EMP_MANAGER_IX INDEX 13-05-2007
EMP_NAME_IX INDEX 13-05-2007
JOB_HISTORY TABLE 13-05-2007
JHIST_EMP_ID_ST_DATE_PK INDEX 13-05-2007
JHIST_JOB_IX INDEX 13-05-2007
JHIST_EMPLOYEE_IX INDEX 13-05-2007
JHIST_DEPARTMENT_IX INDEX 13-05-2007
LOCATIONS_SEQ SEQUENCE 13-05-2007
DEPARTMENTS_SEQ SEQUENCE 13-05-2007
EMPLOYEES_SEQ SEQUENCE 13-05-2007
EMP_DETAILS_VIEW VIEW 13-05-2007
SECURE_DML PROCEDURE 13-05-2007
SECURE_EMPLOYEES TRIGGER 13-05-2007
ADD_JOB_HISTORY PROCEDURE 13-05-2007
UPDATE_JOB_HISTORY TRIGGER 13-05-2007

34 înregistrări selectate.

7. USER_TABLES – afişează tabelele utilizatorului curent


Exemplu:

SQL> select table_name, tablespace_name from user_tables;

TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
REGIONS EXAMPLE
LOCATIONS EXAMPLE
JOBS EXAMPLE
COUNTRIES
DEPARTMENTS EXAMPLE
EMPLOYEES EXAMPLE
JOB_HISTORY EXAMPLE

7 înregistrări selectate.

8. USER_TAB_COLUMNS – afişează informaţii despre coloanele unei tabele


Exemplu:
SQL> select column_name, rpad(data_type,20), data_length from
user_tab_columns where table_name='EMPLOYEES';

COLUMN_NAME RPAD(DATA_TYPE,20) DATA_LENGTH


------------------------------ -------------------- -----------
EMPLOYEE_ID NUMBER 22
FIRST_NAME VARCHAR2 20
LAST_NAME VARCHAR2 25
EMAIL VARCHAR2 25
PHONE_NUMBER VARCHAR2 20
HIRE_DATE DATE 7
JOB_ID VARCHAR2 10
SALARY NUMBER 22
COMMISSION_PCT NUMBER 22

Dicţionarul bazei de date şi vederi


- 45 -
Baze de date Oracle
MANAGER_ID NUMBER 22
DEPARTMENT_ID NUMBER 22

11 înregistrări selectate.

6.3. Vederi dinamice ale bazei de date

Sunt prefixate cu V$ şi oferă informaţii actualizate dinamic despre starea bazei de


date. Denumirile V$ sunt sinonime publice ale vederilor care au prefixul V_$, acestea
din urmă fiind accesibile numai utilizatorului SYS.
În cazul sistemelor în RAC (Real Application Clusters) se utilizează GV$ (de la
global). Acestea conţin în plus o coloană INST_ID care indică instanţa la care se referă.
În continuare vom prezenta câteva vederi dinamice mai uzuale.
1. V$DATABASE – oferă informaţii despre baza de date curentă. Numărul de
informaţii este foarte mare.
Exemplu:
SQL> select dbid, name, log_mode,version_time,
open_mode,platform_name from v$database
DBID NAME LOG_MODE VERSION_TI OPEN_MODE PLATFORM_NAME
---------------------------------------------------------------------------
2572575511 HAZI NOARCHIVELOG 13-05-2007 READ WRITE Microsoft Windows IA
(32-bit)

2. V$DATAFILE – afişează informaţii despre fişierele bazei de date


Exemplu:
SQL> select rpad(name,50),file#, status, enabled from v$datafile

RPAD(NAME,50) FILE# STATUS ENABLED


-------------------------------------------------- ---------- -----
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\SYSTEM01.DBF 1 SYSTEM READ WRITE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\UNDOTBS01.DBF2 ONLINE READ WRITE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\SYSAUX01.DBF 3 ONLINE READ WRITE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\USERS01.DBF 4 ONLINE READ WRITE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\EXAMPLE01.DBF5 ONLINE READ WRITE

3. V$INSTANCE – afişează informaţii despre instanţa curentă


Exemplu:
SQL> select instance_number, instance_name, host_name, version,
startup_time from v$instance;

INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STARTUP_TI


--------------- ---------------- -------------------------------------
1 hazi HGA 10.2.0.1.0 17-06-2007

4. V$NLS_PARAMETERS - afişează informaţii specifice despre limbă şi ţară

Exemplu:
SQL>select * from v$NLS_Parameters

Dicţionarul bazei de date şi vederi


- 46 -
Baze de date Oracle
PARAMETER VALUE
----------------------------------------------------------------
NLS_LANGUAGE ROMANIAN
NLS_TERRITORY ROMANIA
NLS_CURRENCY LEI
NLS_ISO_CURRENCY ROMANIA
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MM-RRRR
NLS_DATE_LANGUAGE ROMANIAN
NLS_CHARACTERSET EE8ISO8859P2
NLS_SORT ROMANIAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD-MM-RRRR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MM-RRRR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY LEI
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

19 înregistrări selectate.

5. V$SGAINFO – afişează informaţii despre memoria SGA


Exemplu:
SQL> select * from v$sgainfo;

NAME BYTES RESIZEABLE


-------------------------------- ---------- ---
Fixed SGA Size 1247684 No
Redo Buffers 2945024 No
Buffer Cache Size 58720256 Yes
Shared Pool Size 54525952 Yes
Large Pool Size 4194304 Yes
Java Pool Size 4194304 Yes
Streams Pool Size 0 Yes
Granule Size 4194304 No
Maximum SGA Size 125829120 No
Startup overhead in Shared Pool 29360128 No
Free SGA Memory Available 0

11 înregistrãri selectate.

6. V$SGA – Afişează informaţii sumare despre SGA


Exemplu:
SQL> select * from v$sga;

NAME VALUE
-------------------- ----------
Fixed Size 1247684
Variable Size 62916156
Database Buffers 58720256
Redo Buffers 2945024
Dicţionarul bazei de date şi vederi
- 47 -
Baze de date Oracle
7. V$PGASTAT – Afişează informaţii despre PGA
Exemplu:
SQL> select * from v$pgastat;

NAME VALUE UNIT


---------------------------------------------------------------- --
aggregate PGA target parameter 16777216 bytes
aggregate PGA auto target 5511168 bytes
global memory bound 3354624 bytes
total PGA inuse 10723328 bytes
total PGA allocated 22793216 bytes
maximum PGA allocated 57075712 bytes
total freeable PGA memory 0 bytes
process count 19
max processes count 26
PGA memory freed back to OS
0 bytes
total PGA used for auto workareas 0 bytes
maximum PGA used for auto workareas 2295808 bytes
total PGA used for manual workareas 0 bytes
maximum PGA used for manual workareas 0 bytes
over allocation count 46
bytes processed 47788032 bytes
extra bytes read/written 0 bytes
cache hit percentage 100 percent
recompute count (total) 1827

8. V$PROCESS – Afişează informaţii despre procesele Oracle


Exemplu:
SQL> select * from v$process;
Apasati <ENTER>

ADDR PID SPID USERNAME SERIAL# TERMINAL PROGRAM


-------- ---------- ------------ --------------- ---------- ----------
6A91482C 1 0 PSEUDO
6A914E1C 2 2852 SYSTEM 1 HGA ORACLE.EXE (PMON)
6A91540C 3 3428 SYSTEM 1 HGA ORACLE.EXE (PSP0)
6A9159FC 4 3472 SYSTEM 1 HGA ORACLE.EXE (MMAN)
6A915FEC 5 3308 SYSTEM 1 HGA ORACLE.EXE (DBW0)
6A9165DC 6 4064 SYSTEM 1 HGA ORACLE.EXE (LGWR)
6A916BCC 7 3456 SYSTEM 1 HGA ORACLE.EXE (CKPT)
6A9171BC 8 2188 SYSTEM 1 HGA ORACLE.EXE (SMON)
6A9177AC 9 2532 SYSTEM 1 HGA ORACLE.EXE (RECO)
6A917D9C 10 3436 SYSTEM 1 HGA ORACLE.EXE (CJQ0)
6A91838C 11 3832 SYSTEM 1 HGA ORACLE.EXE (MMON)
6A91897C 12 1328 SYSTEM 1 HGA ORACLE.EXE (MMNL)
6A918F6C 13 3364 SYSTEM 1 HGA ORACLE.EXE (D000)
6A91955C 14 1484 SYSTEM 1 HGA ORACLE.EXE (S000)
6A919B4C 15 4080 SYSTEM 84 HGA ORACLE.EXE (J000)
6A91A13C 16 3020 SYSTEM 1 HGA ORACLE.EXE (QMNC)
6A91A72C 17 4004 SYSTEM 1 HGA ORACLE.EXE (q000)
6A91B30C 19 2244 SYSTEM 2 HGA ORACLE.EXE (SHAD)
6A91B8FC 20 4028 SYSTEM 4 HGA ORACLE.EXE (q002)

Dicţionarul bazei de date şi vederi


- 48 -
Baze de date Oracle
19 înregistrări selectate.

9. V$VERSION – Afişează informaţii despre versiunea curentă a bazei de date


Exemplu:
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production

Dicţionarul bazei de date şi vederi


- 49 -
Baze de date Oracle

7. MANAGEMENTUL FIŞIERELOR BAZEI DE DATE

7.1. Fişierele de control

Fiecare bază de date are unul sau mai multe fişiere de control care sunt mici
fişiere binare care memorează structura fizică a bazei de date.
Aceste informaţii includ:
• Numele bazei de date
• Numele şi locaţia fişierelor de date asociate, precum şi a fişierelor jurnal (redo
log)
• Data şi ora creării bazei de date
• Informaţii despre ultimul checkpoint (punct de salvare coerentă a informaţiilor)
Fişierele de control sunt mereu disponibile atunci când baza de date este
deschisă. Fără fişierele de control deschiderea şi montarea bazei de date nu se poate
face, iar recuperarea datelor este dificilă. Fişierele de control sunt create o dată cu baza
de date, de obicei cel puţin două copii identice. Se recomandă ca aceste fişiere să fie
stocate pe discuri fizice diferite. Fişiere de control pot fi create şi ulterior.
Numele fişierelor de control sunt stabilite prin parametrul de iniţializare
CONTROL_FILES . La pornirea unei instanţe Oracle sunt deschise toate fişierele de
control listate. Instanţa deschisă întreţine şi actualizează fişierele de control.
Este bine să se facă salvări ale fişierelor de control ori de câte ori:
• se adaugă, se şterg sau se renumesc fişiere de date;
• se adaugă sau se şterg tablespace;
• se adaugă sau se şterg fişiere redo log.
Dimensiunea fişierelor de control este dată de parametrii de iniţializare
MAXDATAFILES, MAXLOGFILES, MAXLOGMEMBERS, MAXLOGHISTORY şi
MAXINSTANCES. Modificarea acestor parametri duce la modificarea dimensiunilor
fişierelor de control.
Crearea de copii suplimentare, renumirea sau relocarea fişierelor de control se
face în următorii paşi:
• se opreşte baza de date
• se copiază un fişier de control existent într-o locaţie nouă folosind o
comandă a sistemului de opearare
• se editează parametrul CONTROL_FILES şi se adaugă noul fişier de control
sau se schimbă locaţia acestuia
• se restartează baza de date
Informaţii cu privire la locaţia fişierelor de control se pot obţine cu c-da:
SQL> SELECT VALUE FROM V$PARAMETER WHERE NAME = 'control_files';

VALUE
--------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\CONTROL01.CTL,
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\CONTROL02.CTL,
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\CONTROL03.CTL

Managementul fişierelor bazei de date


- 50 -
Baze de date Oracle
Trebuie creat un fişier nou de control în următoarele situaţii:
• toate fişierele de control ale bazei de date sunt deteriorate şi nu există o
salvare a acestora
• dacă se doreşte schimbarea numelui bazei de date.
De exemplu dacă se doreşte schimbarea numelui bazei de date din HAZI în
PROD se utilizează c-da CREATE CONTROLFILE:
CREATE CONTROLFILE
SET DATABASE PROD
LOGFILE GROUP 1
('D:\Oracle\product\10.2.0\oradata\HAZI\redo01.log',
'D:\Oracle\product\10.2.0\oradata\HAZI\redo02.log',
'D:\Oracle\product\10.2.0\oradata\HAZI\redo03.log')
RESETLOGS
DATAFILE 'D:\Oracle\product\10.2.0\oradata\HAZI\system01.dbf' SIZE
500M,
'D:\Oracle\product\10.2.0\oradata\HAZI\SYSAUX01.DBF',' SIZE 267M,
'D:\Oracle\product\10.2.0\oradata\HAZI\TEMP01.dbf' SIZE 21M,
'D:\Oracle\product\10.2.0\oradata\HAZI\UNDOTBS01.DBF',' SIZE 40M,
'D:\Oracle\product\10.2.0\oradata\HAZI\USERS01.DBF',' SIZE 150M
MAXLOGFILES 50
MAXLOGMEMBERS 3
MAXLOGHISTORY 400
MAXDATAFILES 200
MAXINSTANCES 6
ARCHIVELOG;
Paşii în care se creează noi fişiere de control:
1. Se realizează o listă cu fişierele jurnal (redo log) şi cu fişierele de date.
Acestea pot fi văzute cu comenzile:
SQL> SELECT NAME FROM V$DATAFILE;

NAME
----------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\SYSTEM01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\UNDOTBS01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\SYSAUX01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\USERS01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\EXAMPLE01.DBF

SQL> SELECT MEMBER FROM V$LOGFILE;

MEMBER
-------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\REDO03.LOG
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\REDO02.LOG
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\REDO01.LOG

2. Se opreşte baza de date


SQL> conn /as sysdba
Conectat.
SQL> shutdown normal
BD s-a închis.
S-a demontat BD.

Managementul fişierelor bazei de date


- 51 -
Baze de date Oracle
Instanţa ORACLE s-a închis.
SQL>

3. Se salvează fişierele de date şi fişierele jurnal


4. Se porneşte o nouă instanţă dar baza de date nu se montează şi nu se
deschide
SQL> startup nomount
A pornit instanţa ORACLE.
Apasati <ENTER>

Total System Global Area 125829120 bytes


Fixed Size 1247684 bytes
Variable Size 67110460 bytes
Database Buffers 54525952 bytes
Redo Buffers 2945024 bytes
SQL>
5. Se creează un fişier de control cu c-da CREATE CONTROLFILE
6. Se salvează noul fişier de control
7. Se modifică parametrul de iniţializare CONTROL_FILES indicând noul
fişier de control. Dacă se schimbă numele bazei de date se schimbă şi
DB_NAME
8. Se recuperează baza de date cu RMAN dacă este cazul.
9. Se deschide baza de date
SQL> alter database mount;
Bază de date modificată.
SQL> alter database open;
Bază de date modificată.

Salvarea fişierului de control se poate face şi cu c-da:


SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'd:\control.bkp';

Bază de date modificată.

7.2. Fişierele jurnal (redo log)

Sunt fişiere care stochează rapid toate modificările efectuate asupra bazei de
date. Fiecare instanţă este asociată unuia sau mai multor fişiere redo log pentru a o
proteja în caz de incident.
Înregistrările redo log sunt stocate iniţial în memorie într-o zonă circulară (redo
log buffer) şi sunt scrise de către procesul Lol Writer LGWR. Scrierea se realizează
atunci când o tranzacţie este comisă. O dată cu înregistrarea se scrie şi informaţia
referitoare la starea sistemului SCN (system change number) pentru a se identifica
înregistrările aferente unei tranzacţii comise.
Scrierea în fişierele jurnal se realizează de asemenea într-o manieră circulară,
aşa cum se arată în figura 7.1. Baza de date necesită minim 2 fişiere jurnal pentru a
garanta buna funcţionare. Dacă variabila ARCHIVELOG este setată, atunci într-un
fişier se scrie în timp ce celălalt este arhivat. Fişierele redo log sunt disponibile la
scriere în funcţie de modul în care funcţionează baza de date:

Managementul fişierelor bazei de date


- 52 -
Baze de date Oracle

Figura 7.1
Scrierea înregistrărilor în fişierele
jurnal

• dacă arhivarea este dezactivată, atunci un fişier redo log plin devine
disponibil pentru rescriere după ce înregistrările modificate au fost scrise în
baza de date
• dacă arhivarea este activată, resrierea unui fişier jurnal se face după ce
înregistrările modificate au fost scrise în baza de date şi fişierul a fost arhivat

Fişierele redo log care sunt necesare pentru restaurarea bazei de date sunt fişiere
active, celelalte fiind inactive.
Pentru a proteja baza de date, Oracle permite multiplexarea fişierelor jurnal,
menţinând două sau mai multe copii ale aceluiaşi fişier în locaţii diferite. Este de
preferat ca locaţiile să fie situate pe discuri fizice diferite. Când sunt mai multe copii ale
fişierelor LGWR scrie simultan în toate copiile active. Multiplicarea fişierelor jurnal
implică noţiunea de grup care conţine mai multe copii ale unui fişier jurnal (figura 7.2).

Figura 7.2
Grupuri de fişiere jurnal

Managementul fişierelor bazei de date


- 53 -
Baze de date Oracle

Crearea grupurilor şi a fişierelor jurnal membre ale acestora se realizează de


obicei o dată cu crearea bazei de date. Totuşi, în practică, apar adesea situaţii când este
necesară modificarea configuraţiei de fişiere jurnal, prin crearea de noi grupuri sau
fişiere membre. Baza de date poate avea maxim MAXLOGFILES fişiere jurnal.
Vizualizarea grupurilor existente se face cu c-da:
SQL> SELECT GROUP#, ARCHIVED, STATUS FROM V$LOG;

GROUP# ARC STATUS


---------- --- ----------------
1 NO INACTIVE
2 NO INACTIVE
3 NO CURRENT
Crearea de noi grupuri se face cu c-da:
SQL> ALTER DATABASE ADD LOGFILE
('D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\ REDO04.LOG') SIZE 8M;
Se poate specifica în clar, grupul din care face parte:
SQL> ALTER DATABASE ADD LOGFILE GROUP 4
('D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\ REDO04.LOG') SIZE 8M;
Adăugarea unui fişier la un grup se face cu c-da:
SQL> ALTER DATABASE ADD LOGFILE MEMBER
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\ REDO02_2.LOG ' TO GROUP 2;
C-da de mai sus se putea scrie şi altfel:
SQL> ALTER DATABASE ADD LOGFILE MEMBER
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\ REDO02_2.LOG'
TO (' D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\REDO02.LOG ');

Redenumirea şi relocarea fişierelor jurnal se face în următorii paşi:


1. Se opreşte baza de date
SQL> SHUTDOWN NORMAL
2. Se copiază fişierele jurnal în noua locaţie, folosind comenzi ale sistemului
de operare
D:\> MOVE D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\REDO02_2.LOG
E:\REDOORACLE\REDO02_2.LOG
3. Se porneşte baza de date, se montează dar nu se deschide
SQL> CONNECT / AS SYSDBA
SQL> STARTUP MOUNT
4. Se redenumesc fişierele mutate
SQL> ALTER DATABASE RENAME FILE ‚
‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\REDO02_2.LOG’ to
‘E:\REDOORACLE\REDO02_2.LOG’

5. Se redeschide baza de date


SQL> ALTER DATABASE OPEN
Ştergerea grupurilor de fişiere se poate face numai pentru grupurile inactive:
SQL> SELECT GROUP#, ARCHIVED, STATUS FROM V$LOG;

GROUP# ARC STATUS


---------- --- ----------------
1 NO INACTIVE

Managementul fişierelor bazei de date


- 54 -
Baze de date Oracle
2 NO INACTIVE
3 NO CURRENT
4 YES UNUSED
SQL> ALTER DATABASE DROP LOGFILE GROUP 4;

Bază de date modificată.


Ştergerea unui membru al unui grup se face cu c-da:
SQL> ALTER DATABASE DROP LOGFILE MEMBER
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\REDO02_2.LOG ';

7.3. Tablespace şi fişiere de date

Se recomandă utilizarea mai multor tablespace-uri din următoarele motive:


• separarea datelor utilizator de datele aferente dicţionarului pentru a reduce
conflictele de intrare/ieşire
• separarea datelor aplicaţiilor pentru a putea face manevre cu tablespace cum
ar fi trecerea offline
• stocarea tablespace în fişiere diferite amplasate pe discuri diferite pentru a
creşte viteza I/O
• creşterea disponibiltăţii bazei de date atunci când apar incidente (este afectat
numai un tablespace)
• optimizarea tablespace după natura aplicaţiilor: activitatea I/O intensă,
tablespace readonly, tablespace temporar
• salvarea individuală a tablespace-urilor

Crearea tablespace se face după crearea bazei de date. Orice bază de date are
câteva tablespace obligatorii:
• SYSTEM – conţine dicţionarul bazei de date şi segmentele de rollback
utilizate de sistem. Este administrat ca orice tablespace dar necesită privilegii
de cel mai înalt nivel.
• SYSAUX – conţine date auxiliare aferente unor componente ale bazei de
date Oracle
Pentru crearea şi administrarea tablespace se pot utiliza comenzile:
- CREATE TABLESPACE
- CREATE TEMPORARY TABLESPACE
- ALTER TABLESPACE
- ALTER DATABASE
- CREATE UNDO TABLESPACE – pentru crearea unui tablespace destinat
depunerii înregistrărilor nedefinitive (segmente ROLLBACK).
Din punct de vedere al administrării şi a modului de funcţionare există mai
multe tipuri de tablespace:
- tablespace administrate local (Locally Managed Tablespaces)
- bigfile tablespace
- temporary tablespace
- grupuri de tablespace temporare

Managementul fişierelor bazei de date


- 55 -
Baze de date Oracle
În cazul tablespace administrate local toate informaţiile de administrare sunt
stocate în headerul tablespace sub formă de bitmap (hartă de biţi are arată modul de
utilizare a spaţiului), oferind următoarele avantaje principale:
- viteză foarte mare în lucrul concurent
- se simplifică alocarea spaţiului în cazul opţiunii AUTOALLOCATE întrucât
sistemul stabileşte automat dimensiunile de extindere
- dimensiune redusă a informaţiilor stocate în dicţionar
Toate tablespace, inclusiv SYSTEM, pot fi de tipul administrate local.
Crearea tablespace administrate local se face cu c-zi de forma:
SQL> CREATE TABLESPACE sal DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\salarii.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
Dimensiunea extensiilor este de minim 64 K.
O alternativă este utilizarea clauzei UNIFORM care permite stabilirea
dimensiunii extensiilor:
SQL> CREATE TABLESPACE sal DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\salarii.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Modificarea unui tablespace administrat local se face cu c-da:


SQL> ALTER TABLESPACE sal ADD DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\salarii2.dbf' SIZE 3M
prin care se adaugă un fişier suplimentar pentru stocarea tablespace.
SQL> ALTER TABLESPACE sal OFFLINE NORMAL
prin care se trece tablespace în modul OFFLINE pentru operaţii de administrare, cum ar
fi recuperarea datelor.
Trecerea în modul READ ONLY sau READ WRITE se face cu comenzile:
SQL>ALTER TABLESPACE sal READ ONLY;
SQL>ALTER TABLESPACE users READ WRITE;
Renumirea tablespace se face cu c-da:
SQL> ALTER TABLESPACE sal RENAME TO salnou;
Ştergerea tablespace se face cu c-da:
SQL> DROP TABLESPACE salnou;

Bigfile tablespace este un tablespace cu un sigur, dar foarte mare (până la 4G


blocuri), fişier de date. Avantajele bigfile tablespace sunt:

• Poate conţine până la 32 TB date dacă blocurile sunt de 8K sau 128 TB dacă
blocurile au mărime de 32 K.
• Reduce semnificativ numărul de fişiere ale bazei de date, reducând
corespunzător dimensiunile fişierelor de control şi a SGA
• Simplifică managementul bazei de date, nemaifiind nevoie de referiri la
fişiere componente ale tablespace\

Crearea bigfile tablespace se face cu c-da:

Managementul fişierelor bazei de date


- 56 -
Baze de date Oracle
SQL> CREATE BIGFILE TABLESPACE bigsal
DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\salarii.dbf'
SIZE 50G
Modificarea bigtablespace se face cu comenzi specifice:
ALTER TABLESPACE bigsal RESIZE 80G;
ALTER TABLESPACE bigsal AUTOEXTEND ON NEXT 20G;

Temporary tablespace – conţine date tranzitorii care persistă numai pe durata


unei sesiuni utilizator. Este utilizat pentru reţinerea datelor temporare, în mod deosebit
în cazul sortărilor. Nu se pot crea obiecte în tablespace temporar.
Crearea unui tablespace temporar se face cu c-da:
SQL> CREATE TEMPORARY TABLESPACE lmtemp TEMPFILE '
D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\tempnou.dbf'
SIZE 20M REUSE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M;
Se poate crea şi un bigfile tablespace temporar.

Utilizarea grupurilor de tablespace temporar permite utilizarea eficientă a


spaţiului din mai multe tablespace.
Crearea grupurilor se face o dată cu crearea tablespace temporar:
SQL> CREATE TEMPORARY TABLESPACE lmtemp2 TEMPFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HAZI\tempnou.dbf'
SIZE 50M
TABLESPACE GROUP group1;
Trecerea unui tablespace într-un grup se face cu c-da:
SQL> ALTER TABLESPACE temp1 TABLESPACE GROUP group2;
Scoaterea unui tablespace dintr-un grup se face cu c-da:
SQL> ALTER TABLESPACE lmtemp3 TABLESPACE GROUP '';

Managementul fişierelor bazei de date


- 57 -
Baze de date Oracle

8. MANAGEMENTUL TABELELOR ŞI A DATELOR


Tabelele sunt structuri de date elementare utilizate pentru stocarea informaţiilor.
Datele sunt stocate în coloane şi linii. Pentru a crea o tabelă trebuie definit numele
tabelei, de exemplu personal, şi un set de coloane. Pentru fiecare coloană se stabileşte
numele ei, tipul câmpului, dimensiunile acestuia şi restricţiile aplicabile.
Tabelele pot fi interogate, şterse şi modificate utilizând SQL.

8.1. Tipuri de date

Tipurile de date acceptate de Oracle 10g sunt:


A. Date de tip şir de caractere
CHAR(n [BYTE | CHAR]) – reprezintă un şir de caractere de lungime fixă n
octeţi, n ≤ 2000. Opţiunile BYTE sau CHAR specifică modul în care se calculează
lungimea. Implicit lungimea este dată de parametrul NLS_LENGTH_SEMANTICS,
care specifică numărul de octeţi ocupat de un caracter în limba naţională în care a fost
creată baza de date, având valori între 1 şi 4. În cazul limbii române
NLS_LENGTH_SEMANTICS=’BYTE’.
Vizualizarea valorii lui NLS_LENGTH_SEMANTICS se face cu c-da:
SQL> select * from nls_session_parameters;

PARAMETER VALUE
------------------------------ -------------------------------
NLS_LANGUAGE ROMANIAN
NLS_TERRITORY ROMANIA
NLS_CURRENCY LEI
NLS_ISO_CURRENCY ROMANIA
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MM-RRRR
NLS_DATE_LANGUAGE ROMANIAN
NLS_SORT ROMANIAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD-MM-RRRR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MM-RRRR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY LEI
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

17 înregistrãri selectate.

Pentru BYTE lungimea şirului va fi dată de n (octeţi), iar pentru CHAR


lungimea şirului va fi n*număr_octeţi_pe_caracter ≤ 2000.
NCHAR(n) – şir de caractere având lungimea n caractere specifice limbii. Este
echivalent cu CHAR(n CHAR).

Managementul tabelelor şi a datelor


- 58 -
Baze de date Oracle
VARCHAR2(n [BYTE | CHAR]) – şir variabil de caractere de lungime
variabilă n*număr_octeţi_pe_caracter ≤ 4000.
NVARCHAR2(n [BYTE | CHAR]) – şir variabil de caractere specifice limbii
de lungime variabilă n*număr_octeţi_pe_caracter ≤ 4000.

B. Date de tip numeric


NUMBER(n,s) – număr cu lungimea n şi scala s (nr. de zecimale). n poate lua
valori între 1 şi 38, iar s între -84 şi 127. Pentru s pozitiv el reprezintă numărul de
zecimale după virgulă, iar pentru n negativ numărul este rotunjit la numărul de cifre
respectiv (numărul de zerouri din coadă).
BINARY_FLOAT – Număr în virgulă mobilă pe 32 de biţi. Ocupă 5 bytes.
Poate memora valori între 1.17549E-38 şi 3.40282E+38.
BINARY_DOUBLE – Număr în virgulă mobilă pe 64 de biţi. Ocupă 9 bytes.
Poate memora valori între 2.22507485850720E-308 şi 1.79769313486231E+308.

C. Date de tip dată şi timp


DATE – variabilă ce cuprinde anul, luna, ziua, ora, minutul şi secunda. Are
valori până la 31 decembrie 9999. Ocupă 7 bytes.
TIMESTAMP(fs) – memorează în plus faţă de DATE fracţiuni de secundă cu
lungimea fs. Ocupă între 7 şi 11 bytes.
TIMESTAMP(fs) WITH TIME ZONE – memorează în plus faţă de
TIMESTAMP timpul zonal faţă de GMT (+2:00 pentru Bucureşti). Ocupă 13
bytes.

D. Obiecte de mari dimensiuni (LOB – LargeOBjects)


CLOB – variabilă ce poate conţine obiecte de tip caracter de lungime variabilă.
Dimensiunea maximă (4GB -1)*dimensiune_bloc.
NCLOB – variabilă ce poate conţine obiecte de tip caracter specific limbii de
lungime variabilă. Dimensiunea maximă (4GB -1)*dimensiune_bloc.
BLOB – variabilă ce conţine obiecte de tip binar de lungime variabilă.
Dimensiunea maximă (4GB -1)*dimensiune_bloc.
BFILE – conţine o referinţă (pointer) către un fişier binar de mari dimensiuni de
pe disc.

E. Câmpuri referitoare la tabele


ROWID – Şir de caractere pe 64 de biţi care memorează adresa înregistrării
dintr-o tabelă.
UROWID[(n)] - Şir de caractere pe 64 de biţi care memorează adresa
înregistrării dintr-o tabelă organizată index. n reprezintă lăţimea coloanei
ROWID, cu valoarea maximă 4000.
F. Câmpuri cu structuri complexe
OBJECT – o structură complexă de informaţii care conţine date, proprietăţi şi
metode (proceduri şi funcţii scrise în PL/SQL).
REF – identificator al unui obiect care este stocat în altă parte. Este un pointer
către obiectul respectiv.
Managementul tabelelor şi a datelor
- 59 -
Baze de date Oracle
VARRAYS – matrice de date de dimensiune variabilă.
NESTED TABLES – set de elemente neordonate. Elementele sunt de tipuri
predefinite sau definite de utilizator.

8.2. Tipuri de tabele

Oracle utilizează următoarele tipuri de tabele:


- tabele obişnuite
- tabele în cluster – un cluster de tabele reprezintă un grup de tabele care au în
comun aceleaşi blocuri de date având coloane în comun
- tabele index organizate – tabele în care înregistrările sunt stocate după un
index care reprezintă cheia primară, cuprinzând una sau mai multe coloane
ale tabelei. Tabela are zone separate pentru cheia primară şi pentru restul
coloanelor. Permite acces rapid la înregistrări după cheia primară.
- tabele partiţionate – sunt tabele ale căror date sunt stocate în mai multe
partiţii (segmente). Fiecare partiţie poate fi gestionată independent şi se pot
opera independent. Utilizarea tabelelor partiţionate este avantajoasă pentru
tabele de mari dimensiuni care pot fi stocate pe discuri diferite.

8.3. Crearea unei tabele

Înainte de crearea unei tablele trebuie să se facă o estimare a spaţiului necesar


pentru date, indecşi, segment pentru scriere temporară (undo) şi spaţiu pentru fişiere
jurnal.
Crearea unei tabele se face prin c-da CREATE TABLE şi este arătată prin
exemplul următor:
CREATE TABLE hr.admin_emp (
empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
ssn NUMBER(9) ENCRYPT,
job VARCHAR2(10),
mgr NUMBER(5),
hiredate DATE DEFAULT (sysdate),
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(3) NOT NULL
CONSTRAINT admin_dept_fkey REFERENCES
hr.departments (department_id))
TABLESPACE admin_tbs
STORAGE ( INITIAL 50K);
Se creează tabela admin_emp în tablespace admin_tbs. Se observă că, o dată
cu câmpurile sunt precizate şi restricţiile impuse acestora (cheie primară, not null, cheie
străină). De asemenea sunt precizate şi opţiunile de stocare a tabelei.
O tabelă poate fi creată şi prin populare directă utilizând comanda CREATE
TABLE .. AS SELECT:
SQL> ALTER SESSION FORCE PARALLEL DDL;

Sesiune modificată.
Managementul tabelelor şi a datelor
- 60 -
Baze de date Oracle

SQL> CREATE TABLE hr.test PARALLEL as select * from hr.employees;

Tabelă creată.

Popularea tabelelor se poate face, în afară de CREATE ... AS SELECT, prin:


- SQL Loader – un utilitar pentru încărcarea datelor din diverse surse
- c-da SQL INSERT – care permite specificarea directă a datelor sau utilizarea
unui subquery.
- c-da MERGE – permite încărcarea datelor din alte tabele. Dacă datele încăcate
există atunci se face UPDATE, altcum se execută insert.

Exemplu: Înserarea salariatului IONESCU MIHAI în tabela EMPLOYEES:


SQL> insert into hr.employees values (400, 'IONESCU', 'MIHAI',
'mionescu@yahoo.com','0744/776599',to_date('31-03-2006'),
'PR_REP',2500, 0.5, 100,30);
1 înregistrare creată.

Înserarea în tabela dw_empl a salariaţilor angajaţi în ultimele 100 de zile:


SQL>INSERT INTO dw_empl
SELECT employee_id, first_name, last_name, hire_date, salary,
department_id
FROM employees
WHERE hire_date > sysdate – 100;

Crearea unei tabele cu bonusuri şi popularea ei pentru salariaţii care au obţinut


comenzi cu 100+10% din salariu şi 10% din salariu în rest, pentru salariaţii cu salariul
<= 8000:
CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100);
INSERT INTO bonuses(employee_id)
(SELECT e.employee_id FROM employees e, orders o
WHERE e.employee_id = o.sales_rep_id
GROUP BY e.employee_id);

MERGE INTO bonuses D


USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*0.1)
WHERE (S.salary <= 8000);
Instrucţiunea MERGE a fost introdusă în standardul SQL 2003 şi permite
înserarea de noi înregistrări sau modificarea celor existente în funcţie de găsirea sau nu
a unei chei în cele două surse.

Managementul tabelelor şi a datelor


- 61 -
Baze de date Oracle
8.4. Specificarea clauzelor de stocare

Prin aceste clauze se pot preciza următoarele:


- spaţiul alocat segmentelor de date
- spaţiul liber alocat în blocurile de date (pentru modificări exterioare)
Spaţiul alocat segmentelor de date este spaţiul aferent din tablespace. Nu toate
clauzele de stocare se pot specifica pentru obiectele bazei de date sau în comenzile
CREATE sau ALTER. Specificarea clauzelor de stocare interacţionează cu clauzele
stabilite pentru tablespace. Specificarea clauzelor se face după schema dată în figura
8.1.

Figura 8.1
Specificarea atributelor
fizice ale tabelelor

PCTFREE – specifică procentul din fiecare bloc de date care este rezervat
pentru modificări ulterioare. Valori posibile între 0 şi 99%. Implicit 10%. Această
valoare rezervă 10% din fiecare bloc de date pentru modificări şi permite înserarea de
noi înregistrări până la gradul de ocupare de 90%.
PCTUSED – specifică procentul minim pe care Oracle trebuie să-l menţină
ocupat din fiecare bloc de date. Valori între 0 şi 99%, implicit 40%. Suma dintre
PCTFREE şi PCTUSED nu trebuie să depăşească 100.
INITRANS – specifică valoarea iniţială a numărului de tranzacţii concurente
alocate fiecărui bloc de date. Valori
de la 1 la 255, implicit 1.
Clauzele de stocare stabilesc cum se
stochează obiectele bazei de date, în
particular a tabelei. Clauzele
afectează atât timpul de acces, cât şi
utilizarea eficientă a spaţiului de
stocare. Clauzele posibile sunt arătate
în figura 8.2.

Figura 8.2
Specificarea
clauzelor de stocare
ale tabelelor

Managementul tabelelor şi a datelor


- 62 -
Baze de date Oracle
INITIAL – specifică spaţiul alocat pentru început tabelei (sau mai general,
obiectului respectiv). Dimensiunea se dă în bytes, Kbytes, Mbytes, Gbytes, Tbytes,
notându-se nnnK, etc. Valoarea implicită este de 5 blocuri de date. Pentru tablespace
locally managed Oracle utilizează valoarea INITIAL în conjuncţie cu dimensiunea
extensiilor specificată pentru tablespace. De exemplu, pentru tablespace cu clauza
UNIFORM egală cu 5M, dacă se specifică INITIAL 1M, atunci Oracle creează 5
extensii de 1M.
NEXT – specifică dimensiunea următoarei extensii. Valoarea implicită 5
blocuri, minim 1 bloc de date.
PCTINCREASE – specifică modul în care creşte următoarea extensie în raport
cu precedenta. Se dă în procente, valoarea implicită fiind 50. Oracle rotunjeşte valoarea
rezultată la un număr întreg de blocuri de date.
MINEXTENS – specifică numărul de extensii alocate la crearea tabelei
(obiectului). Valoarea implicită 1.
MAXEXTENS – specifică numărul maxim de extensii (inclusiv primul) care pot
fi alocate tabelei.
Celelalte opţiuni din figura 8.2 sunt opţiuni avansate şi nu fac obiectul
prezentului curs.
Exemplu:
SQL> CREATE TABLE divisions
2 (div_no NUMBER(2),
3 div_name VARCHAR2(14),
4 location VARCHAR2(13) )
5 STORAGE ( INITIAL 100K NEXT 50K
6 MINEXTENTS 1 MAXEXTENTS 50 PCTINCREASE 5);

Tabelă creată.

8.5. Modificarea şi ştergerea tabelelor

Se realizează cu comanda SQL ALTER TABLE şi poate avea mai multe


scopuri:
- modificarea caracteristicilor fizice şi de stocare
- mutarea tabelei într-un segment nou sau în alt tablespace
- adăugarea, ştergerea sau redefinirea unei coloane din tabelă
- adăugarea, modificarea sau ştergerea unei restricţii
- activarea sau dezactivarea unor restricţii
- schimbarea numelui unei tabele
- altele

Exemple:
Modificarea spaţiului liber în blocuri:
SQL> alter table divisions
pctfree 20;

Tabelã modificată.

Managementul tabelelor şi a datelor


- 63 -
Baze de date Oracle
Mutarea tabelei DIVISIONS într-un nou segment, cu modificarea parametrilor
de stocare:
SQL> ALTER TABLE SCOTT.DIVISIONS MOVE
2 STORAGE ( INITIAL 20K
3 NEXT 40K
4 MINEXTENTS 2
5 MAXEXTENTS 20
6* PCTINCREASE 0 )

Tabelă modificată.

Adăugarea unei coloane în tabela divisions:

SQL>alter table scott.divisions


2* add (nr_sal number(4));

Tabelă modificată.
Ştergerea unei coloane:

SQL> alter table scott.divisions


2 drop column nr_sal;

Tabelă modificată.

Adăugarea unei chei primare:


SQL> alter table scott.divisions
2* add (PRIMARY KEY (DIV_NO))

Tabelă modificată.

Adăugarea unei restricţii tip domeniu:

SQL> alter table scott.divisions


2* add (CHECK (nr_sal between 1 and 100))

Tabelă modificată.

Dezactivarea unei restricţii:


SQL> alter table scott.divisions disable constraint sys_C005460;

Tabelă modificată.
Ştergerea unei tabele:
SQL> drop table scott.divisions;

Tabelul a fost eliminat.


Obţinerea de informaţii despre tabele se pot obţine cu ajutorul vederilor:
SQL> select * from user_tab_columns;
Apasati <ENTER>

TABLE_NAME COLUMN_NAME DATA_TYPE


------------------- ------------------------------ ----------

Managementul tabelelor şi a datelor


- 64 -
Baze de date Oracle
DEPT LOC VARCHAR2
DEPT DNAME VARCHAR2
DEPT DEPTNO NUMBER
EMP DEPTNO NUMBER
EMP COMM NUMBER
EMP SAL NUMBER
EMP HIREDATE DATE
EMP MGR NUMBER
EMP JOB VARCHAR2
EMP ENAME VARCHAR2
EMP EMPNO NUMBER
BONUS COMM NUMBER
BONUS SAL NUMBER
BONUS JOB VARCHAR2
BONUS ENAME VARCHAR2
SALGRADE HISAL NUMBER
SALGRADE LOSAL NUMBER
SALGRADE GRADE NUMBER

8.6. Managementul indecşilor

Indecşii sunt structuri asociate tabelelor şi au rolul de a reduce semnificativ


timpii de execuţie a instrucţiunilor SQL. Instrucţiunile SQL sunt identice fie că tabela
are sau nu are indecşi asociaţi.
Crearea unui index asociat unei tabele este fezabilă în următoarele situaţii:
- dacă există interogări frecvente care returnează mai puţin de 15% dintre
înregistrări;
- pentru interogarea tabelelor legate; trebuie indexate coloanele utilizate
pentru legătură;
Din punct de vedere logic, indecşii pot fi:
- index cu o coloană – când cheile index au o coloană, de exemplu în cazul
tabelei de personal, indexul creat pe coloana marca;
- index concatenat – cunoscut şi ca index compozit, când cheile index cuprind
mai multe coloane din tabel; numărul maxim de coloane în indexul compozit
este 32;
- index unic sau multiplu – indexul unic apare o singură dată în tabela
respectivă, adică există o singură linie în tabel care satisface valoarea cheii;
- index bazat pe funcţii – indexul este creat prin apelarea unei funcţii care se
bazează pe expresii cu valoarea uneia sau a mai multor coloane;
Din punct de vedere fizic indecşii pot fi:
- partiţionaţi sau nepartiţioanţi – se utilizează indecşi partiţionaţi pentru tabele
de mari dimensiuni, avantajul fiind acela al căutării simultane în mai multe
partiţii
- B-tree – este o structură arborescentă de indecşi, cu mai multe nivele
(rădăcină, ramuri, frunze). La ultimul nivel (frunze) indexul conţine
informaţii despre lungimea cheii, valoarea cheii şi ROWID. Aşa cum s-a mai
arătat ROWID este o pseudo-coloană în tabelele Oracle care memorează

Managementul tabelelor şi a datelor


- 65 -
Baze de date Oracle
unic adresa unui rând din tabelă (fişier de date, nr. bloc în fişierul de date, nr.
linie în blocul de date).
- Bitmap – este util atunci când tabela ale multe linii (milioane) în care
coloana sau coloanele cheie au valori apropiate. De asemenea indexul
bitmap este util atunci când se fac interogări care are mai multe condiţii în
clauza WHERE care utilizează OR. Indexul bitmap este recomandat atunci
când modificarea coloanelor index este foarte rară. Structura indexului
conţine valoarea cheii (coloana sau combinaţia de coloane), intervalul
ROWID (început şi sfârşit), un segment bitmap în care biţii aferenţi liniei din
tabelă sunt setaţi dacă rândul respectiv are ROWID în domeniu.
În concluzie, utilizarea celor două tipuri de indecşi este recomandată in funcţie
de următoarele criterii:
- pentru diferenţe mari între valorile cheii se recomandă B-tree în timp ce
pentru valori apropiate se recomandă Bitmap
- în cazul cheii tip Bitmap modificarea cheii este costisitoare
- cheia Bitmap este eficientă pentru interogări care conţine funcţia logică OR
- B-tree este reomandat pentru aplicaţii în timp real (de ex. OLTP) în timpm
ce Bitmap este recomandat pentru data warehousing.
Crearea unui index B-tree se face cu comenzi de forma:

SQL> create index pers_idx_empno on pers (empno)


2 pctfree 10
3 storage (initial 10K next 10K)
4* tablespace users

Index creat.

Crearea unui index Bitmap:


SQL>create bitmap index pers_idx_sal on pers (sal)
2 pctfree 10
3 storage (initial 10K next 10K)
4* tablespace users

Index creat.

Modificarea indecşilor se face cu c-da ALTER INDEX.


SQL> ALTER INDEX pers_idx_sal
2 DEALLOCATE UNUSED;

Index modificat.

Ştergerea unui index:


SQL> drop index pers_idx_sal;

Index eliminat.

Managementul tabelelor şi a datelor


- 66 -
Baze de date Oracle

9. INTEGRITATEA DATELOR ŞI RESTRICŢII ÎN BAZA DE


DATE
Integritatea datelor este un aspect important al bazelor de date Oracle. Aceasta
înseamnă un set de reguli care trebuie să fie respectate de către datele încărcate în baza
de date. Aceste reguli sunt comune pentru orice utilizator sau aplicaţie care modifică
datele.

9.1. Metode de control a integrităţii datelor

Există trei metode primare pentru controlul integrităţii datelor:


- prin codul aplicaţiilor
- prin trigerele din baza de date
- prin restricţii impuse în baza de date
Aplicaţiile prin care se controlează datele pot fi aplicaţii client sau proceduri
stocate în baza de date. Au dezavantajul că fiecare aplicaţie care accesează/modifică
datele trebuie să conţină codul de control.
Trigerele sunt proceduri stocate în baza de date care se activează la anumite
evenimente: înserarea, modificarea, ştergerea sau citirea unei înregistrări. Trigerele pot
fi activate înainte sau după aceste evenimente. De exemplu, prin activarea acestora
înainte de scrierea în baza de date, se pot face diverse verificări ale integrităţii datelor.
Utilizarea restricţiilor este o metodă sigură şi simplă şi constă în înregistrarea în
baza de date a unor restricţii impuse variabilelor care sunt scrise în coloanele tabelei.
Tipurile de restricţii impuse datelor sunt:
- NOT NULL – precizează că valoarea coloanei trebuie completată
- UNIQUE – precizează că o coloană sau o combinaţie de coloane au o
valoare unică în tabel;
- PRIMARY KEY – desemnează că o coloană sau o combinaţie de coloane
care este cheie primară în tabelă
- FOREIGN KEY - desemnează că o coloană sau o combinaţie de coloane
care este cheie primară într-o altă tabelă (cheie străină)
- CHECK – specifică o condiţie pe care fiecare linie trebuie să o satisfacă.

9.2. Stări ale restricţiilor

O restricţie pentru controlul integrităţii datelor poate avea una din următoarele
stări:
• ENABLE, VALIDATE
• ENABLE, NOVALIDATE
• DISABLE, VALIDATE
• DISABLE, NOVALIDATE
O restricţie cu starea DISABLE NOVALIDATE nu este verificată. Datele sunt
prelucrate fără controlul integrităţii respective.

Integritatea datelor şi restricţii în baza de date


- 67 -
Baze de date Oracle
O restricţie cu starea DISABLE VALIDATE nu permite modificarea coloanei
respective.
O restricţie cu starea ENABLE NOVALIDATE nu permite înserarea de date noi
care încalcă restricţia, dar tabela poate conţine date care nu respectă restricţia.
O restricţie cu starea ENABLE VALIDATE nu permite înserarea de date noi care
încalcă restricţia iar tabela este verificată (în legătură cu restricţia respectivă) la
activarea ei cu c-da ALTER TABLE.

9.3. Verificarea restricţiilor

Verificarea restricţiilor pot fi amânate până la finalizarea unei tranzacţii (scrierea


definitivă în baza de date sau comiterea acesteia). Verificarea poate fi făcută şi imediat
după lansarea comenzii DML.
Trecerea de la un mod de lucru la altul se face cu c-da ALTER SESSION SET
CONSTRAINTS.
Restricţiile verificate imediat (NONDEFERRED sau IMMEDIATE) acţionează la
sfârşitul fiecărei comenzi DML. O restricţie încălcată generează automat revenirea la
starea anterioară (rollback).
Restricţiile verificate la comiterea tranzacţiilor (DEFERRED CONSTRAINTS)
generează rollback pentru întreaga tranzacţie dacă, la acest moment, restricţiile nu sunt
respectate.
O restricţie definită ca DEFERRED poate fi setată în două moduri, la definirea ei:
- INITIALLY IMMEDIATE – verificarea se face după fiecare comandă
- INITIALLY DEFERRED – verificarea se face la sfârşitul tranzacţiei

9.4. Utilizarea cheilor în tabele

Cheia primară (PRIMARY KEY) şi cheia unică (UNIQUE) este pusă în practică
prin utilizarea indecşilor. Se poate controla locaţia şi tipul de index care este folosit.
Severul Oracle utilizează următoarea procedură pentru a implementa cheia unică şi
cheia primară:
- dacă restricţia este dezactivată (DISABLE), nu este necesar un index;
- dacă restricţia este activă (ENABLE) şi coloana este parte a unui index
atunci indexul este utilizat pentru crearea şi întreţinerea restricţiei;
- dacă restricţia este activă şi nu există un index pe coloană, atunci el este
creat automat.
În legătură cu cheile străine, acestea reduc posibilitatea de manevră în cazul
tabelelor legate. Pentru administratori, ştergerea unei tabele, trunchierea acesteia,
ştergerea unui tablespace care conţine o tabelă legată impune utilizarea opţiunii
CASCADE CONSTRAINTS.

9.5. Crearea, modificarea şi ştergerea restricţiilor

Restricţiile pot fi create/modificate în mai multe feluri. O primă modalitate este


aceea a creării lor o dată cu crearea tabelelor:
Integritatea datelor şi restricţii în baza de date
- 68 -
Baze de date Oracle
Crearea unei tabele de personal cu cheia primară marca, cu salariul între 1000 şi
6000 lei:
SQL> create table personal
2 (marca number(5) PRIMARY KEY,
3 Nume varchar2(20) not null,
4 salariu number(10,2) not null constraint pers_val_salariu
5 CHECK (salariu > 1000 and salariu <=6000) initially deferred
deferrable);

Tabelă creată.
Crearea unei tablele de subunităţi:
SQL> create table subunitati
2 (cod_sub number (3) PRIMARY KEY,
3 denumire varchar2(30) not null);

Tabelă creată.
Modificarea tabelei personal şi adăugarea coloanei pentru subunităţi:

SQL>alter table personal add


2* (cod_sub number(3));

Tabelă modificată
Adăugarea unei legături între cele două tabele:
SQL> alter table personal add
2 constraint p_fk FOREIGN KEY (cod_sub) REFERENCES subunitati;

Tabelă modificată.

SQL> select user from dual;


Apasati <ENTER>

USER
------------------------------
TEST
SQL> select owner, table_name,constraint_name, constraint_type, status, deferrable,
deferred from user_constraints;
Apasati <ENTER>

OWNER TABLE_NAME CONSTRAINT_NAME C STATUS DEFERRABLE DEFERRED


------------------------------ ------------------------------ -------------
TEST SUBUNITATI SYS_C005484 C ENABLED NOT DEFERRABLE IMMEDIATE
TEST PERSONAL SYS_C005483 C ENABLED NOT DEFERRABLE IMMEDIATE
TEST PERSONAL SYS_C005482 C ENABLED NOT DEFERRABLE IMMEDIATE
TEST PERSONAL PERS_VAL_SALARIU C ENABLED NOT DEFERRABLE IMMEDIATE
TEST PERSONAL P_FK R ENABLED NOT DEFERRABLE IMMEDIATE
TEST PERSONAL SYS_C005485 P ENABLED NOT DEFERRABLE IMMEDIATE
TEST SUBUNITATI SYS_C005486 P ENABLED NOT DEFERRABLE IMMEDIATE

7 înregistrãri selectate.

SQL>
Dezactivarea unei restricţii:
SQL> alter table personal disable constraint pers_val_salariu;

Tabelă modificată.

Integritatea datelor şi restricţii în baza de date


- 69 -
Baze de date Oracle
SQL> insert into personal values (100, 'Ionescu Vasile', 9000,20);

1 înregistrare creată.
Se observă că am înserat o înregistrare care încalcă restricţia salariu ∈ (1000,6000].
SQL> alter table personal enable validate constraint pers_val_salariu
*
EROARE la linia 1:
ORA-02293: (TEST.PERS_VAL_SALARIU) nu a putut fi validatã - restricţie
de verificare violată
Nu se poate activa restricţia pentru că există o înregistrare care este încălcată. Se poate
activa numai pentru înregistrările viitoare:

SQL> alter table personal enable novalidate constraint


pers_val_salariu

Tabelă modificată.
SQL> select * from personal;
Apasati <ENTER>

MARCA NUME SALARIU COD_SUB


---------- -------------------- ---------- ----------
100 Ionescu Vasile 9000 20
Dacă modificăm valoarea eronată, putem activa restricţia:
SQL> update personal set salariu=5000 where marca=100;

1 înregistrare actualizată.
SQL> alter table personal enable validate constraint pers_val_salariu;

Tabelă modificată.
Redenumirea unei restricţii:
SQL> alter table personal rename constraint SYS_C005485 to pk_pers;

Tabelă modificată.
SQL> select owner, constraint_name, constraint_type, status from
user_constraints where table_name='PERSONAL';

Apasati <ENTER>

OWNER CONSTRAINT_NAME C STATUS


------------ ------------ ------------------------------ - --------
TEST PK_PERS P ENABLED
TEST P_FK R ENABLED
TEST PERS_VAL_SALARIU C ENABLED
TEST SYS_C005482 C ENABLED
TEST SYS_C005483 C ENABLED

Ştergerea unei restricţii:


SQL> alter table personal drop constraint pers_val_salariu

Tabelă modificată.

SQL> alter table personal add

Integritatea datelor şi restricţii în baza de date


- 70 -
Baze de date Oracle
2* (constraint pers_val_salariu check (salariu>1000 and
salariu<=6000) initially deferred deferrable);

Tabelă modificată.

SQL> insert into personal values ('200', 'Popescu Mioara',400,20);

1 înregistrare creatã.

SQL> commit;
commit
*
EROARE la linia 1:
ORA-02091: tranzacţia a fost derulată înapoi
ORA-02290: regulă de constrângere (TEST.PERS_VAL_SALARIU) violată
Aici se observă influenţa restricţiilor DEFERRED. O înregistrare s-a inserat fără a
respecta restricţiile, însă la sfârşitul tranzacţiei (COMMIT) ea a fost respinsă şi s-a făcut
ROLLBACK.

Integritatea datelor şi restricţii în baza de date


- 71 -
Baze de date Oracle

10. MANAGEMENTUL UTILIZATORILOR ŞI


SECURITATEA INFORMAŢIILOR
Este foarte importantă gestionarea accesului utilizatorilor la datele dintr-o bază
de date ORACLE. Drepturile sunt alocate utilizatorilor de către administratorii bazei de
date.
10.1. Utilizarea profilelor pentru utilizatori

Un profil este un set de reguli definite în legătură cu parola şi resursele bazei de


date. După definirea lui, un profil poate fi setat pentru unul sau mai mulţi utilizatori.
Printr-un profil se pot seta următoarele restricţii:
• termen pentru expirarea parolei
• istoric privind reutilizarea unei parole
• verificarea complexităţii
• blocarea unei parole
• alocarea timpilor pentru procesor
• timpi de conectare
• memorie alocată utilizatorului
• resurse I/O alocate (volum de date citit din baza de date)
Oracle creează automat un profil implicit pentru toţi utilizatorii. Pentru profilul
implicit, toate resursele sunt nelimitate. Totuşi, administratorul bazei de date poate
modifica valorile resurselor alocate pentru profilul DEFAULT.
Utilizarea profilelor este utilă pentru:
• limitarea utilizatorilor pentru a executa anumite operaţii care necesită resurse
importante
• asigurarea că utilizatorii sunt deconectaţi de la baza de date dacă le-a expirat
timpul de conectare
• stabilirea resurselor care pot fi folosite de utilizatori similari
• managementul resurselor în cazul bazelor de date cu mulţi utilizatori
• controlul utilizării parolelor
Asignarea unui profil nu afectează sesiunea curentă a utilizatorului. Profilele pot
fi atribuite numai utilizatorilor nu şi rolurilor.
Managementul parolelor ne oferă următoarele facilităţi:
• blocarea contului: se realizează automat dacă la conectare se dă o parolă
greşită de un anumit număr de ori
• termen de utilizare: după o perioadă prestabilită o parolă expiră dacă nu a fost
reînnoită
• istoricul parolei: verifică că parolele noi nu sunt parole vechi care au mai fost
utilizate. Parolele vechi pot fi reutilizate decât după un anumit timp sau după
un anumit număr de schimbări ale acestora.
• verificarea complexităţii parolei (lungime, să nu fie identică cu numele
utilizatorului, să difere de precedenta cu minim 3 caractere, etc)

Managementul utilizatorilor şi securitatea informaţiilor


- 72 -
Baze de date Oracle
Exemple:
SQL> CREATE PROFILE pers_profil LIMIT
2 SESSIONS_PER_USER UNLIMITED
3 CPU_PER_SESSION UNLIMITED
4 CPU_PER_CALL 3000
5 CONNECT_TIME 45
6 LOGICAL_READS_PER_SESSION DEFAULT
7 LOGICAL_READS_PER_CALL 1000
8 PRIVATE_SGA 15K
9* COMPOSITE_LIMIT 5000000

Profil creat.
Cu profilul de mai sus se impun următoarele restricţii:
- numărul de sesiuni simultane pentru utilizator – nelimitat
- într-o sesiune utilizatorul poate utiliza nelimitat timpul procesorului
- un simplu apel al utilizatorului nu poate solicita mai mult de 3000 sutimi de
secundă (30 secunde)
- o sesiune nu poate dura mai mult de 45 minute
- numărul de blocuri citite din BD este cel stabilit în profilul DEFAULT
- un simplu apel nu poate citi mai mult de 1000 blocuri
- se alocă 15 K din SGA
- într-o sesiune nu poate consuma mai mult de 5 milioane de unităţi de servire.

SQL> CREATE OR REPLACE FUNCTION verify_function


2 (username varchar2,
3 password varchar2,
4 old_password varchar2)
5 RETURN boolean IS
6 n boolean;
7 m integer;
8 differ integer;
9 isdigit boolean;
10 ischar boolean;
11 ispunct boolean;
12 digitarray varchar2(20);
13 punctarray varchar2(25);
14 chararray varchar2(52);
15
16 BEGIN
17 digitarray:= '0123456789';
18 chararray:=
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
19 punctarray:='!"#$%&()''*+,-/:;<=>?_';
20
21 --Verifica daca parola este identica cu numele
utilizatorului
22 IF password = username THEN
23 raise_application_error(-20001, 'Parola este la fel ca
utilizatorul');
24 END IF;
25
26 --Verifica lungimea parolei

Managementul utilizatorilor şi securitatea informaţiilor


- 73 -
Baze de date Oracle
27 IF length(password) < 4 THEN
28 raise_application_error(-20002, 'Parola este mai mica ca
4');
29 END IF;
30
31 --Verifica daca parola este prea simpla
32 --prin verificarea ca nu este data de cuvinte
33 --care sunt prea simple ca sa fie parola.
34
35 IF NLS_LOWER(password) IN ('welcome', 'database',
'account', 'user',
36 'password', 'oracle', 'computer', 'abcd')
37 THEN raise_application_error(-20002, 'Parola este prea
simpla');
38 END IF;
39
40 --Verifica daca parola are cel putin o litera, o cifra,
41 --si un semn de punctuatie.
42 --1. Verifica daca are o cifra
43 --Se poate utiliza o cifra 0...9.
44
45 isdigit:=FALSE;
46 m := length(password);
47 FOR i IN 1..10 LOOP
48 FOR j IN 1..m LOOP
49 IF substr(password,j,1) = substr(digitarray,i,1) THEN
50 isdigit:=TRUE;
51 GOTO findchar;
52 END IF;
53 END LOOP;
54 END LOOP;
55 IF isdigit = FALSE THEN
56 raise_application_error(-20003, 'Parola trebuie sa
cuprinda cel putin \
57 o cifra, un caracter si un semn de punctuatie');
58 END IF;
59 --2. Cauta un caracter
60
61 <<findchar>>
62 ischar:=FALSE;
63 FOR i IN 1..length(chararray) LOOP
64 FOR j IN 1..m LOOP
65 IF substr(password,j,1) = substr(chararray,i,1) THEN
66 ischar:=TRUE;
67 GOTO findpunct;
68 END IF;
69 END LOOP;
70 END LOOP;
71 IF ischar = FALSE THEN
72 raise_application_error(-20003, 'Parola trebuie sa
cuprinda cel putin \
73 o cifra, un caracter si un semn de punctuatie');
74 END IF;
75 --3. Cauta un semn de punctuatie

Managementul utilizatorilor şi securitatea informaţiilor


- 74 -
Baze de date Oracle
76
77 <<findpunct>>
78 ispunct:=FALSE;
79 FOR i IN 1..length(punctarray) LOOP
80 FOR j IN 1..m LOOP
81 IF substr(password,j,1) = substr(punctarray,i,1) THEN
82 ispunct:=TRUE;
83 GOTO endsearch;
84 END IF;
85 END LOOP;
86 END LOOP;
87 IF ispunct = FALSE THEN raise_application_error(-20003,
'Parola trebuie sa cuprinda cel putin \
88 o cifra, un caracter si un semn de punctuatie');
89 END IF;
90
91 <<endsearch>>
92 --Verifica ca parola difera de precedenta cu cel putin 3
caractere
93 IF old_password = '' THEN
94 raise_application_error(-20004, 'Old password is null');
95 END IF;
96 --Daca toate conditiile sunt satisfacute returneaza TRUE ;
97 differ := length(old_password) - length(password);
98 IF abs(differ) < 3 THEN
99 IF length(password) < length(old_password) THEN
100 m := length(password);
101 ELSE
102 m:= length(old_password);
103 END IF;
104 differ := abs(differ);
105 FOR i IN 1..m LOOP
106 IF substr(password,i,1) != substr(old_password,i,1) THEN
107 differ := differ + 1;
108 END IF;
109 END LOOP;
110 IF differ < 3 THEN
111 raise_application_error(-20004, 'Parola trebuie să
difere cu minim\
112 3 caractere');
113 END IF;
114 END IF;
115 --Daca toate conditiile sunt satisfacute returneaza TRUE ;
116 RETURN(TRUE);
117 END;
118 /

Funcţie creată.
SQL> CREATE PROFILE pers_prof2 LIMIT
2 FAILED_LOGIN_ATTEMPTS 5
3 PASSWORD_LIFE_TIME 60
4 PASSWORD_REUSE_TIME 60
5 PASSWORD_REUSE_MAX 5
6 PASSWORD_VERIFY_FUNCTION verify_function

Managementul utilizatorilor şi securitatea informaţiilor


- 75 -
Baze de date Oracle
7 PASSWORD_LOCK_TIME 1/24
8 PASSWORD_GRACE_TIME 10;

Profil creat.
SQL> alter user test profile pers_prof2;

Utilizator modificat.
S-a ataşat utilizatorului test profilul pers_prof2. Profilul are următoarele
particularităţi:
- numărul de încercări înainte de blocarea contului este 5;
- durata de utilizare a parolei este 60 de zile, cu o perioadă ulterioară de 10 zile
de graţie în care aceasta poate fi schimbată;
- parola poate fi reutilizată după 60 de zile dacă s-au efectuat alte 5 modificări de
parolă între timp;
- la introducerea unei parole noi se fac verificările din funcţia
VERIFY_FUNCTION;
- blocarea parolei la parolă greşită se va face după 1/24 zile (o oră).

10.2. Scheme şi utilizatori în baza de date

O schemă este o colecţie de date structurate sau obiecte. Schema este


proprietatea unui utilizator al bazei de date şi are acelaşi nume ca şi acesta. Schema de
obiecte este administrată de comenzi SQL şi include următoarele tipuri de obiecte:
Clusters
Constraints
Database links
Database triggers
Dimensions
External procedure libraries
Index-organized tables
Indexes
Indextypes
Java classes, Java resources, Java sources
Materialized views
Materialized view logs
Object tables
Object types
Object views
Operators
Packages
Sequences
Stored functions, stored procedures
Synonyms
Tables
Views
Există obiecte ale bazei de date care nu fac parte dintr-o schemă:

Managementul utilizatorilor şi securitatea informaţiilor


- 76 -
Baze de date Oracle
Contexts
Directories
Parameter files (PFILEs) and server parameter files (SPFILEs)
Profiles
Roles
Rollback segments
Tablespaces
Users
O dată cu crearea bazei de date se creează şi câţiva utilizatori:
- SYS – este proprietarul bazei de date şi are parola implicita change_on_install
- SYSTEM – este administratorul bazei de date şi are parola manager
- SYSMAN – administrator pentru Oracle Enterprise Manager, parola implicită
oem_temp
- HR – proprietarul schemei Human Resources, parola HR
- SCOTT – proprietarul unei scheme exemplu, parola implicită tiger.
Există mai multe metode de autentificare a utilizatorilor în baza de date Oracle:
- autentificare de către baza date – în acest caz utilizatorul este acceptat pe
baza numelui şi a parolei gestionate de baza de date. Se vor utiliza numai
setul de caractere ASCII, fără semne diacritice. Se recomandă utilizarea
profilelor şi a managementului parolelor.
- autentificare de către sistemul de operare sau de către serviciile de reţea –
numită şi autorizare externă
- autentificare globală prin Secure Sockets Layer (SSL) când accesul este
controlat de roluri globale, prin servicii la nivelul companiei, cum este
LDAP. Lightweight Directory Access Protocol, sau LDAP este un protocol
pentru interogări sau modificări ale serviciilor de tip director care rulează
peste TCP/IP.
- autentificarea printr-un proxy server – caz utilizat atunci când se utilizează
servere de aplicaţii (middle-tier).
În continuare ne vom referi la autentificarea de către baza de date. Autentificarea
de către SO nu se recomandă, iar celelalte moduri de autentificare reprezintă variante
avansate. Pentru aceasta parametrul de iniţializare REMOTE_OS_AUTHENT =
FALSE.

10.3. Crearea şi administrarea utilizatorilor

Crearea utilizatorilor se face cu c-da CREATE USER:


SQL> conn / as sysdba
Conectat.
SQL> create user test identified by test
2 default tablespace users
3 quota unlimited on users
4 temporary tablespace temp;

Utilizator creat.

Managementul utilizatorilor şi securitatea informaţiilor


- 77 -
Baze de date Oracle
SQL> grant connect to test;

Permisiune acordată.

SQL> conn test/test@hazi


Conectat.
S-a creat utilizatorul TEST cu parola TEST care are spaţiu nelimitat alocat în
tablespace USERS. Înainte de utilizare trebuie acordată privilegiul CONNECT contului
respectiv.
Modificarea parolei se face cu c-da PASSWORD din SQL sau cu ALTER
USER:
SQL> conn test/test
Conectat.
SQL> password
Modific parola pentru TEST
Parolă veche: ****
Parolă nouă: ****
Reintroduceţi noua parolă: ****
Parolă modificată
SQL> alter user test identified by test replace hazi;

Utilizator modificat.
Alte drepturi sau modificări ale profilului sau rolurilor acordate se face cu c-da
ALTER USER:
SQL> ALTER USER test
DEFAULT TABLESPACE data_ts
TEMPORARY TABLESPACE temp_ts
QUOTA 100M ON data_ts
QUOTA 0 ON test_ts
PROFILE clerk;

Utilizator modificat.
Ştergerea unui utilizator se face cu c-da DROP USER:
SQL> drop user test cascade;

Utilizator modificat.
Opţiunea CASCADE permite ştergerea tuturor obiectelor aflate în proprietatea
utilizatorului şi a altor legături (restricţii) în baza de date.
Obţinerea de informaţii despre utilizatori se pot obţine cu vederile:
Vedere Desriere
DBA_USERS Afişează toţi utilizatorii din baza de date
ALL_USERS Afişează utilizatorii vizibili pentru utilizatorul curent
USER_USERS Descrie utilizatorul curent
DBA_TS_QUOTAS Afişează cotele de spaţiu alocate utilizatorilor

USER_TS_QUOTAS
USER_PASSWORD_LIMITS Descrie restricţiile impuse parolei utilizatorului

Managementul utilizatorilor şi securitatea informaţiilor


- 78 -
Baze de date Oracle
Vedere Desriere
USER_RESOURCE_LIMITS Afişează drepturile de utilizare a resurselor bazei de date pentru
utilizatorul curent
DBA_PROFILES Afişează profilele utilizator şi limitările impuse
RESOURCE_COST Afişează costul setat pentru fiecare resursă
V$SESSION Informaţii despre sesiunile fiecărui utilizator
V$SESSTAT Afişează statistici despere sesiunile utilizator
V$STATNAME Afişează informaţii explicite despre sesiuni
SQL> conn test /test
Conectat.
SQL> select * from USER_PASSWORD_LIMITS;
Apasati <ENTER>

RESOURCE_NAME LIMIT
-------------------------------- ----------------
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 60
PASSWORD_REUSE_TIME 60
PASSWORD_REUSE_MAX 5
PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION
PASSWORD_LOCK_TIME ,0416
PASSWORD_GRACE_TIME 10

7 înregistrări selectate.

10.4. Administrarea privilegiilor

Privilegiile reprezintă drepturi de a executa anumite comenzi SQL sau proceduri


PL/SQL precum şi dreptul unui utilizator de a vizualiza sau modifica informaţiile dintr-
un tabel cu date care sunt proprietatea altui utilizator. Exemple de asemenea privilegii:
- conectarea la baza de date
- crearea unei tabele
- vizualizarea informaţiilor din tabele care sunt în proprietatea altui utilizator
- executarea unei proceduri stocate aflate în proprietatea altui utilizator.
Din definiţia de mai sus rezultă că privilegiile se împart în două mari categorii:
- privilegii de sistem – care se referă la dreptul unui utilizator de a executa
operaţii de administrare a bazei de date, cum ar fi crearea unui tablespace;
- privilegii tip obiect – care se referă la dreptul unui utilizator de a executa
operaţii asupra unor obiecte care nu sunt în proprietatea sa (tabele, vederi,
secvenţe, proceduri, funcţii, etc)
Un privilegiu poate fi acordat unui utilizator sau unui rol. Un rol este o sumă de
privilegii care uşurează activitatea de administrare a privilegiilor.
Privilegiile de sistem în baza de date Oracle 10g sunt peste 150. În tabelul 10.1
se dau câteva exemple de privilegii de sistem.

Managementul utilizatorilor şi securitatea informaţiilor


- 79 -
Baze de date Oracle
Tabelul 10.1
Privilegii de sistem – Exemple
Categoria Privilegiu Utilizare
TABLE CREATE TABLE Crearea unei tabele
CREATE ANY TABLE Crearea unei tabele în orice
schemă
ALTER ANY TABLE Modifică orice tabelă din baza
de date
DROP ANY TABLE Şterge orice tabelă
SELECT ANY TABLE Vizualizare date din orice
tabelă
SESSION CREATE SESSION Conectare la baza de date
ALTER SESSION Setează sau modifică condiţiile
sau parametrii sesiunii de
conectare la baza de date
RESTRICTED SESSION Permite conectarea la o bază de
date care a fost pornită în mod
restricţionat (STARTUP
RESTRICT)
PROCEDURE CREATE ANY PROCEDURE Creează proceduri, funcţii sau
pachete în orice schemă a bazei
de date
ALTER ANY PROCEDURE Modifică proceduri, funcţii sau
pachete în orice schemă a bazei
de date
EXECUTE ANY PROCEDURE Execută orice procedură sau
funcţie
Pentru acordarea privilegiilor se utilizează comenzile SQL GRANT şi
REVOKE. La acordarea unui privilegiu se poate adăuga opţiunea WITH ADMIN
OPTION care permite utilizatorului respectiv să dea acel drept şi altora.
Exemple:
SQL> conn / as sysdba
Conectat.
SQL> grant select any table to test;

Permisiune acordatã.

SQL> conn test/test


Conectat.
SQL> select * from hr.departments;
Apasati <ENTER>

DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID


------------- ------------------------------ ---------- --------
10 Administration 200 1700
20 Marketing 201 1800
30 Purchasing 114 1700
40 Human Resources 203 2400

SQL> conn / as sysdba

Managementul utilizatorilor şi securitatea informaţiilor


- 80 -
Baze de date Oracle
Conectat.
SQL> revoke select any table from test;

Revocare acordată.
SQL> grant alter session to test
2 with admin option;

Permisiune acordatã.

SQL> conn test/test


Conectat.
SQL> alter session set nls_language=english;

Session altered.
Sunt anumite privilegii pe care la are implicit numai utilizatorii cu rolurile
SYSDBA sau SYSOPER: STARTUP, SHUTDOWN, ALTER DATABASE OPEN |
MOUNT, RECOVER DATABASE.
Privilegiile tip obiect sunt privilegii sau drepturi pentru a executa o acţiune
anume asupra unei tabele, vederi, secvenţe, proceduri. Câteva privilegii asupra
obiectelor sunt date în tabelul 10.2:
Tabelul 10.2
Privilegii tip obiect – Exemple
Categoria Privilegiu Utilizare
TABLE ALTER Modifică structura tabelei
DELETE Ştergere de înregistrări din
tabelă
INDEX Creează un index pentryu
tabelă
INSERT Înserează înregistrări în tabelă
SELECT Vizualizare date
UPDATE Modifică rânduri din tabelă
REFERENCES Creează o restricţie care referă
tabela (de ex. cheie străină)
PROCEDURE, EXECUTE Execută procedura sau funcţia
FUNCTION, direct
PACKAGE DEBUG Acces prin depanator la
variabile, metode şi alte tipuri
definite
Exemple:
SQL> grant select on personal to scott;

Permisiune acordată.

10.5. Administrarea rolurilor

Aşa cum am menţionat, rolurile cumulează o serie de privilegii. Rolurile pot fi


alocate utilizatorilor sau altor roluri. Rolurile pot fi date utilizatorilor la fel ca
privilegiile de sistem. Un rol poate să conţină privilegii sistem şi privilegii tip obiect.

Managementul utilizatorilor şi securitatea informaţiilor


- 81 -
Baze de date Oracle
Rolurile pot fi activate sau dezactivate pentru fie care utilizator. Rolurile nu sunt în
proprietatea unui utilizator. Ele sunt stocate în dicţionarul bazei de date.
Avantajele rolurilor sunt:
• se uşurează managementul privilegiilor. În loc să se acorde individual un
număr de privilegii se acordă individual câte un rol;
• modificarea rolurilor implică automat modificarea privilegiilor la toţi
utilizatorii care au acest rol;
• rolurile pot fi activate şi dezactivate temporar
• rolurile nu pot fi asignate prin comenzi ale sistemului de operare.

Crearea rolurilor se face cu c-da CREATE ROLE, utilizatorul trebuind să aibă


acest privilegiu.
Există o serie de roluri predefinite, tabela 10.3.
Tabelul 10.3
Rouri predefinite
Rol Scriptul care îl creează Privilegii incluse
CONNECT SQL.BSQ CREATE SESSION
RESOURCE SQL.BSQ CREATE CLUSTER,
CREATE
INDEXTYPE,
CREATE
OPERATOR,
CREATE
PROCEDURE,
CREATE
SEQUENCE,
CREATE TABLE,
CREATE TRIGGER,
CREATE TYPE
DBA SQL.BSQ toate privilegiile de
sistem cu WITH
ADMIN OPTION

EXP_FULL_DATABASE CATEXP.SQL Privilegii necesare


pentru a exporta orice
din baza de date
IMP_FULL_DATABASE CATEXP.SQL Privilegii necesare
pentru a importa orice
în baza de date
DELETE_CATALOG_ROLE SQL.BSQ DELETE în tabela de
audit AUD$
EXECUTE_CATALOG_ROLE SQL.BSQ Privilegiul EXECUTE
asupra obiectelor din
dicţionar
SELECT_CATALOG_ROLE SQL.BSQ Privilegiul SELECT
asupra obiectelor din
dicţionar

Managementul utilizatorilor şi securitatea informaţiilor


- 82 -
Baze de date Oracle
RECOVERY_CATALOG_OWNER CATALOG.SQL Privilegii pentru
proprietarul
catalogului de
recuperare
HS_ADMIN_ROLE CATHS.SQL Privilegii de acces la
serviciile care permit
lucrul cu baze de date
străine

Exemplu: Crearea unui rol pers prin care utilizatorul are acces la tabela
employees din schema hr:
SQL>create role pers identified by hr;

Rol creat.

SQL> grant select on hr.employees to pers;

Permisiune acordată.

SQL> grant pers to test;

Permisiune acordată.
SQL> conn test/test@hazi
Conectat.
SQL> select first_name, last_name, salary from hr.employees;

FIRST_NAME LAST_NAME SALARY


-------------------- ------------------------- ----------
Steven King 24000
Neena Kochhar 17000
Lex De Haan 17000
Alexander Hunold 9000
Bruce Ernst 6000
David Austin 4800
Valli Pataballa 4800
Diana Lorentz 4200
Nancy Greenberg 12000
Daniel Faviet 9000
John Chen 8200
Clauza IDENTIFIED asigură că rolul va fi activ numai pentru utilizatorul cu
parola scrisă în clauză.
Ştergerea unui rol se face cu c-da DROP ROLE:
SQL> drop role pers;

Rol modificat.

Managementul utilizatorilor şi securitatea informaţiilor


- 83 -
Baze de date Oracle

11. SQL ÎN ORACLE

11.1. Oracle SQL Plus

În paragraful 3.3 s-au prezentat câteva informaţii esenţiale despre SQL Plus. Aşa
cum s-a arătat, SQL Plus este un instrument de bază în administrarea bazei de date,
precum şi în testarea interogărilor SQL. De asemenea în SQL Plus se pot obţine rapid
rapoarte formatate text, rezultate dintr-o interogare SQL.
Pentru a executa o procedură PL/SQL sau un bloc PL/SQL acesta se scrie într-
un fişier ASCII şi se execută cu c-da @fişier_sql sau se tastează direct blocul PL/SQL:
SQL> DECLARE
2 x NUMBER := 100;
3 BEGIN
4 DELETE FROM TEMP;
5 FOR i IN 1..10 LOOP
6 IF MOD (i, 2) = 0 THEN --i is even
7 INSERT INTO temp VALUES (i, x, 'i is even');
8 ELSE
9 INSERT INTO temp VALUES (i, x, 'i is odd');
10 END IF;
11 x := x + 100;
12 END LOOP;
13 END;
14 /

Procedură PL/SQL încheiată cu succes.

SQL> commit;

Confirmare finalizată.

SQL> select n1 as i, n2 as numar, explicatii as Par_impar from


temp;
Apasati <ENTER>

I NUMAR PAR_IMPAR
---------- ---------- ---------------
1 100 i is odd
2 200 i is even
3 300 i is odd
4 400 i is even
5 500 i is odd
6 600 i is even
7 700 i is odd
8 800 i is even
9 900 i is odd
10 1000 i is even

10 înregistrări selectate.

SQL în Oracle
- 84 -
Baze de date Oracle
Se remarcă că un bloc PL/SQL începe cu DECLARE, dacă sunt variabile de
declarat sau cu BEGIN în caz contrar. Pentru a fi executată, după ultima linie de cod
(END) se introduce /.
Pe lângă blocuri PL/SQL pot fi create şi stocate proceduri şi funcţii
precompilate în baza de date. Acestea pot fi lansate şi referite de către orice aplicaţie
sau utilizator în funcţie de drepturile utilizatorului. Generarea acestora se face cu c-zile
SQL CREATE PROCEDURE, respectiv CREATE FUNCTION:
SQL> CREATE OR REPLACE PROCEDURE sterg_sal (nmarca IN NUMBER, nr_sal
OUT NUMBER) AS
2 BEGIN
3 DELETE FROM personal
4 WHERE personal.marca = nmarca;
5 Select count(*) into nr_sal from personal;
6 END;
7 /

Procedură creată.
Să considerăm următorul bloc PL/SQL care apelează procedura:
SQL> DECLARE nr_salariati number;
2 BEGIN
3 sterg_sal(110,nr_salariati);
4 DBMS_OUTPUT.PUT_LINE('Nr. salariaţi rămaşi: '
||TO_CHAR(nr_salariati));
5* END;
/
Nr. salariaţi rămaşi: 20

Procedură PL/SQL încheiată cu succes.


Să precizăm că procedurile pot fi şi în C sau JAVA.
Vizualizarea textului procedurii stocate se poate face cu vederea USER_SOURCE:
SQL> select text from user_source where name='STERG_SAL';
Apasati <ENTER>

TEXT
-----------------------------------------------------------------
PROCEDURE sterg_sal (nmarca IN NUMBER, nr_sal OUT NUMBER) AS
BEGIN
DELETE FROM personal
WHERE personal.marca = nmarca;
Select count(*) into nr_sal from personal;
END;

6 înregistrări selectate.
Apelul unei proceduri stocate poate fi făcut în mai multe moduri, de exemplu, prin
utilizarea variabilelor de legătură:
SQL> variable nr_salariati number;
SQL> call sterg_sal(120,:nr_salariati);

Apelul a fost finalizat.

SQL în Oracle
- 85 -
Baze de date Oracle
11.2. Particularităţi SQL în Oracle

Oracle SQL respectă standardul ANSI/ISO/IEC 9075:2003, "Database Language


SQL", dar are multe îmbunătăţiri.
SQL oferă instrumente pentru:
• interogarea datelor
• înserarea, modificarea şi ştergerea rândurilor în tabele
• crearea, înlocuirea, modificarea şi ştergerea obiectelor
• controlul accesului la baza de date şi la obiectele sale
• controlul consistenţei şi integrităţii bazei de date

Obţinerea de informaţii suplimentare despre înregistrări


Se pot obţine prin afişarea pseudocolanelor:
ROWNUM – afişează numărul liniei selectate dintr-un tabel
ROWID – afişează adresa unei înregistrări dintr-un tabel înregistrând
următoarele informaţii:
• numărul obiectului component
• numărul blocului de date în cadrul fişierului de date
• poziţia rândului în cazul blocului de date (primul rând are adresa 0)
ORA_ROWSCN – memorează data şi ora când înregistrarea a fost modificată ultima
oară, sub forma SCN (system change number). Pentru aceasta tabela trebuie creată cu
opţiunea ROWDEPENDENCIES.
SQL> SELECT ROWNUM, ROWID,
2 RTRIM(SCN_TO_TIMESTAMP(ORA_ROWSCN)),
3 marca,nume, salariu
4* from personal order by salariu desc
/
Apasati <ENTER>

ROWNUM ROWID RTRIM(SCN_TO_TIMESTAMP(ORA_RO MARCA NUME SALARIU


------ ------------------ ----------------------------- ---------- -----------------
1 AAAM5kAAEAAAAJEAAA 18-07-2007 19:01:11,000000000 100 Popescu Mihai 3800
3 AAAM5kAAEAAAAJFAAB 20-07-2007 18:09:44,000000000 120 Mihailã Alexandru 2800
2 AAAM5kAAEAAAAJFAAA 20-07-2007 18:09:44,000000000 110 Alexa Valentin 2300
Operatori SQL Oracle
- operatori aritmetici unari: +,- (aşezaţi înaintea variabilei)
binari: +, -, /, *
- operatori de concatenare || - pentru câmpuri de tip şir de caractere sau CLOB
SQL> select 'Numele este: '||nume from personal
2* where marca=120;

'NUMELEESTE:'||NUME
-------------------------------------------
Numele este: Mihailă Alexandru
- operatori pentru mulţimi
o UNION – înregistrări distincte din mai multe interogări
o UNION ALL - înregistrări din mai multe interogări, inclusiv
multiple

SQL în Oracle
- 86 -
Baze de date Oracle
o INTERSECT – înregistrări distincte aflate în două interogări
o MINUS – înregistrări distincte aflate în prima interogare şi negăsite
în cea de-a doua
- Operatori definiţi de utilizator cu c-da CREATE OPERATOR:
SQL> CREATE FUNCTION eq_f(a VARCHAR2, b VARCHAR2) RETURN NUMBER
AS
2 BEGIN
3 IF a = b THEN RETURN 1;
4 ELSE RETURN 0;
5 END IF;
6 END;
7 /

Funcţie creată.

SQL> CREATE OPERATOR eq_op


2 BINDING (VARCHAR2, VARCHAR2)
3 RETURN NUMBER
4 USING eq_f;

Operatorul a fost creat.

SQL> select eq_op('4','3') from dual;

Apasati <ENTER>

EQ_OP('4','3')
--------------
0
Se observă că operatorul EQ_OP seamănă cu o funcţie.
Funcţii în SQL Oracle
Există un număr foarte mare de funcţii, împărţite în mai multe categorii:
- funcţii numerice: ACOS, ASIN, LN, MOD, POWER, etc
- funcţii pentru şiruri de caractere: CHR, CONCAT, REPLACE, etc
- funcţii pentru seturi de caractere naţionale: NLS_CHARSET_DECL_LEN,
NLS_CHARSET_ID, NLS_CHARSET_NAME
- funcţii pentru şiruri de caractere care returnează valori numerice: ASCII,
INSTR, LENGTH, etc
- funcţii pentru dată şi timp: SYSDATE, MONTH_BETWEEN, NEW_TIME,
LAST_DAY, SYSTEMESTAMP, etc
- funcţii de comparare generală: GREATEST, LEAST
- funcţii de conversie: ASCII, CAST, CONCAT, TO_CHAR, TO_NUMBER,
SCN_TO_TIMESTAMP, etc
- funcţii pentru obiecte de mari dimensiuni: EMPTY_BLOB, EMPTY_CLOB
- funcţii pentru mulţimi: SET, CARDINALITY, etc
- funcţii pentru interogări ierarhice: SYS_CONNECT_BY_PATH
- funcţii pentru codare şi decodare: DECODE, VSIZE, etc
- funcţii pentru tratarea valorilor nule (NULL): COALESCE, NVL, etc
- funcţii pentru informaţii despre mediu: SYS_CONTEXT, USER, etc

SQL în Oracle
- 87 -
Baze de date Oracle
- alte funcţii
Condiţii în SQL Oracle
Principalele condiţii şi prioritatea lor sunt date în tabelul 11.1:
Tabelul 11.1
Condiţii şi prioritatea lor
Prioritate Condiţie Utilizare
1 =, !=, <, >, <=, >= Comparaţie
2 IS [NOT] NULL, LIKE, Comparaţie
[NOT] BETWEEN,
[NOT] IN, EXISTS, IS OF tip
3 NOT Negare logică
4 AND ŞI logic
5 OR SAU logic
Exemple de utilizare a condiţiilor:
SQL> select first_name, last_name, department_id, salary from
employees
2* where last_name like 'A%';
Apasati <ENTER>

FIRST_NAME LAST_NAME DEPARTMENT_ID SALARY


----------- ---------------- ------------------- -------------
Ellen Abel 80 11000
Sundar Ande 80 6400
Mozhe Atkinson 50 2800
David Austin 60 4800

SQL>select first_name, last_name, department_id, salary from


employees
2* where salary between 5000 and 6000;

Apasati <ENTER>

FIRST_NAME LAST_NAME DEPARTMENT_ID SALARY


----------- -------- -------- ---------------- -------------
Pat Fay 20 6000
Bruce Ernst 60 6000
Kevin Mourgos 50 5800

SQL> select last_name, department_id, salary from employees


2* where department_id in (70,100);

Apasati <ENTER>

LAST_NAME DEPARTMENT_ID SALARY


------------------------- ------------- ----------
Baer 70 10000
Greenberg 100 12000
Faviet 100 9000
Chen 100 8200
Sciarra 100 7700
Urman 100 7800
Popp 100 6900

SQL în Oracle
- 88 -
Baze de date Oracle

7 înregistrări selectate.

SQL> SELECT department_id, department_name


2 FROM departments d
3 WHERE EXISTS
4 (SELECT * FROM employees e
5 WHERE d.department_id
6* = e.department_id);

Apasati <ENTER>

DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------
10 Administration
20 Marketing
30 Purchasing
40 Human Resources
50 Shipping
60 IT
70 Public Relations
80 Sales
90 Executive
100 Finance
110 Accounting

11 înregistrări selectate.

Interogări ale structurilor ierarhice


Permite afişarea ordonată a informaţiilor structurate ierarhic:
SQL> select level as nivel,
2 substr(last_name,1,10) as Nume,
3 substr(first_name,1,10) As Prenume,
4 department_id as "Cod sub",
5 salary As salariu
6 from employees
7 start with manager_id is null
8 connect by prior employee_id=manager_id
9* ORDER SIBLINGS BY salary desc;

Apasati <ENTER>

NIVEL NUME PRENUME Cod sub SALARIU


---------- ---------- ---------- ---------- ----------
1 King Steven 90 24000
2 Kochhar Neena 90 17000
3 Higgins Shelley 110 12000
4 Gietz William 110 8300
3 Greenberg Nancy 100 12000
4 Faviet Daniel 100 9000
4 Chen John 100 8200
4 Urman Jose Manue 100 7800
4 Sciarra Ismael 100 7700
4 Popp Luis 100 6900

SQL în Oracle
- 89 -
Baze de date Oracle
3 Baer Hermann 70 10000
3 Mavris Susan 40 6500
3 Whalen Jennifer 10 4400
2 De Haan Lex 90 17000
3 Hunold Alexander 60 9000
4 Ernst Bruce 60 6000
4 Austin David 60 4800
4 Pataballa Valli 60 4800
4 Lorentz Diana 60 4200
2 Russell John 80 14000

În exemplul de mai sus legătura ierarhică se obţine prin opţiunea


CONNECT BY PRIOR EMPLOYEE_ID=MANAGER_ID. Afişarea
personalului începând cu şeful se obţine prin opţiunea START WITH. De
remarcat că ordonarea în cadrul aceluiaşi nivel ierarhic se face cu clauza
ORDER SIBLINGS BY în loc de ORDER BY. Se remarcă de asemenea
prezenţa pseudocoloanei LEVEL care indică nivelul de subordonare.

SQL> SELECT last_name "Nume", CONNECT_BY_ISCYCLE "Ciclare",


2 LEVEL "Nivel", SYS_CONNECT_BY_PATH(last_name, '/') "Sefi"
3 FROM employees
4 WHERE level <= 3 AND department_id = 80
5 START WITH last_name = 'King'
6* CONNECT BY NOCYCLE PRIOR employee_id = manager_id AND LEVEL
<= 4;

Apasati <ENTER>

Nume Ciclare Nivel Sefi


-----------------------------------------------------------
King 0 1 /King
Russell 0 2 /King/Russell
Tucker 0 3 /King/Russell/Tucker
Bernstein 0 3 /King/Russell/Bernstein
Hall 0 3 /King/Russell/Hall
Olsen 0 3 /King/Russell/Olsen
Cambrault 0 3 /King/Russell/Cambrault
Tuvault 0 3 /King/Russell/Tuvault
Partners 0 2 /King/Partners
În exemplul de faţă se remarcă prezenţa pseudocoloanei
CONNECT_BY_ISCYCLE care indică o ciclare (o persoană are doi şefi) cu
valoarea 1, în rest având valoarea 0. În acest caz trebuie modificată clauza
CONNECT BY PRIOR în CONNECT NOCYCLE BY PRIOR. De asemenea în
exemplul de mai sus se arată utilizarea funcţiei SYS_CONNECT_BY_PATH
care redă valorile unei coloane începând de la rădăcină până la nivelul respectiv.
Utilizarea opţiunilor pentru mulţimi
SQL> select last_name||' '||first_name as nume from
employees
2 union
3 select nume from test.personal
4* order by nume ASC;

Apasati <ENTER>

SQL în Oracle
- 90 -
Baze de date Oracle

NUME
----------------------------------------------
Abel Ellen
Alexa Valentin
Ande Sundar
Atkinson Mozhe
Austin David
Baer Hermann
Baida Shelli
Banda Amit
Bates Elizabeth
Bell Sarah
Bernstein David
Bissot Laura
În acest exemplu sunt reunite numele unor persoane aflate în două tabele
din scheme diferite: hr.employees şi test.personal. Se remarcă că pentru clauza
ORDER BY este necesar ca numele coloanelor rezultate să fie identice.

SQL> SELECT TO_BINARY_FLOAT(3) FROM DUAL


2 INTERSECT
3 SELECT 3f FROM DUAL;
Apasati <ENTER>

TO_BINARY_FLOAT(3)
------------------
3,0E+000
Interogări cu legături
Sunt interogări cu clauza WHERE condiţie. Interogările cu legături sunt
de mai multe tipuri:
- equijoins – conţine o relaţie de tip egalitate în condiţie
SQL> SELECT last_name, job_id, departments.department_id,
department_name
2 FROM employees, departments
3 WHERE employees.department_id = departments.department_id
4 ORDER BY last_name;
Apasati <ENTER>

LAST_NAME JOB_ID DEPARTMENT_ID DEPARTMENT_NAME


------------------------- ---------- ------------- ----------
Abel SA_REP 80 Sales
Ande SA_REP 80 Sales
Atkinson ST_CLERK 50 Shipping
Austin IT_PROG 60 IT
Baer PR_REP 70 Public Relations
Baida PU_CLERK 30 Purchasing
Banda SA_REP 80 Sales
Bates SA_REP 80 Sales
- self joins – realizează o interogare pe o tabelă cu legături pe aceeaşi tabelă
SQL> SELECT e1.last_name||' lucreaza pentru '||e2.last_name
2 "Salariati si sefii lor"
3 FROM employees e1, employees e2
4 WHERE e1.manager_id = e2.employee_id
5* AND e1.last_name LIKE 'R%';

SQL în Oracle
- 91 -
Baze de date Oracle

Apasati <ENTER>

Salariati si sefii lor


------------------------------------------------------------
Rajs lucreaza pentru Mourgos
Raphaely lucreaza pentru King
Rogers lucreaza pentru Kaufling
Russell lucreaza pentru King
- produs cartezian – se realizează interogarea pe două tabele fără o legătură
între ele. Rezultă un număr de înregistrări egal cu produsul dimensiunilor
celor două tabele.
SQL> select e.last_name, e.department_id, e.salary,
d.department_name
2 from employees e, departments d;
Apasati <ENTER>

LAST_NAME DEPARTMENT_ID SALARY DEPARTMENT_NAME


------------------------- ------------- ---------- -------------
OConnell 50 2600 Administration
Grant 50 2600 Administration
Whalen 10 4400 Administration
Hartstein 20 13000 Administration
Fay 20 6000 Administration
- inner joins – este legătura dintre două sau mai multe tabele care returnează
numai înregistrările care satisface legătura. Legăturile equijoins sunt un caz
particular al acestei categorii
- outer joins – printr-o astfel de restricţie se returnează şi alte înregistrări
pentru care nu există înregistrări. Dacă avem două tabele A şi B atunci, în
funcţie de înregistrările suplimentare returnate de interogare, avem mai
multe variante
o LEFT [OUTER] JOIN – returnează toate înregistrările din A. Se mai
notează şi cu (+) în partea tabelei A. Pentru corespondenţa din B se
completează cu NULL.
o RIGHT [OUTER] JOIN – returnează toate înregistrările din B. Se
mai notează şi cu (+) în partea tablei B
o FULL [OUTER] JOIN – returnează ambele mulţimi completate cu
NULL.
SQL> SELECT e1.employee_id, e1.manager_id, e2.employee_id
2 FROM employees e1, employees e2
3 WHERE e1.manager_id(+) = e2.employee_id;
Apasati <ENTER>

EMPLOYEE_ID MANAGER_ID EMPLOYEE_ID


----------- ---------- -----------
198 124 124
199 124 124
200 101 101
201 100 100
202 201 201
..........................

SQL în Oracle
- 92 -
Baze de date Oracle

162
133
136
.........................................................
Se observă că în exemplul de mai sus sunt returnate şi id-urile salariaţilor care
nu sunt şefi.
- antijoins – sunt returnate înregistrările din partea stângă a restricţiei care nu
au corespondenţă în dreapta
SQL> SELECT e.employee_id, e.last_name, l.city
2 FROM employees e, locations l, departments d
3 WHERE e.department_id NOT IN
4 (SELECT d.department_id FROM departments
5 WHERE d.location_id = 1700)
6 AND (l.location_id=d.location_id )
7 AND (e.department_id=d.department_id)
8* ORDER BY last_name
SQL> /
Apasati <ENTER>

EMPLOYEE_ID LAST_NAME CITY


----------- ------------------------- ----------------------
174 Abel Oxford
166 Ande Oxford
130 Atkinson South San Francisco
105 Austin Southlake
204 Baer Munich
167 Banda Oxford
172 Bates Oxford
192 Bell South San Francisco
151 Bernstein Oxford
129 Bissot South San Francisco
169 Bloom Oxford
185 Bull South San Francisco
187 Cabrio South San Francisco
154 Cambrault Oxford
148 Cambrault Oxford
188 Chung South San Francisco
- semijoins – returnează numai înregistrările pentru care o condiţie EXIST este
adevărată fără a multiplica numărul de linii (dacă condiţia este satisfăcută de
mai multe ori)

SQL> SELECT * FROM departments


2 WHERE EXISTS
3 (SELECT * FROM employees
4 WHERE departments.department_id = employees.department_id
5 AND employees.salary > 2500)
6 ORDER BY department_name;
Apasati <ENTER>

DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID


------------- ------------------------------ ---------- -----------
110 Accounting 205 1700

SQL în Oracle
- 93 -
Baze de date Oracle
10 Administration 200 1700
90 Executive 100 1700
100 Finance 108 1700
40 Human Resources 203 2400
60 IT 103 1400
20 Marketing 201 1800
70 Public Relations 204 2700
30 Purchasing 114 1700
80 Sales 145 2500
50 Shipping 121 1500

11 înregistrãri selectate.
Utilizare subqueries
În exemplele precedente s-au utilizat de mai multe ori subqueries. Mai arătăm un
exemplu în care sunt listaţi salariaţii cu salariul mai mare ca media acestuia pe
departament:
SQL> select department_id, avg(salary)
2 from employees
3* group by department_id
SQL> /
Apasati <ENTER>

DEPARTMENT_ID AVG(SALARY)
------------- -----------
30 3914,28571
100 8600
7000
20 9500
70 10000
90 19333,3333
110 10150
50 3475,55556
40 6500
80 8955,88235
10 4400
60 5760

12 înregistrări selectate.
SQL> SELECT department_id, last_name, salary
2 FROM employees x
3 WHERE salary > (SELECT AVG(salary)
4 FROM employees
5 WHERE x.department_id = department_id)
6 ORDER BY department_id;
Apasati <ENTER>

DEPARTMENT_ID LAST_NAME SALARY


------------- ------------------------- ----------
20 Hartstein 13000
30 Raphaely 11000
50 Weiss 8000
50 Fripp 8200
50 Kaufling 7900
50 Vollman 6500
50 Mourgos 5800

SQL în Oracle
- 94 -
Baze de date Oracle

12. PROGRAME STOCATE ÎN BAZA DE DATE

12.1. Administrarea pachetelor de programe

În capitolul precedent am arătat cum se creează sau se modifică o procedură sau


o funcţie stocată în baza de date. Pe lângă acestea se pot crea pachete de programe
(package) care pot conţine una sau mai multe proceduri şi/sau funcţii în legătură cu o
problemă dată.
Pachetele de programe au două componente:
- PACKAGE – care cuprinde specificaţiile pentru pachet, adică interfaţa
pachetului;
- PACKAGE BODY – care cuprinde obiectele, procedurile şi funcţiile
pachetului.
Crearea pachetelor se realizează cu c-da CREATE PACKAGE, respectiv
CREATE PACKAGE BODY.
SQL> conn hr/hr
Conectat.
SQL> CREATE OR REPLACE PACKAGE emp_mgmt AS
2 FUNCTION hire (last_name VARCHAR2, job_id VARCHAR2,
3 manager_id NUMBER, salary NUMBER,
4 commission_pct NUMBER, department_id NUMBER)
5 RETURN NUMBER;
6 FUNCTION create_dept(department_id NUMBER, location_id
NUMBER)
7 RETURN NUMBER;
8 PROCEDURE remove_emp(employee_id NUMBER);
9 PROCEDURE remove_dept(department_id NUMBER);
10 PROCEDURE increase_sal(employee_id NUMBER, salary_incr
NUMBER);
11 PROCEDURE increase_comm(employee_id NUMBER, comm_incr
NUMBER);
12 no_comm EXCEPTION;
13 no_sal EXCEPTION;
14 END emp_mgmt;
15 /

Împachetare creată.
SQL> CREATE OR REPLACE PACKAGE BODY emp_mgmt AS
2 tot_emps NUMBER;
3 tot_depts NUMBER;
4 FUNCTION hire
5 (last_name VARCHAR2, job_id VARCHAR2,
6 manager_id NUMBER, salary NUMBER,
7 commission_pct NUMBER, department_id NUMBER)
8 RETURN NUMBER IS new_empno NUMBER;
9 BEGIN
10 SELECT employees_seq.NEXTVAL
11 INTO new_empno
12 FROM DUAL;
13 INSERT INTO employees

Programe stocate în baza de date


- 95 -
Baze de date Oracle
14 VALUES (new_empno, 'First',
'Last','first.last@oracle.com',
15 '(123)123-1234','18-JUN-
02','IT_PROG',90000000,00,
16 100,110);
17 tot_emps := tot_emps + 1;
18 RETURN(new_empno);
19 END;
20 FUNCTION create_dept(department_id NUMBER, location_id
NUMBER)
21 RETURN NUMBER IS
22 new_deptno NUMBER;
23 BEGIN
24 SELECT departments_seq.NEXTVAL
25 INTO new_deptno
26 FROM dual;
27 INSERT INTO departments
28 VALUES (new_deptno, 'department name', 100, 1700);
29 tot_depts := tot_depts + 1;
30 RETURN(new_deptno);
31 END;
32 PROCEDURE remove_emp (employee_id NUMBER) IS
33 BEGIN
34 DELETE FROM employees
35 WHERE employees.employee_id = remove_emp.employee_id;
36 tot_emps := tot_emps - 1;
37 END;
38 PROCEDURE remove_dept(department_id NUMBER) IS
39 BEGIN
40 DELETE FROM departments
41 WHERE departments.department_id =
remove_dept.department_id;
42 tot_depts := tot_depts - 1;
43 SELECT COUNT(*) INTO tot_emps FROM employees;
44 END;
45 PROCEDURE increase_sal(employee_id NUMBER, salary_incr
NUMBER) IS
46 curr_sal NUMBER;
47 BEGIN
48 SELECT salary INTO curr_sal FROM employees
49 WHERE employees.employee_id = increase_sal.employee_id;
50 IF curr_sal IS NULL
51 THEN RAISE no_sal;
52 ELSE
53 UPDATE employees
54 SET salary = salary + salary_incr
55 WHERE employee_id = employee_id;
56 END IF;
57 END;
58 PROCEDURE increase_comm(employee_id NUMBER, comm_incr
NUMBER) IS
59 curr_comm NUMBER;
60 BEGIN
61 SELECT commission_pct

Programe stocate în baza de date


- 96 -
Baze de date Oracle
62 INTO curr_comm
63 FROM employees
64 WHERE employees.employee_id = increase_comm.employee_id;
65 IF curr_comm IS NULL
66 THEN RAISE no_comm;
67 ELSE
68 UPDATE employees
69 SET commission_pct = commission_pct + comm_incr;
70 END IF;
71 END;
72 END emp_mgmt;
73 /

Corp împachetare creat.

Pachetul de mai sus conţine două funcţii şi patru proceduri:


- funcţia hire – generează o marcă nouă şi înserează o înregistrare în tabela de
salariaţi employees;
- funcţia create_dept – generează un cod nou de departament şi înserează o
înregistrare în tabela de departamente departments;
- procedura remove_emp – şterege o înregistrare din tabela employees
- procedura remove_dept – şterege o înregistrare din tabela departments
- procedura increase_sal – modifică salariul cu o valoare dată şi modifică
înregistrarea din employees;
- procedura increase_comm – modifică comisionul cu o valoare dată şi
modifică înregistrarea din employees.
Ştergerea pachetelor de programe se face cu c-zile DROP PACKAGE
nume_pachet şi DROP PACKAGE BODY nume_pachet. De asemenea pachetele se pot
recompila cu alte condiţii cu c-da ALTER PACKAGE:
SQL> ALTER PACKAGE emp_mgmt
2 COMPILE PACKAGE;

Împachetare modificată.
SQL> ALTER PACKAGE hr.emp_mgmt
2 COMPILE BODY;

Corp împachetare modificat.


Multe pachete sunt deja livrate cu sistemul şi sunt generate cu scriptul
CATPROC.SQL aflat în folderul RDBMS\ADMIN.

12.2. Mediul de programare PL/SQL

PL/SQL este o extensie procedurală a SQL, într-un limbaj din generaţia 4 (4GL).
Mediul oferă facilităţi avansate precum: încapsulare, suprascriere a procedurilor,
colecţii obiecte pe tipuri, tratarea excepţiilor, etc.
Principalele avantaje ale utilizării mediului PL/SQL sunt:
- integrare naturală cu SQL;
- performanţe mărite (a se vedea figura 12.1). Din figură se observă că există
mai multe tehnici de a interoga o bază de date: prin SQL emise de aplicaţii,
Programe stocate în baza de date
- 97 -
Baze de date Oracle
prin SQL incluse în mediul PL/SQL şi prin proceduri PL/SQL stocate în
baza de date, acestea
fiind apelate de la
distanţă (Remote
Procedure Call –
RPC);
- productivitate
ridicată – modulele
PL/SQL pot fi
integrate direct în
mediile de
dezvoltare Oracle,
ca de exemplu
Oracle Forms;
- portabilitate în orice
sistem de operare
Figura 12.1 care acceptă Oracle;
Integrarea PL/SQL cu BD
- securitate ridicată în
Oracle
cazul procedurilor
stocate, o parte importantă a acestora fiind invizibilă utilizatorilor;
- acces la toate pachetele livrate cu baza de date;
- poate fi utilizat la crearea de aplicaţii Web sau servere de pentru pagini de
internet;
Modulele PL/SQL, pot fi întâlnite ca blocuri PL/SQL, în proceduri stocate sau în
trigere ale bazei de date.
Structura unui bloc PL/SQL este următoarea:
[DECLARE
-- declaraţii]
BEGIN
-- instrucţiuni
[EXCEPTION
-- handlers]
END

În zona declaraţii se definesc variabilele sau constantele locale:


DECLARE
-- declaraţii constante
credit_limit CONSTANT REAL := 5021.31;
max_days_in_year CONSTANT INTEGER := 366;
urban_legend CONSTANT BOOLEAN := FALSE;
-- variabile cu valori iniţiale
employee_count INTEGER := 0;
acct_id INTEGER(4) NOT NULL := 9999;
-- delimitarea intervalului
credit PLS_INTEGER RANGE 1000..25000;
-- utilizarea tipului unei variabile cunoscute
debit credit%TYPE;
-- variabile structurate tip înregistrare dintr-o tabelă

Programe stocate în baza de date


- 98 -
Baze de date Oracle
emprec employees%ROWTYPE;
Se pot defini variabile tip înregistrare şi pentru cursoare:
DECLARE
-- %ROWTYPE poate include toate coloanele dintr-o tabelă…
emp_rec employees%ROWTYPE;
-- ...sau o parte dintre acestea utilizând un cursor
CURSOR c1 IS
SELECT department_id, department_name FROM departments;
dept_rec c1%ROWTYPE;
-- se poate defini o variabilă %ROWTYPE cu coloane din mai multe
-- tabele
CURSOR c2 IS
SELECT employee_id, email, employees.manager_id,
location_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;
join_rec c2%ROWTYPE;
BEGIN
-- EMP_REC poate memora o linie din tabela EMPLOYEES
SELECT * INTO emp_rec FROM employees WHERE ROWNUM < 2;
-- Se pot referi coloanele din tabela EMPLOYEES
IF emp_rec.department_id = 20 AND emp_rec.last_name = 'JOHNSON'
THEN
emp_rec.salary := emp_rec.salary * 1.15;
END IF;
END;
/

Operatorii în PL/SQL şi ordinea operaţiilor sunt date în tabelul 12. 1:

Tabela 12.1 Operatori şi ordinea lor de prioritate


Ordinea de Operator Funcţie Exemplu
prioritate
1 ** Ridicare la putere 3**2
2 +, - Indentitate, negare -2.5
3 *, / Multiplicare, 3.4 * 2.88
împărţire
4
5 +,-,|| Adunare, scădere, 4-3
concatenare ’Popescu ’||’Maria’
6 IS NULL, LIKE, Teste logice 6 BETWEEN 1
BETWEEN, IN AND 10
LITERA IN (’a’,
’b’, ’c’)
7 NOT Negaţie logică NOT (a > b)
8 AND Conjuncţie logică (a > b ) AND (c <
d)
9 OR Sau logic (a > b ) OR (c < d)

Instrucţiunea CASE cu opţiunea WITH permite selectarea rezultatului din mai


multe variante.
Programe stocate în baza de date
- 99 -
Baze de date Oracle
DECLARE
calitate CHAR(1) := 'B';
apreciere VARCHAR2(20);
BEGIN
apreciere :=
CASE calitate
WHEN 'A' THEN 'Excelent'
WHEN 'B' THEN 'Foarte buna'
WHEN 'C' THEN 'Buna'
WHEN 'D' THEN 'Satisfacatoare'
WHEN 'F' THEN 'Slaba'
ELSE 'Nu este definita'
END;
DBMS_OUTPUT.PUT_LINE('Calitatea este ' || calitate || ' este '
|| apreciere);
END;
/

12.2.1. Structuri de control

Sunt cele cunoscute (figura 12.2) :


- structura alternativă sau de selecţie
- structura repetitivă
- structura secvenţială

Figura 12.2
Structuri de
control

Structura IF THEN (ELSE):


DECLARE
sales NUMBER(8,2) := 12100;
quota NUMBER(8,2) := 10000;
bonus NUMBER(6,2);
emp_id NUMBER(6) := 120;
BEGIN
IF sales > (quota + 200) THEN
bonus := (sales - quota)/4;
ELSE
bonus := 50;
END IF;

Programe stocate în baza de date


- 100 -
Baze de date Oracle
UPDATE employees SET salary = salary + bonus WHERE employee_id =
emp_id;
END;
/
Structura IF-THEN-ELSEIF:
DECLARE
sales NUMBER(8,2) := 20000;
bonus NUMBER(6,2);
emp_id NUMBER(6) := 120;
BEGIN
IF sales > 50000 THEN
bonus := 1500;
ELSIF sales > 35000 THEN
bonus := 500;
ELSE
bonus := 100;
END IF;
UPDATE employees SET salary = salary + bonus WHERE employee_id =
emp_id;
END;
/
Structura CASE WHEN:
DECLARE
CHAR(1);
BEGIN
calitate := 'B';
CASE calitate
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excelent');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Foarte buna');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Buna');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Satisfacatoare');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Slaba');
ELSE DBMS_OUTPUT.PUT_LINE('Nedefinita');
END CASE;
END;
/
Structura LOOP-END LOOP-EXIT:
DECLARE
credit_rating NUMBER := 0;
BEGIN
LOOP
credit_rating := credit_rating + 1;
IF credit_rating > 3 THEN
EXIT; -- exit loop immediately
END IF;
END LOOP;
-- punct de revenire din buclă
DBMS_OUTPUT.PUT_LINE ('Credit rating: ' ||
TO_CHAR(credit_rating));
IF credit_rating > 3 THEN
RETURN; -- utilizeză RETURN nu EXIT în afara LOOP
END IF;
DBMS_OUTPUT.PUT_LINE ('Credit rating: ' ||
TO_CHAR(credit_rating));

Programe stocate în baza de date


- 101 -
Baze de date Oracle
END;
/
Structura LOOP-END LOOP-EXIT WHEN:
DECLARE
total NUMBER(9) := 0;
counter NUMBER(6) := 0;
BEGIN
LOOP
counter := counter + 1;
total := total + counter * counter;
-- exit loop când o condiţie este îndeplinită
EXIT WHEN total > 25000;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Counter: ' || TO_CHAR(counter) || ' Total:
' ||TO_CHAR(total));
END;
/
Utilizarea instrucţiunii GOTO:
DECLARE
total NUMBER(9) := 0;
counter NUMBER(6) := 0;
BEGIN
<<calc_total>>
counter := counter + 1;
total := total + counter * counter;
-- salt la print_total când condiţia este adevărată
IF total > 25000 THEN
GOTO print_total;
ELSE
GOTO calc_total;
END IF;
<<print_total>>
DBMS_OUTPUT.PUT_LINE('Counter: ' || TO_CHAR(counter) || ' Total:
' ||TO_CHAR(total));
END;
/

12.2.2. Executarea SQL în mediul PL/SQL

PL/SQL acceptă toate instrucţiunile SQL pentru manipularea datelor, controlul


tranzacţiilor, funcţii, pseudocoloane şi operatori. Pentru manipularea datelor Oracle se
pot utiliza operaţii DML cum ar fi INSERT, UPDATE şi DELETE direct în programe
PL/SQL, fără nici o notaţie specială.
CREATE TABLE employees_temp AS SELECT employee_id, first_name,
last_name FROM employees;
DECLARE
emp_id employees_temp.employee_id%TYPE;
emp_first_name employees_temp.first_name%TYPE;
emp_last_name employees_temp.last_name%TYPE;
BEGIN
INSERT INTO employees_temp VALUES(299, 'Bob', 'Henry');

Programe stocate în baza de date


- 102 -
Baze de date Oracle
UPDATE employees_temp SET first_name = 'Robert' WHERE
employee_id = 299;
DELETE FROM employees_temp WHERE employee_id = 299
RETURNING first_name, last_name INTO emp_first_name, emp_last_name;
COMMIT;
DBMS_OUTPUT.PUT_LINE( emp_first_name || ' ' || emp_last_name);
END;
/
Pentru a determina câe rânduri sunt afectate de o instrucţiune DML, se poate
utiliza SQL%ROWCOUNT ca în exemplul următor.
CREATE TABLE employees_temp AS SELECT * FROM employees;
BEGIN
UPDATE employees_temp SET salary = salary * 1.05 WHERE salary <
5000;
DBMS_OUTPUT.PUT_LINE('Updated ' || SQL%ROWCOUNT || '
salaries.');
END;
/
Se pot utiliza toate funcţiile SQL:
DECLARE
job_count NUMBER;
emp_count NUMBER;
BEGIN
SELECT COUNT(DISTINCT job_id) INTO job_count FROM employees;
SELECT COUNT(*) INTO emp_count FROM employees;
DBMS_OUTPUT.PUT_LINE(‘Tipuri de posturi: ‘
||to_char(job_count)||’ Numar salariati: ‘||to_char(emp_count));
END;
/
Pentru prelucrarea rezultatelor unei interogări care returnează înregistrări
multiple, PL/SQL utilizează cursoare implicite sau explicite. PL/SQL generează
cursoare implicite pentru toate instrucţiunile DML, inclusiv interogări care returnează o
singură înregistrare. Dacă se doreşte un control mai exact al prelucrării se poate declara
un cursor explicit în zona de declaraţii. Este necesar un cursor explicit pentru
interogările care returnează mai mult de un rând.
Pentru a vedea rezultatele unei instrucţiuni DML se pot utiliza atributele
cursoarelor %FOUND, %ISOPEN %NOTFOUND, and %ROWCOUNT.
CREATE TABLE dept_temp AS SELECT * FROM departments;
DECLARE
dept_no NUMBER(4) := 270;
BEGIN
DELETE FROM dept_temp WHERE department_id = dept_no;
IF SQL%FOUND THEN -- ştergere cu succes
INSERT INTO dept_temp VALUES (270, 'Personal', 200, 1700);
END IF;
END;
/

CREATE TABLE employees_temp AS SELECT * FROM employees;


DECLARE
mgr_no NUMBER(6) := 122;
BEGIN

Programe stocate în baza de date


- 103 -
Baze de date Oracle
DELETE FROM employees_temp WHERE manager_id = mgr_no;
DBMS_OUTPUT.PUT_LINE('Number of employees deleted: ' ||
TO_CHAR(SQL%ROWCOUNT));
END;
/
Utilizarea unui cursor explicit impune utilizarea comenzilor de control: OPEN,
FETCH şi CLOSE. Mai întâi trebuie iniţializat cursorul cu instrucţiunea OPEN. După
aceasta se poate utiliza comanda FETCH în mod repetat, până când toate înregistrările
sunt returnate sau se poate utiliza BULK COLLECT pentru a fi aduse toate rândurile
simultan. După prelucrarea ultimului rând se apelează CLOSE pentru a închide
cursorul.
DECLARE
v_jobid employees.job_id%TYPE; -- variabilă pentru job_id
v_lastname employees.last_name%TYPE; -- variabilă pentri
last_name
CURSOR c1 IS SELECT last_name, job_id FROM employees
WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK');
v_employees employees%ROWTYPE; -- record pentru un rând
CURSOR c2 is SELECT * FROM employees
WHERE REGEXP_LIKE (job_id, '[ACADFIMKSA]_M[ANGR]');
BEGIN
OPEN c1; -- deschide cursorul c1
LOOP
FETCH c1 INTO v_lastname, v_jobid; -- cere 2 coloane în
variabile de memorie
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid
);
END LOOP;
CLOSE c1;
DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );
OPEN c2;
LOOP
FETCH c2 INTO v_employees; -- fetches entire row into the
v_employees record
EXIT WHEN c2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ')
||v_employees.job_id );
END LOOP;
CLOSE c2;
END;
/
În exemplul următor se arată utilizarea BULK COLLECT, pentru returnarea
tuturor înregistrărilor:
DECLARE
TYPE IdsTab IS TABLE OF employees.employee_id%TYPE;
TYPE NameTab IS TABLE OF employees.last_name%TYPE;
ids IdsTab;
names NameTab;
CURSOR c1 IS
SELECT employee_id, last_name FROM employees WHERE
job_id = 'ST_CLERK';
BEGIN

Programe stocate în baza de date


- 104 -
Baze de date Oracle
OPEN c1;
FETCH c1 BULK COLLECT INTO ids, names;
CLOsE c1;
-- Se prelucrează colecţia
FOR i IN ids.FIRST .. ids.LAST
LOOP
IF ids(i) > 140 THEN
DBMS_OUTPUT.PUT_LINE( ids(i) );
END IF;
END LOOP;
FOR i IN names.FIRST .. names.LAST
LOOP
IF names(i) LIKE '%Ma%' THEN
DBMS_OUTPUT.PUT_LINE( names(i) );
END IF;
END LOOP;
END;
/
Se remarcă declararea variabilelor IdsTab şi NameTab care sunt tabele în
memorie.
Se poate utiliza şi SQL dinamic folsind instrucţiunea EXECUTE IMMEDIATE:
CREATE OR REPLACE PROCEDURE raise_emp_salary (column_value
NUMBER,emp_column VARCHAR2, amount NUMBER) IS
v_column VARCHAR2(30);
sql_stmt VARCHAR2(200);
BEGIN
-- determină dacă s-a cerut o coloană validă
SELECT COLUMN_NAME INTO v_column FROM USER_TAB_COLS
WHERE TABLE_NAME = 'EMPLOYEES' AND COLUMN_NAME = emp_column;
sql_stmt := 'UPDATE employees SET salary = salary + :1 WHERE '
|| v_column || ' = :2';
EXECUTE IMMEDIATE sql_stmt USING amount, column_value;
IF SQL%ROWCOUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('Salaries have been updated for: ' ||
emp_column || ' = ' || column_value);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('Invalid Column: ' || emp_column);
END raise_emp_salary;
/

DECLARE
plsql_block VARCHAR2(500);
BEGIN
-- de notat că ; trebuie inclus între ghilimele
plsql_block := 'BEGIN raise_emp_salary(:cvalue, :cname, :amt);
END;';
EXECUTE IMMEDIATE plsql_block USING 110, 'DEPARTMENT_ID', 10;
EXECUTE IMMEDIATE 'BEGIN raise_emp_salary(:cvalue, :cname,
:amt); END;'
USING 112, 'EMPLOYEE_ID', 10;
END;
/

Programe stocate în baza de date


- 105 -
Baze de date Oracle

DECLARE
sql_stmt VARCHAR2(200);
v_column VARCHAR2(30) := 'DEPARTMENT_ID';
dept_id NUMBER(4) := 46;
dept_name VARCHAR2(30) := 'Special Projects';
mgr_id NUMBER(6) := 200;
loc_id NUMBER(4) := 1700;
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, amt NUMBER)';
sql_stmt := 'INSERT INTO departments VALUES (:1, :2, :3, :4)';
EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, mgr_id,
loc_id;
EXECUTE IMMEDIATE 'DELETE FROM departments WHERE ' || v_column
|| ' = :num' USING dept_id;
EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';
EXECUTE IMMEDIATE 'DROP TABLE bonus';
END;
/

12.2.3. Tratarea erorilor în PL/SQL

În PL/SQL, o eroare este numită excepţie. Ele pot fi definite intern (prin rutine
sistem) sau de către utilizator. Exemple de excepţii interne sunt împărţirea la zero sau
depăşirea memoriei, acestea având numele de ZERO_DIVIDE, respectiv
STORAGE_ERROR.
Când se întâlneşte o eroare este ridicată o excepţie. Definirea unei excepţii
utilizator trebuie ridicată explicit prin instrucţiunea RAISE.
DECLARE
stock_price NUMBER := 9.73;
net_earnings NUMBER := 0;
pe_ratio NUMBER;
BEGIN
pe_ratio := stock_price / net_earnings;
DBMS_OUTPUT.PUT_LINE('Price/earnings ratio = ' || pe_ratio);
EXCEPTION – zona de prelucrare a excepţiilor
-- Numai o ramură WHEN este executată
WHEN ZERO_DIVIDE THEN – interceptează împărţirea la zero
DBMS_OUTPUT.PUT_LINE('Company must have had zero
earnings.');
pe_ratio := NULL;
WHEN OTHERS THEN – interceptează orice ale erori
DBMS_OUTPUT.PUT_LINE('Some other kind of error
occurred.');
pe_ratio := NULL;
END; -- sfârşit zona excepţii
/
În exemplul următor se defineşte o excepţie:
DECLARE
past_due EXCEPTION;
acct_num NUMBER;
due_date DATE := SYSDATE - 1;
Programe stocate în baza de date
- 106 -
Baze de date Oracle
todays_date DATE := SYSDATE;
BEGIN
IF due_date < todays_date THEN
RAISE past_due;
END IF;
EXCEPTION
WHEN past_due THEN
DBMS_OUTPUT.PUT_LINE('Interceptare excepţie PAST_DUE !');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Nu s-a găsit PAST_DUE_EXCEPTION în
această procedură.');
END;
/

Programe stocate în baza de date


- 107 -
Baze de date Oracle

13. UTILITARE ALE BAZEI DE DATE ORACLE


Oracle 10g este prevăzut cu o serie de utilitare şi metode pentru exportul şi
importul bazelor de date. Acestea sunt:
• Utilitar pentru exportul datelor EXPDP
• Utilitar pentru importul datelor IMPDP
• Pachetul PL/SQL DBMS_DATAPUMP (cunoscut ca Data Pump API)
• Pachetul PL/SQL DBMS_METADATA (cunoscut ca Metadata API)
Pe lângă aceste utilitare noi în ORACLE 10g, mai există (inclusiv în ORACLE
10g) utilitareale EXP.EXE şi IMP.EXE.
Locaţia implicită pentru pachetele de export import este dată de directoarea
specificată în obiectul DATA_PUMP_DIR. Acesta se obţine cu cda:
SQL> select * from all_directories;
Apasati <ENTER>

OWNER DIRECTORY_NAME DIRECTORY_PATH


---------------- ----------------------- -------------------
SYS hazi d:\
SYS SUBDIR
D:\oracle\product\10.2.0\db_1\demo\schema\order_entry\/2002/Sep
SYS XMLDIR
D:\oracle\product\10.2.0\db_1\demo\schema\order_entry\
SYS MEDIA_DIR
D:\oracle\product\10.2.0\db_1\demo\schema\product_media\
SYS LOG_FILE_DIR
D:\oracle\product\10.2.0\db_1\demo\schema\log\
SYS WORK_DIR
C:\ADE\aime_10.2_nt_push\oracle/work
SYS DATA_FILE_DIR
D:\oracle\product\10.2.0\db_1\demo\schema\sales_history\
SYS DATA_PUMP_DIR
D:\oracle\product\10.2.0\admin\hazi\dpdump\
SYS ADMIN_DIR
C:\ADE\aime_10.2_nt_push\oracle/md/admin

9 înregistrãri selectate.
Pentru alte căi trebuie creat un obiect nou directory:
SQL> CREATE DIRECTORY my_dir AS 'd:\oracle\usr\datafiles';
Utilizatorul trebuie să aibă drepturi de scriere în director, prin proceduri
ORACLE:
SQL> grant read, write on directory data_pump_dir to scott;

13.1. Exportul datelor în ORACLE

Lansarea utilitarului EXPDP se face la modul prompt. Se pot obţine informaţii


cu c-da:
C:\> EXPDP HELP=Y

Utilitare ale bazei de date Oracle


- 108 -
Baze de date Oracle
Vom prezenta mai întâi un exemplu simplu pentru a putea înţelege funcţionarea
utilitarului:

C:\Documents and Settings\george>expdp system/george schemas=SCOTT


DUMPFILE=SCOTT.DMP DIRECTORY=DATA_PUMP_DIR

Export: Release 10.2.0.1.0 - Production on Miercuri, 26 Septembrie,


2007 9:19:06

Copyright (c) 2003, 2005, Oracle. All rights reserved.

Conectat la: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0


- Production
With the Partitioning, OLAP and Data Mining options
Pornire "SYSTEM"."SYS_EXPORT_SCHEMA_01": system/******** schemas=SCOTT
DUMPFILE
=SCOTT.DMP DIRECTORY=DATA_PUMP_DIR
Estimare în curs, utilizând metoda BLOCKS...
Procesare a tipului de obiect SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimare totală prin utilizarea metodei BLOCKS: 192 KB
Procesare a tipului de obiect SCHEMA_EXPORT/USER
Procesare a tipului de obiect SCHEMA_EXPORT/SYSTEM_GRANT
Procesare a tipului de obiect SCHEMA_EXPORT/ROLE_GRANT
Procesare a tipului de obiect SCHEMA_EXPORT/DEFAULT_ROLE
Procesare a tipului de obiect SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Procesare a tipului de obiect SCHEMA_EXPORT/TABLE/TABLE
Procesare a tipului de obiect SCHEMA_EXPORT/TABLE/INDEX/INDEX
Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . "SCOTT"."DEPT" 5.656 KB 4 linii exportate
. . "SCOTT"."EMP" 7.820 KB 14 linii exportate

. . "SCOTT"."SALGRADE" 5.585 KB 5 linii exportate

. . "SCOTT"."BONUS" 0 KB 0 linii exportate

Tabelul principal "SYSTEM"."SYS_EXPORT_SCHEMA_01" a fost


încărcat/descărcat cu succes
**********************************************************************
Setul de fişiere de stocare pentru SYSTEM.SYS_EXPORT_SCHEMA_01 este:
D:\ORACLE\PRODUCT\10.2.0\ADMIN\HAZI\DPDUMP\SCOTT.DMP
Job-ul "SYSTEM"."SYS_EXPORT_SCHEMA_01" a fost finalizat cu succes la
09:19:50
În exemplul de mai sus se exportă toate obiectele din schema utilizatorului
SCOTT în fişierul SCOTT.DMP amplasat în directoarea DATA_PUMP_DIR:
D:\ORACLE\PRODUCT\10.2.0\ADMIN\HAZI\DPDUMP.
EXPDP poate funcţiona în mai multe moduri:
Utilitare ale bazei de date Oracle
- 109 -
Baze de date Oracle
• Mod linie comandă – se specifică în linia de comandă parametrii de
export, aşa ca în exemplul de mai sus
• Utilizând un fişier parametru care descrie opţiunile de export. Singurul
parametru în linia de comandă este PARFILE=nume_fişier_parametru.
A doua variantă este recomandată.
Pot fi făcute pachete de export în mai multe variante:
• FULL EXPORT – când se exportă baza de date întreagă. În acest caz
trebuie precizat parametrul FULL=Y, iar utilizatorul trebuie să aibă
privilegiul EXP_FULL_DATABASE
SQL> grant exp_full_database to hr;
C:\>expdp hr/hr DIRECTORY=DATA_PUMP_DIR DUMPFILE=expfull.dmp
FULL=y NOLOGFILE=y
• SCHEMA – se exportă obiectele deţinute de un utilizator ca în exemplul
de mai sus. Se precizează parametrul SCHEMAS=nume_utilizator.
C:\> expdp system/george DIRECTORY=DATA_PUMP_DIR
DUMPFILE=expdat.dmp SCHEMAS=hr,sh,oe
• TABELE – se exportă numai tabelele precizate. Se precizează parametrul
TABLES=[nume_schema.]nume_tabela[:nume_partitie] [, ...].
C:\> expdp hr/hr DIRECTORY=DATA_PUMP_DIR DUMPFILE=tables.dmp
TABLES=employees,jobs,departments
• TABLE SPACE – se exportă datele conţinute într-un tablespace precizat
sub forma TABLESPACES= nume_tablespace [, ...].
C:\> expdp hr/hr DIRECTORY=DATA_PUMP_DIR DUMPFILE=tbs.dmp
TABLESPACES=tbs_4, tbs_5, tbs_6
În cazul exportului folosind fişier cu parametri, acesta este un fişier ASCII care
conţine opţiunile de export. De exemplu să considerăm fişierul HR.PAR cu conţinutul:
SCHEMAS=HR
DUMPFILE=exp.dmp
DIRECTORY=DATA_PUMP_DIR
LOGFILE=exp.log
Utilizând acest fişier se lansează c-da:
C:\> expdp hr/hr parfile=hr.par
Alte opţiuni ale comenzii de export sunt:
• Filtrarea datelor exportate – se introduce clauza QUERY:
C:\> expdp hr/hr parfile=emp_query.par
Conţinutul fişierului emp_quey.par:
QUERY=employees:'"WHERE department_id > 10 AND salary > 10000"'
NOLOGFILE=y
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=exp1.dmp
• TRANSPORT_TABLESPACES – permite transportul tablespace dintr-o
bază de date în alta
C:\> expdp hr/hr DIRECTORY=DATA_PUMP_DIR DUMPFILE=tts.dmp
TRANSPORT_TABLESPACES=tbs_1 TRANSPORT_FULL_CHECK=y
LOGFILE=tts.log
Opţiunea TRANSPORT_FULL_CHECK permite verificarea relaţiilor dintre
obiectele transportate.

Utilitare ale bazei de date Oracle


- 110 -
Baze de date Oracle
• VERSION – permite precizarea versiunii pentru BD ORCALE pentru ca
datele să poată fi importate în altă bază de date. De exemplu
VERSION=9.2.
• CONTENT = {ALL| DATA_ONLY | METADATA_ONLY} permite
specificarea exportului a numai o parte dintre informaţiile stocate.
METADATA se referă la obiecte, iar DATA la informaţiile din tabele.
• ENCRYPTION_PASSWORD – specifică cheia pentru criptarea datelor.
Criptarea se aplică numai pentru coloanele din tabele criptate.

13.2. Importul datelor în ORACLE

Se realizează cu utilitarul IMPDP.EXE, specific versiunii ORACLE 10g, sau cu


utilitarul IMP.EXE specific versiunilor anterioare.
Vom prezenta şi în acest caz un exemplu:
C:\Documents and Settings\george>impdp system/george schemas=SCOTT
DUMPFILE=SCOTT.DMP DIRECTORY=DATA_PUMP_DIR

Import: Release 10.2.0.1.0 - Production on Miercuri, 26 Septembrie,


2007 11:37:15

Copyright (c) 2003, 2005, Oracle. All rights reserved.

Conectat la: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0


- Production
With the Partitioning, OLAP and Data Mining options
Tabelul principal "SYSTEM"."SYS_IMPORT_SCHEMA_01" a fost
încărcat/descărcat cu succes
Pornire "SYSTEM"."SYS_IMPORT_SCHEMA_01": system/********
schemas=SCOTT DUMPFILE=SCOTT.DMP DIRECTORY=DATA_PUMP_DIR
Procesare a tipului de obiect SCHEMA_EXPORT/USER
Procesare a tipului de obiect SCHEMA_EXPORT/SYSTEM_GRANT
Procesare a tipului de obiect SCHEMA_EXPORT/ROLE_GRANT
Procesare a tipului de obiect SCHEMA_EXPORT/DEFAULT_ROLE
Procesare a tipului de obiect SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Procesare a tipului de obiect SCHEMA_EXPORT/TABLE/TABLE
Procesare a tipului de obiect SCHEMA_EXPORT/TABLE/TABLE_DATA
. . "SCOTT"."DEPT" 5.656 KB 4 linii importate

. . "SCOTT"."EMP" 7.820 KB 14 linii importate

. . "SCOTT"."SALGRADE" 5.585 KB 5 linii importate

. . "SCOTT"."BONUS" 0 KB 0 linii importate

Procesare a tipului de obiect SCHEMA_EXPORT/TABLE/INDEX/INDEX


Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

Utilitare ale bazei de date Oracle


- 111 -
Baze de date Oracle
Procesare a tipului de obiect
SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job-ul "SYSTEM"."SYS_IMPORT_SCHEMA_01" a fost finalizat cu 0 erori la
11:37:26

IMPDP poate funcţiona, ca şi EXPDP, în mai multe moduri:


• Mod linie comandă – se specifică în linia de comandă parametrii de
export, aşa ca în exemplul de mai sus
• Utilizând un fişier parametru care descrie opţiunile de export. Singurul
parametru în linia de comandă este PARFILE=nume_fişier_parametru.
A doua variantă este recomandată.
Importul poate fi făcute în mai multe variante:
• FULL IMPORT – când se importă baza de date întreagă. În acest caz
trebuie precizat parametrul FULL=Y, iar utilizatorul trebuie să aibă
privilegiul IMP_FULL_DATABASE
SQL> grant imp_full_database to hr;
C:\> impdp hr/hr DUMPFILE=DATA_PUMP_DIR:expfull.dmp FULL=y
LOGFILE=DATA_PUMP_DIR:full_imp.log
• SCHEMA – se exportă obiectele deţinute de un utilizator ca în exemplul
de mai sus. Se precizează parametrul SCHEMAS=nume_utilizator.
C:\> impdp hr/hr SCHEMAS=hr DIRECTORY=DATA_PUMP_DIR
LOGFILE=schemas.log DUMPFILE=expdat.dmp
• TABELE – se exportă numai tabelele precizate. Se precizează parametrul
TABLES=[nume_schema.]nume_tabela[:nume_partitie] [, ...].
C:\> impdp hr/hr DIRECTORY=DATA_PUMP_DIR DUMPFILE=expfull.dmp
TABLES=employees,jobs
• TABLESPACE – se exportă datele conţinute într-un tablespace precizat
sub forma TABLESPACES= nume_tablespace [, ...].
C:\> impdp hr/hr DIRECTORY=DATA_PUMP_DIR
DUMPFILE=expfull.dmp TABLESPACES=tbs_1,tbs_2, tbs_3,tbs_4
• TRANSPORT_TABLESPACE – permite copierea unor tablespace dintr-o
bază de date sursă către o bază de date destinaţie specificată prin
DATABASE_LINK.
C:\> impdp hr/hr PARFILE=tablespaces.par
unde fişierul tablespaces.par este de forma:
DIRECTORY=DATA_PUMP_DIR
NETWORK_LINK=source_database_link
TRANSPORT_TABLESPACES=tbs_6
TRANSPORT_FULL_CHECK=n
TRANSPORT_DATAFILES='user01/data/tbs6.f'
Alte opţiuni ale programului IMPDP.EXE sunt:
• CONTENT = {ALL| DATA_ONLY | METADATA_ONLY} permite
specificarea importului a numai o parte dintre informaţiile stocate.
METADATA se referă la obiecte, iar DATA la informaţiile din tabele.
• ENCRYPTION_PASSWORD – specifică cheia pentru criptarea datelor.
• QUERY – permite filtrarea datelor importate

Utilitare ale bazei de date Oracle


- 112 -
Baze de date Oracle
• VERSION – permite precizarea versiunii pentru BD ORCALE pentru ca
datele să poată fi importate în altă bază de date. De exemplu
VERSION=9.2.

13.3. SQL LOADER

Este un utilitar important care permite încărcarea datelor în baze de date


ORACLE din surse externe. Principalele funcţiuni ale utilitarului sunt:
• Încărcarea datelor prin reţele complexe. Utilitarul poate fi lansat pe orice
sistem din reţea
• Încărcarea datelor din mai multe fişiere de date în aceeaşi sesiune
• Încărcarea datelor în mai multe tabele simultan
• Se poate preciza setul de caractere pentru setul de date
• Se pot filtra datele de intrare pe baza valorii acestora
• Datele pot fi manipulate după încărcare utilizând SQL
• Se pot genera chei unice în tabelele generate
• Încărcarea datelor de disc, bandă magnetică sau alte variante
• Se generează rapoarte complexe pentru erorile întâlnite
• Se pot încărca date de tip LOB
Modul de lucru al SQL LOADER este prezentat în figura 13.1

Figura 13.1
Schema de lucru
SQL LOADER

Programul utilizat este SQLLDR.EXE şi poate fi lansat în mod linie comandă


sau utilizând un fişier de descriere a încărcării de date.
Se recomandă utilizarea unui fişier de parametri.
Exemple:
C:\> sqlldr userid=uwclass/uwclass control=c:\temp\demo02.ctl
log=c:\temp\demo02.log
Unde fişierul de control este un fişier ASCII de forma:

Utilitare ale bazei de date Oracle


- 113 -
Baze de date Oracle
LOAD DATA
INFILE 'c:\temp\demo02.dat'
INTO TABLE emp
(empno POSITION(01:04) INTEGER EXTERNAL,
ename POSITION(06:15) CHAR,
job POSITION(17:25) CHAR,
mgr POSITION(27:30) INTEGER EXTERNAL,
sal POSITION(32:39) DECIMAL EXTERNAL,
comm POSITION(41:48) DECIMAL EXTERNAL,
deptno POSITION(50:51) INTEGER EXTERNAL)

C:\> sqlldr userid=uwclass/uwclass control=c:\temp\demo04.ctl


log=c:\temp\demo04.log
Unde fişierul de control demo04.ctl este:
LOAD DATA
INFILE 'c:\temp\demo04.dat'
DISCARDFILE 'c:\temp\demo04.dsc'
DISCARDMAX 999
REPLACE
CONTINUEIF THIS (1) = '*'
INTO TABLE emp (
empno POSITION(1:4) INTEGER EXTERNAL,
ename POSITION(6:15) CHAR,
job POSITION(17:25) CHAR,
mgr POSITION(27:30) INTEGER EXTERNAL,
sal POSITION(32:39) DECIMAL EXTERNAL,
comm POSITION(41:48) DECIMAL EXTERNAL,
deptno POSITION(50:51) INTEGER EXTERNAL,
hiredate POSITION(52:60) INTEGER EXTERNAL)

C:\> sqlldr userid=dev/dev control=c:\load\demo07.ctl


log=c:\load\demo07.log
Unde fişierul de control demo07.ctl este:
LOAD DATA
INFILE *
INSERT
INTO TABLE funcdemo
(
LAST_NAME position(1:7) CHAR "UPPER(:LAST_NAME)",
FIRST_NAME position(8:15) CHAR "LOWER(:FIRST_NAME)"
)
BEGINDATA
Locke Phil
Cline Jack
În acest ultim exemplu datele sunt scrise direct în fişierul de control.

Utilitare ale bazei de date Oracle


- 114 -
Baze de date Oracle

14. MONITORIZAREA ŞI OPTIMIZAREA FUNCŢIONĂRII


BAZEI DE DATE

14.1. Monitorizarea funcţionării bazei de date

Optimizarea funcţionării bazei de date este un proces iterativ. În urma inspecţii a


bazei de date se obţin informaţii despre starea bazei la un moment dat. Remedierea
unor strangulări în funcţionarea bazei de date poate afecta alte procese, acest lucru
justificând modul iterativ de optimizare.
Obţinerea de informaţii despre baza de date se poate face prin vederi ale bazei de
date prezentate în capitolul 6 sau utilizând ORCALE EM. Evident, utilizarea OEM este
mult mai facilă, ea făcând automat interogările şi prezentând rezultatele într-un format
convenabil.
OEM dispune de monitorizarea proactivă care înregistrează semnele vitale în
legătură cu funcţionarea bazei de date, analizează procesele active şi identifică automat
problemele care necesită atenţia unui administrator. Problemele detectate sunt
prezentate ca mesaje de alertare în OEM sau pot fi trimise prin e-mail.
Alerte – Ne ajută să monitorizăm baza de date. Cele mai multe dintre ele indică
depăşire unor limite care pot conduce la blocarea sau funcţionarea necorespunzătoare a
bazei de date. Pentru fiecare alertă se pot seta valori critice şi de atenţie. De exemplu,
când un tablespace depăşeşte 97% grad de ocupare Oracle va genera un mesaj de alertă
critic. În plus, se poate seta ca în cazul unui mesaj de atenţionare să se execute un script.
Implicit, ORACLE generează următoarele mesaje de atenţionare şi critice:
• Grad de umplere a unui tablespace: 85 % atenţionare, 97% critic
• Snapshot Too Old – segementul de rollback este suprascris, necesitând spaţiu
mai mare. Dacă se lucrează în modul Automatic Undo Management, se
majorează parametrul UNDO_RETENTION
• Spaţiul pentru recuperare este prea mic (dacă se utilizează Flashback)
• Spaţiul necesar pentru sesiuni suspendate, prea mic.

Diagnoza bazei de date – Orcale cuprinde un modul de diagnosticare numit


Automatic Database Diagnostic Monitor (ADDM). Acesta permite identificarea
problemelor şi sugerează soluţii de rezolvare. Pentru a avea informaţii, Orcale
colectează periodic informaţii despre starea bazei de date şi a modului în care
funcţionează. Intervalul standard este de o oră. Informaţiile sunt stocare în
Automatic Workload Repository (AWR) rezident în tablespace SYSAUX. În
general informaţiile culese şi stocate includ:
• Gradul de utilizare a resurselor, cum ar fi memoria şi procesorul
sistemului pe care este instalată baza de date.
• Conexiuni lente la baza de date.
• Blocaje în mediul multiuser, când blocajul unor înregistrări pentru
modificare implică timpi mari de aşteptare pentru alţi utiliazatori.
OEM oferă implicit informaţii despre starea bazei de date, informaţii actualizate
Monitorizarea şi optimizarea funcţionării bazei de date
- 115 -
Baze de date Oracle
periodic. În figura 14.1 se prezintă o imagine OEM.

Figura 14.1
Imagine OEM

Pagina generală oferă informaţii sumare despre baza de date cum ar fi momentul
ultimei porniri, numele instanţei şi gazda bazei de date.
Secţiunea aferentă CPU prezintă gradul de ocupare a procesorului. Se precizează
cât din puterea procesorului este utilizat de Oracle şi cât de alte procese din sistem. Se
poate vedea şi sesiunile care sunt active în baza de date.
Pe lângă ADDM, Oracle dispune şi de alţi sfătuitori, cum ar fi:
• SQL Tuning Advisor – analizează instrucţiunile SQL şi face recomandări
pentru creşterea vitezei de execuţie
• SQL Access Advisor – Analizează obiectele din schemă şi face propuneri de
îmbunătăţire a schemei (de exemplu utilizarea indecşilor, a vederilor
materializate, etc)
• Sfătuitori pentru configurare memorie – Shared Pool Advisor, Buffer Cache
Advisor, PGA Advisor.

Monitorizarea şi optimizarea funcţionării bazei de date


- 116 -
Baze de date Oracle
14.2. Managementul automat al stocării

Oracle 10g dispune de o unealtă puternică: Automatic Storage Management.


Acesta înlocuieşte foarte bine activitatea de administrare a spaţiului de stocare.
Principalele facilităţi oferite de ASM sunt:
• Utilizează eficient spaţiul de stocare prin împrăştierea datelor pe toate
discurile astfel încât acestea să lucreze, pe cât posibil, simultan. De exemplu,
dacă baza de date are alocată 6 discuri, componente din fişierul gestionat de
ASM vor fi scrise pe toate cele 6 discuri. Similar se întâmplă şi în cazul
citirii datelor.
• Poate genera copii în oglindă la orice fişier de date. Faţă de sistemele de
operare care pot genera copii în oglindă pentru discuri întregi, ASM poate
face acest lucru la nivel de fişier. Copiile oglindă sunt stocate pe discuri
diferite pentru ca în cazul unui incident major datele să poată fi recuperate.
Pot fi create 2 sau 3 copii.
• Reconfigurarea on line a spaţiului de stocare, în situaţia adăugării unui disc,
fără a opri funcţionarea bazei de date. Facilitatea este oferită şi în cazul
scoaterii unui disc.
• Managementul automat al creării şi ştergerii fişierelor de date.
Oracle permite ca unele fişiere să fie monitorizate de ASM, iar altele nu.
Pentru funcţionare, ASM are o componentă rezidentă în SGA. În modul RAC,
ASM are o instanţă în fiecare nod.
Administrarea ASM este minimă, utilizatorii trebuie să precizeze discurile şi
grupurile de discuri (figura 14.2).

Figura 14.2
Configurare ASM cu OEM

Monitorizarea şi optimizarea funcţionării bazei de date


- 117 -
Baze de date Oracle
14.3. Managementul automat al memoriei

Oracle 10g a introdus o unealtă pentru ajustarea automată a dimensiunilor


componentelor de memorie necesare funcţionării bazei de date. În variantele vechi,
componentele de memorie ale bazei de date (figura 14.3), erau setate manual prin
variabilele DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE,
JAVA_POOL_SIZE.

Figura 14.3
Componentele memoriei

În Oracle 10g se utilizează un singur parametru important (SGA_TARGET). Se


asigură următoarele activităţi automat:
- ajustarea automată a dimensiunii SGA
- memoria este alocată acolo unde este necesară
- se colectează informaţii despre procesele în execuţie
- se utilizează sfătuitori interni.
Componentele setate automat sunt:
o Default buffer cache
o Shared pool
o Large pool
o Java pool
Componentele care pot fi setate manual:
o Log buffer
o Alte zone cache (KEEP/RECYCLE)
o Streams pool (pentru stocarea fluxurilor de date modificate în una sau
mai multe baze de date Oracle sau non Oracle)

14.4. Salvarea şi restaurarea bazei de date

Se realizează cu utilitarul RAMN (Recovery Manager). Acesta este un program


care funcţionează command line însă, pe lângă comenzile specifice, suportă şi SQL.
RMAN gestionează informaţii în legătură cu salvările realizate, cu setările existente
într-un repository şi un catalog.

Monitorizarea şi optimizarea funcţionării bazei de date


- 118 -
Baze de date Oracle
Pentru setarea backup se poate utiliza şi OEM (figura 14.4, 14.5).

Figura 14.4
Configurare backup cu OEM

Figura 14.5
Configurare backup(user) cu OEM

Lansarea RMAN se face aşa cum este prezentat mai jos:

Microsoft Windows XP [Version 5.1.2600]


(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\ghhazi>rman

Monitorizarea şi optimizarea funcţionării bazei de date


- 119 -
Baze de date Oracle
Recovery Manager: Release 10.2.0.1.0 - Production on Mon Oct 1
08:59:35 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.

RMAN> connect target sys/george@ub

connected to target database: UB (DBID=2891805612)

Lansarea unui backup total se face cu c-da:

RMAN> BACKUP DATABASE;

Starting backup at 01-OCT-07


using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=141 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSTEM01.DBF
input datafile fno=00003 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSAUX01.DBF
input datafile fno=00005
name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\EXAMPLE01.DBF
input datafile fno=00002
name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\UNDOTBS01.DBF
input datafile fno=00004 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\USERS01.DBF
channel ORA_DISK_1: starting piece 1 at 01-OCT-07
channel ORA_DISK_1: finished piece 1 at 01-OCT-07
piece
handle=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\2007_10_0
1\O1_MF_NNNDF_TAG20071001T102348_3J1845L2_.BKP tag=TAG20071001T102348
comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:55
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 01-OCT-07
channel ORA_DISK_1: finished piece 1 at 01-OCT-07
piece
handle=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\2007_10_0
1\O1_MF_NCSNF_TAG20071001T102348_3J185XTV_.BKP tag=TAG20071001T102348
comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 01-OCT-07

RMAN>

Backup incremental salvează numai blocurile de date modificate sau adăugate de


la ultima salvare. Poate fi de nivel 0 sau 1. La nivel zero se salvează toate blocurile
dintr-un fişier modificat. La nivel 1 se salvează numai blocurile modificate. Dacă se
adaugă opţiunea CUMULATIVE, se salvează datele de la ultimul backup level 0. Cu
opţiunea DIFFERENTIAL se salvează numai modificările de la ultima salvare.
Lansarea unui backup incremental se face cu c-da:

RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;

Monitorizarea şi optimizarea funcţionării bazei de date


- 120 -
Baze de date Oracle

Starting backup at 01-OCT-07


using channel ORA_DISK_1
channel ORA_DISK_1: starting incremental level 1 datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001
name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSTEM01.DBF
input datafile fno=00003
name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSAUX01.DBF
input datafile fno=00005
name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\EXAMPLE01.DBF
input datafile fno=00002
name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\UNDOTBS01.DBF
input datafile fno=00004
name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\USERS01.DBF
channel ORA_DISK_1: starting piece 1 at 01-OCT-07
channel ORA_DISK_1: finished piece 1 at 01-OCT-07
piece
handle=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\2007_
10_01\O1_MF_NNND1_TAG20071001T105713_3J1B2TNZ_.BKP tag
=TAG20071001T105713 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:55
channel ORA_DISK_1: starting incremental level 1 datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 01-OCT-07
channel ORA_DISK_1: finished piece 1 at 01-OCT-07
piece
handle=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\2007_
10_01\O1_MF_NCSN1_TAG20071001T105713_3J1B4MCQ_.BKP tag=
TAG20071001T105713 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 01-OCT-07

RMAN>
Recuperarea datelor se face cu comenzile RESTORE DATABASE şi
RECOVER DATABASE, ca în exemplul de mai jos. Baza de date trebuie să fie numai
montată.
RMAN> startup force mount;

Oracle instance started


database mounted

Total System Global Area 209715200 bytes

Fixed Size 1248140 bytes


Variable Size 71304308 bytes
Database Buffers 134217728 bytes
Redo Buffers 2945024 bytes

RMAN> RESTORE DATABASE;

Monitorizarea şi optimizarea funcţionării bazei de date


- 121 -
Baze de date Oracle
Starting restore at 01-OCT-07
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK

channel ORA_DISK_1: starting datafile backupset restore


channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSTEM01.DBF
restoring datafile 00002 to
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\UNDOTBS01.DBF
restoring datafile 00003 to
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSAUX01.DBF
restoring datafile 00004 to
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\USERS01.DBF
restoring datafile 00005 to
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\EXAMPLE01.DBF
channel ORA_DISK_1: reading from backup piece
D:\ORACLE\PRODUCT\10.2.0\FLASH_REC
OVERY_AREA\UB\BACKUPSET\2007_10_01\O1_MF_NNND1_TAG20071001T105713_3J1B
2TNZ_.BKP
channel ORA_DISK_1: restored backup piece 1
piece
handle=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\2007_
10_0
1\O1_MF_NNND1_TAG20071001T105713_3J1B2TNZ_.BKP tag=TAG20071001T105713
channel ORA_DISK_1: restore complete, elapsed time: 00:00:45
Finished restore at 01-OCT-07

RMAN> RECOVER DATABASE;

Starting recover at 01-OCT-07


using channel ORA_DISK_1

starting media recovery


media recovery complete, elapsed time: 00:00:05

Finished recover at 01-OCT-07

RMAN> ALTER DATABASE OPEN;

database opened

RMAN>
Informaţii despre pachetele de sarvare se pot obţine cu comenzile RMAN
LIST BACKUP OF DATABASE BY BACKUP, LIST BACKUP BY FILE.

RMAN> LIST BACKUP BY FILE;

List of Datafile Backups


========================

File Key TY LV S Ckp SCN Ckp Time #Pieces #Copies Compressed Tag
---- ------- - -- - ---------- --------- ------- ------- ---------- ---
1 7 B 1 A 572195 01-OCT-07 1 1 NO

Monitorizarea şi optimizarea funcţionării bazei de date


- 122 -
Baze de date Oracle
TAG20071001
T105713
4 B F A 571483 01-OCT-07 1 1 NO
TAG20071001
T103918
1 B F A 571055 01-OCT-07 1 1 NO
TAG20071001
T102348
2 7 B 1 A 572195 01-OCT-07 1 1 NO
TAG20071001
T105713
4 B F A 571483 01-OCT-07 1 1 NO
TAG20071001
T103918
1 B F A 571055 01-OCT-07 1 1 NO
TAG20071001
T102348
3 7 B 1 A 572195 01-OCT-07 1 1 NO
TAG20071001
T105713
4 B F A 571483 01-OCT-07 1 1 NO
TAG20071001
T103918
1 B F A 571055 01-OCT-07 1 1 NO
TAG20071001
T102348
4 7 B 1 A 572195 01-OCT-07 1 1 NO
TAG20071001
T105713
4 B F A 571483 01-OCT-07 1 1 NO
TAG20071001
T103918
1 B F A 571055 01-OCT-07 1 1 NO
TAG20071001
T102348
5 7 B 1 A 572195 01-OCT-07 1 1 NO
TAG20071001
T105713
4 B F A 571483 01-OCT-07 1 1 NO
TAG20071001
T103918
1 B F A 571055 01-OCT-07 1 1 NO
TAG20071001
T102348

List of Archived Log Backups


============================

Thrd Seq Low SCN Low Time BS Key S #Pieces #Copies Compressed Tag
---- ------- ---------- --------- ------- - ------- ------- ---------- ---
1 2 565146 01-OCT-07 3 A 1 1 NO
TAG200710
01T103914
1 3 571478 01-OCT-07 6 A 1 1 NO
TAG200710
01T104017

List of Control File Backups


============================

CF Ckp SCN Ckp Time BS Key S #Pieces #Copies Compressed Tag

Monitorizarea şi optimizarea funcţionării bazei de date


- 123 -
Baze de date Oracle
---------- --------- ------- - ------- ------- ---------- ---
572218 01-OCT-07 8 A 1 1 NO TAG20071001T105713
571506 01-OCT-07 5 A 1 1 NO TAG20071001T103918
571078 01-OCT-07 2 A 1 1 NO TAG20071001T102348
List of SPFILE Backups
======================

Modification Time BS Key S #Pieces #Copies Compressed Tag


----------------- ------- - ------- ------- ---------- ---
01-OCT-07 8 A 1 1 NO TAG20071001T105713
01-OCT-07 5 A 1 1 NO TAG20071001T103918
01-OCT-07 2 A 1 1 NO TAG20071001T102348

RMAN> LIST BACKUP OF DATABASE BY BACKUP;

List of Backup Sets


===================

BS Key Type LV Size Device Type Elapsed Time Completion Time


------- ---- -- ---------- ----------- ------------ ---------------
1 Full 579.48M DISK 00:00:52 01-OCT-07
BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20071001T102348
Piece Name:
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\20
07_10_01\O1_MF_NNNDF_TAG20071001T102348_3J1845L2_.BKP
List of Datafiles in backup set 1
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 571055 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSTEM01
.DBF
2 Full 571055 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\UNDOTBS0
1.DBF
3 Full 571055 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSAUX01
.DBF
4 Full 571055 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\USERS01.
DBF
5 Full 571055 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\EXAMPLE0
1.DBF

BS Key Type LV Size Device Type Elapsed Time Completion Time


------- ---- -- ---------- ----------- ------------ ---------------
4 Full 579.50M DISK 00:00:52 01-OCT-07
BP Key: 4 Status: AVAILABLE Compressed: NO Tag: TAG20071001T103918
Piece Name:
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\20
07_10_01\O1_MF_NNNDF_TAG20071001T103918_3J1917J3_.BKP
List of Datafiles in backup set 4
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 571483 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSTEM01
.DBF
2 Full 571483 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\UNDOTBS0
1.DBF

Monitorizarea şi optimizarea funcţionării bazei de date


- 124 -
Baze de date Oracle
3 Full 571483 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSAUX01
.DBF
4 Full 571483 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\USERS01.
DBF
5 Full 571483 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\EXAMPLE0
1.DBF

BS Key Type LV Size Device Type Elapsed Time Completion Time


------- ---- -- ---------- ----------- ------------ ---------------
7 Incr 1 513.62M DISK 00:00:49 01-OCT-07
BP Key: 7 Status: AVAILABLE Compressed: NO Tag: TAG20071001T105713
Piece Name:
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\UB\BACKUPSET\20
07_10_01\O1_MF_NNND1_TAG20071001T105713_3J1B2TNZ_.BKP
List of Datafiles in backup set 7
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 1 Incr 572195 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSTEM01
.DBF
2 1 Incr 572195 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\UNDOTBS0
1.DBF
3 1 Incr 572195 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\SYSAUX01
.DBF
4 1 Incr 572195 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\USERS01.
DBF
5 1 Incr 572195 01-OCT-07
D:\ORACLE\PRODUCT\10.2.0\ORADATA\UB\EXAMPLE0
1.DBF

RMAN>

Monitorizarea şi optimizarea funcţionării bazei de date


- 125 -
Baze de date Oracle

BIBLIOGRAFIE
1. Michele Cyran, Paul Lane, JP Polk, Oracle® Database Concepts10g
Release 2 (10.2), October 2005
2. Steve Fogel, Paul Lane, Oracle® Database Administrator's Guide10g
Release 2 (10.2), May 2006
3. Colin McGregor, Michele Cyran, Daniela Hansell, Vasudha Krishnaswamy,
Peter Laquerre, Venkat Maddali, Mughees Minhas, JP Polk, Mark
Townsend, and Wanli Yang, Oracle® Database 2 Day DBA 10g Release 2
(10.2), December 2005
4. Sumit Jeloka, Oracle® Database Advanced Security Administrator’s
Guide10g Release 2 (10.2), November 2005
5. Immanuel Chan, Oracle® Database 2 Day + Performance Tuning Guide10g
Release 2 (10.2), November 2006
6. Oracle, Oracle® Database Backup and Recovery Quick Start Guide10g
Release 2 (10.2), November 2005
7. Antonio Romero, Oracle® Database Backup and Recovery Reference10g
Release 2 (10.2), November 2005
8. Diana Lorentz, Oracle® Database SQL Reference10g Release 2 (10.2),
December 2005
9. Simon Watt, SQL Plus® User’s Guide and Reference10g Release 2 (10.2),
June 2005
10. Shashaanka Agrawal, Cailein Barclay, Eric Belden, Dmitri Bronniko,
Oracle® Database PL/SQL User's Guide and Reference10g Release 2
(10.2), June 2005
11. Kathy Rich, Oracle® Database Reference10g Release 2 (10.2), November
2005

Bibliografie
- 126 -

You might also like