You are on page 1of 75

1

SQL*PLUS
SQL este un limbaj de comenzi pentru comunicare cu server-ul Oracle. SQL*Plus este un utilitar Oracle care recunoate comenzile SQL i trimite aceste comenzi server-ului Oracle pentru execuie. SQL*Plus instrument puternic care este utilizat n dezvoltarea aplicaiilor pentru baza de date Oracle. SQL*Plus instrument flexibil care poate fi executat pe toate platformele pe care se instaleaz produsul Oracle.

Ce operaii se pot realiza din consola SQL*Plus ?


editarea, salvarea, ncrcarea i execuia de comenzi SQL sau blocuri PL/SQL; formatarea, salvarea, tiprirea i realizarea anumitor calcule asupra rezultatelor unei interogri sub form de rapoarte; listarea definiiilor tabelelor; accesarea i transferarea datelor ntre baze de date; realizarea unor funcii de administrare a BD: administrarea utilizatorilor, administrarea spaiilor tabel, operaii de arhivare i recuperare etc.

Deosebiri eseniale ntre comenzile SQL i comenzile SQL*Plus.


Marcm dintre aceste deosebiri cteva, care sunt semnificative. Comenzile SQL*Plus: nu cer caracter de terminare; cer un caracter de continuare dac comanda este mai mare dect o linie; nu sunt depuse n buffer-ul SQL; nu permit prelucrarea datelor din baza de date; foloseste comenzi pentru formatarea datelor (SQL foloseste functii);

cuvintele cheie pot fi prescurtate.

Conexiune la SQL*Plus
Dup ce utilizatorul se conecteaz la SQL*Plus, sistemul afieaz un prompt (SQL>) i ateapt comenzile utilizatorului. Utilizatorul poate da: comenzi SQL pentru accesarea bazei de date; blocuri PL/SQL pentru accesarea bazei de date; comenzi SQL*Plus.

Activarea interfeei SQL*Plus


1. Din WINDOWS: Se selecteaza: START > PROGRAMS > ORACLE > APPLICATION DEVELOPMENT > SQL*Plus Se da username, password si numele bazei. 2. Prin linia de comanda: SQLPLUS [nume_utiliz/parola][@nume_baza_de_date] [@nume_fisier]

nchiderea sesiunii de lucru SQL*Plus i preluarea controlului


sistemului de operare al calculatorului gazd se realizeaz cu QUIT sau EXIT.

Conectarea la o alt baz de date, dect cea deschis iniial, n timpul


unei sesiuni de lucru SQL*Plus: CONNECT [nume_utilizator[/parola]][@nume_baza_de_date] Conexiunea rmne valid pn cnd apare una din urmtoarele situaii: se prsete SQL*Plus; se d comanda de deconectare DISCONNECT (comanda nu nchide sesiunea de lucru SQL*Plus); se face conectarea la o alt baz de date.

Crearea unei legturi ntre BD local i o BD aflat la distan:


CREATE [PUBLIC] DATABASE LINK nume_legatura CONNECT TO nume_utilizator

IDENTIFIED BY parola USING baza_de_date_distanta Dup ce legtura a fost creat, pot fi fcute interogri asupra tabelelor corespunztoare BD distante prin specificarea numelui legturii n clauza FROM din cerere. Dac se specific opiunea PUBLIC, legtura este disponibil tuturor utilizatorilor cu excepia celor care i-au definit o legtur privat cu acelai nume.

Suprimarea unei legturi ntre dou BD, una local i una la distan:
DROP [PUBLIC] DATABASE LINK nume_legatura. Cteva dintre cele mai importante comenzi disponibile n SQL*Plus : ACCEPT citete o variabil de intrare de la utilizator; DEFINE declar o variabil (DEF); DESCRIBE listeaz atributele tabelelor sau ale altor obiecte (DESC); EDIT invoca editorul, salveaza continutul buffer-ului in fisierul afiedt.buf; EXIT sau QUIT deconecteaz utilizatorul i ncheie sesiunea SQL*Plus; GET caut un fiier SQL i l depune n buffer-ul SQL; HOST execut o comand a sistemului de operare (!); LIST afieaz ultima comand executat din buffer-ul SQL (L); PROMPT afieaz un text pe ecran; RUN listeaz i execut comanda salvat n buffer-ul SQL (/); SAVE salveaz comanda din buffer-ul SQL ntr-un fiier script; SET modific variabilele de mediu specifice SQL*Plus; SHOW afieaz setrile variabilelor de mediu SQL*Plus; SPOOL copiaz ieirea unei comenzi ntr-un fiier; START execut un script SQL (@).

Salvarea comenzilor
Comanda SQL, care este introdus interactiv prin interfaa SQL*Plus, este memorat ntr-un buffer SQL. Ea poate fi modificat sau executat de mai multe ori, atta timp ct utilizatorul nu a introdus o nou comand sau nu a ters explicit buffer-ul SQL (CLEAR BUFFER). Cererea nou va terge vechea cerere din buffer. Utilizatorul poate salva una sau mai multe comenzi ntr-un fiier, ce ulterior poate fi ncrcat, modificat sau executat. Extensia implicit a fiierului: .sql.

SAVE nume_fisier [CREATE|REPLACE|APPEND]

comenzi SQL

BUFFER

comenzi SQL

SQL*Plus

SERVER

comenzi SQL*Plus

rezultatul cererii

RAPORT (formatat)

Display calculator

SAVE alfa EDIT alfa @alfa

opiunea CREATE arat c se creeaz un nou fiier; opiunea REPLACE permite nlocuirea (overwrite) unui fiier existent; opiunea APPEND adaug coninutul buffer-ului n continuarea unui fiier. Pentru ncrcarea i executarea unui fiier de comenzi poate fi utilizat una din urmtoarele variante: comanda START; comanda ; comenzile GET i RUN; comenzile GET i /. Pentru introducerea de comentarii printre comenzile care se gsesc ntr-un fiier exist mai multe posibiliti: utilizarea caracterelor -- urmate de textul comentariului; utilizarea delimitatorilor /* i */ pentru a marca nceputul i sfritul unui comentariu. Pentru a obine informaii referitoare la structura tabelelor, vizualizrilor sau sinonimelor, a procedurilor, funciilor sau pachetelor fr a fi necesar consultarea cataloagelor de sistem, se utilizeaz comanda: DESCRIBE [nume_schema.]nume_obiect

Editarea comenzilor
Editorul integrat SQL *Plus (mini-editor mod linie) se ncarc prin: EDIT [nume_fisier[.extensie]] Dac se dorete lansarea n execuie a unui alt editor, se modific variabila EDITOR cu ajutorul comenzii DEFINE. De exemplu: DEFINE _EDITOR = vi SQL*Plus pstreaz n memorie ultima comand executat. Comenzile SQL*Plus nu sunt depuse n buffer-ul SQL. Ele se dau secvenial, cte una la un moment dat. Dac comanda este prea lung, ea va fi continuat pe linia urmtoare tastnd caracterul la sfritul liniei, nainte de a tasta RETURN.

Pentru editarea comenzilor SQL i a blocurilor PL/SQL se pot folosi: A[PPEND] text adaug textul specificat la sfritul liniei curente din buffer-ul SQL; C[HANGE] separator old [separator [new [separator]]] schimb textul old cu textul new (ca separator se poate folosi orice caracter care nu este alfanumeric); DEL {n | n m | n * | n LAST | * | * n | * LAST | LAST} terge una sau mai multe linii din buffer-ul SQL (caracterul * indic linia curent); DEL fr nici o clauz are ca efect tergerea liniei curente; CL[EAR] BUFF[ER] sterge toate liniile din buffer-ul SQL; I[NPUT] [text] adaug una sau mai multe linii de text dup linia curent din buffer; n text inlocuieste linia n prin text; L[IST] {n | n m | n * | n LAST | * | * n | * LAST | LAST} listeaz una sau mai multe linii din buffer (caracterul * indic linia curent); LIST fr nici o clauz listeaz toate liniile din buffer.

Comenzi interactive
SQL*Plus dispune de comenzi ce permit comunicarea direct cu utilizatorul: comanda PAUSE permite afiarea unei linii vide sau unui text suspendnd temporar aciunea i ateptnd un RETURN de la utilizator; comanda PROMPT trimite o linie goal sau un mesaj pe ecran; comanda ACCEPT permite citirea unei linii de pe ecran i atribuirea valorii sale unei variabile (utilizator) specificate (variabila poate s fie deja definit prin comanda DEFINE). ACCEPT variabila [NUMBER | CHAR | DATE] [FORMAT format] [PROMPT text | NOPROMPT] [HIDE] Observaii: tipul implicit al variabilei este CHAR; textul de la opiunea PROMPT este tiprit nainte ca utilizatorul s dea valoarea efectiv; opiunea HIDE face ca valoarea dat de utilizator s fie mascat (de exemplu, o parol);

opiunea FORMAT indic modul de formatare; variabila de substituie, dac este prezent, nu trebuie prefixat de simbolul &. Exemplu: ACCEPT ACCEPT SELECT FROM WHERE AND alfa PROMPT Numarul de exemplare: beta PROMPT Numele autorului: * carte nrex = &alfa autor = β

Variabilele de substituie (&nume)


Aceste variabile sunt utilizate pentru stocarea temporar a unor valori. Variabilele pot s apar n comenzi SQL sau SQL*Plus. Interfaa cere utilizatorului s dea valori de fiecare dat cnd ntlnete o variabil nedefinit. Dac variabila este precedat de simbolurile &&, doar la prima apelare se va solicita o valoare. Exemplu: SELECT FROM ORDER BY nume, &&salariu salariat &salariu;

Pentru variabilele de tip caracter sau de tip dat calendaristic este obligatorie folosirea ghilimelelor. Variabilele de substituie pot s apar n condiia WHERE, n clauza ORDER BY, n expresia unei coloane, n numele unui tabel, n locul unei ntregi comenzi SELECT. Exemplu: SELECT FROM WHERE ORDER BY &coloana &tabel &conditie &ordine;

Comanda SET VER[IFY] {ON | OFF} permite listarea (sau nu) textului unei comenzi SQL sau PL/SQL, inainte si dupa ce SQL*Plus inlocuieste variabilele de substitutie cu valori efective. SQL*Plus permite definirea variabilelor utilizator de tip CHAR prin: DEFINE variabil = valoare

Variabila rmne definit pn cnd fie se prsete SQL*Plus, fie se d comanda UNDEFINE pentru variabila respectiv. Tiprirea tuturor variabilelor utilizator, a valorilor i tipurilor acestora se obine prin forma DEFINE. Exemplu: SQL> DEFINE autor1 = Zola SQL> DEFINE autor2 = Blaga SQL> SELECT titlu, nrex 2 FROM carte 3 WHERE autor = &autor1 4 OR autor = &autor2;

Setri n SQL*Plus
Pentru a preciza opiunile de lucru cu SQL*Plus se utilizeaz comanda SET. Setrile SQL standard se gsesc n fiierul login.sql, care poate fi modificat pentru a conine setri adiionale. Cnd se termin sesiunea toate setrile sunt pierdute. Comanda SET are dou forme sintactice: una din ele se folosete ca Help pentru utilizator; cealalt se folosete pentru setarea variabilelor sistem. O variabil sistem este un cmp rezervat n care se reine o valoare de ctre sistemul Oracle, valoare care indic o stare a sistemului. Pentru a afia valorile tuturor variabilelor de mediu la un moment dat se utilizeaza comanda SHOW ALL. SET variabila_sistem valoare Parametrul variabila_sistem poate lua oricare din valorile care apar la execuia comenzii SHOW ALL. n continuare sunt prezentate numai o parte a acestor setri (n special cele folosite la formatarea rapoartelor) mpreun cu valorile pe care le poate lua parametrul valoare. SET RECSEP {WR[APPED] | EA[CH] | OFF} controleaz tiprirea separatorilor de nregistrri. Cele trei valori posibile au urmtoarele semnificaii: - WRAPPED tiprete un separator dup fiecare linie a unei nregistrri (chiar dac aceasta cuprinde mai multe linii); - EACH face acelai lucru, dar numai la sfritul unei nregistrri;

- OFF anuleaz tiprirea unui separator. SET RECSEPCHAR {_ | c} seteaz caracterul ce separ nregistrrile; SET SPACE {1 | n} seteaz numrul de spaii ntre coloane. SET WRA[P] {OFF | ON} specific modul de afiare a nregistrrilor (trunchiat sau pe o linie). SET NULL text specific textul afiat n locul valorii NULL. SET HEADS[EP] {| | c | OFF | ON} specific caracterele ce separ numele coloanelor de nregistrri. SET UND[ERLINE] {_ | c | OFF | ON} specific caracterul folosit pentru sublinierea numelor coloanelor. SET NEWP[AGE] {1 | n | NONE} seteaz numrul de linii vide lsate la nceputul fiecrei pagini. SET TERM[OUT] {OFF | ON} controleaz afiarea output-ului generat de comenzi executate dintr-un script. SET PAGES[IZE] {24 | n} specific numrul de linii afiate pe pagin (n implicit este 24; se poate seta la valoarea 0 pentru a suprima afiarea numelor coloanelor, a titlului unui raport). SET FEED[BACK] {6 | n | OFF | ON} controleaz afiarea numrului de nregistrri furnizate ca rezultat de o comand SELECT. SET ECHO {OFF | ON} controleaz afiarea comenzilor dintr-un script SQL lansat cu comanda START, pe msur ce acestea sunt executate. Comanda SPOOL permite salvarea rezultatelor unei interogri ntr-un fiier indicat ca parametru. Ea are urmtoarea sintax: SPO[OL] [ file_name[. ext] | OFF | OUT]

Formatarea rezultatelor
Pentru afiarea unui titlu la nceputul sau sfritul fiecrei pagini a unui raport se folosesc comenzile TTITLE sau BTITLE, avnd sintaxa urmtoare: {TTI | BTI}[TLE] [spec_tiparire [text | variabila]] [OFF | ON] Semnificaia parametrilor mpreun cu valorile posibile sunt: spec_tiparire controleaz amplasamentul i formatarea titlului prin combinarea unora dintre urmtoarele opiuni:

10

- COL n indenteaz titlul la coloana n a liniei curente; - S[KIP] n realizeaz un salt peste n linii, la nceputul unei noi linii; dac n are valoarea 0, atunci sare la nceputul liniei curente; - TAB n realizeaz un salt peste n coloane pe linia curent (salt nainte dac n este pozitiv i salt napoi dac n este negativ); - LE[FT], CE[NTER], RI[GHT] aliniaz datele la stnga, n centru sau la dreapta; - BOLD realizeaz ngroarea caracterelor textului; - FOR[MAT] format formateaz coloana conform cu specificaia dat de format (de exemplu, dac coloana este de tip caracter atunci An are semnificaia c valoarea coloanei se va scrie pe n caractere la afiare); text reprezint textul titlului ncadrat de ghilimele simple (n cazul n care conine mai multe cuvinte se poate folosi caracterul | pentru mprirea unui titlu pe mai multe linii); variabila este o variabil sistem sau o variabil definit de utilizator (de exemplu, SQL.PNO este o variabil sistem care specific numrul paginii curente; SQL.LNO specific numrul liniei curente; variabila SQL.USER specific numrul utilizatorului curent etc.). Comanda COLUMN permite controlul afirii coloanelor i a numelor. COL[UMN] [{coloana | expresie} [opiune]] coloana este numele coloanei asupra creia se aplic sau creia i se citete formatarea ntr-o comand SELECT. Valorile parametrului opiune pot fi: NOPRI[NT] | PRI[NT] controleaz afiarea unei coloane; ALI[as] alias specific un alias pentru coloana sau expresia respectiv; CLE[AR] reseteaz atributele de afiare ale coloanei; pentru a face acest lucru pentru toate coloanele se folosete comanda CLEAR COLUMNS; HEA[DING] text seteaz numele coloanei text; NEW_V[ALUE] specific o variabil n care se reine valoarea unei coloane; variabila poate fi apoi refereniat n comanda TTITLE; numele

11

coloanei trebuie inclus ntr-o comand BREAK mpreun cu SKIP PAGE; aceast opiune este util atunci cnd trebuie fcute rapoarte master/detail i fiecare nregistrare master trebuie s apar pe o nou pagin; OLD_V[ALUE] semnificaia este cea anterioar, dar cu deosebirea c referenierea variabilei se face ntr-o comand BTITLE; JUS[TIFY] {L[EFT] | C[ENTER] | R[IGHT]} aliniaz numele coloanelor (implicit are valoarea R[IGHT]); FOR[MAT] format aceeai semnificaie ca cea descris pentru BTITLE sau TTITLE. Exemplu: COLUMN sal JUSTIFY LEFT COLUMN autor NULL 'necunoscut' SQL*Plus permite regruparea liniilor rezultatului n funcie de una sau mai multe valori ale coloanelor i eventual efectuarea unor aciuni la fiecare rupere. Liniile rezultatului trebuie s fie ordonate ( ORDER BY) dup coloana n funcie de ale crei valori se fac ruperile. Elementul dup care se face fragmentarea poate fi: un nume de coloan sau o expresie (valoarea coloanei sau a expresiei este afiat doar pentru prima linie a grupului); ROW (aciunea este executat pentru fiecare linie); REPORT (aciunea este executat la sfritul raportului). Comanda BREAK modific formatul unui raport ntr-unul din modurile: suprim afiarea valorilor duplicate pentru o anumit coloan; sare peste o linie cnd valoarea unei coloane se schimb; tiprete expresii calculate utiliznd comanda COMPUTE de fiecare dat cnd valoarea unei coloane se modific sau la sfritul unui raport. BRE[AK] [ON element_fragmentare [aciune [aciune]]] Parametrii acesteia au forma: element_fragmentare {coloan | expresie | ROW | REPORT} aciune [SKI[P] n | [SKI[P]] PAGE] [NODUP[LICATES] | DUP[LICATES]] Exemplu:

12

BREAK ON autor SKIP 4 ON intdom SKIP 2 Utilizatorul poate realiza operaii de calcul asupra liniilor fiecrui subansamblu creat prin BREAK. Pentru calculul anumitor funcii standard (pe coloane) se folosete comanda COMPUTE care are urmtoarea form sintactic: COMP[UTE] [function [LAB[EL] text] OF {expr | column | alias} ON {expr | column | alias | REPORT | ROW} ] Opiunile au urmtoarele semnificaii: function poate fi una dintre funciile AVG, COU[NT], MAX[IMUM], MIN[IMUM], NUM[BER], STD, SUM, VAR[IANCE]; text definete eticheta afiat pentru valoarea calculat; OF {expr | column | alias} specific coloanele sau expresiile folosite n funcia calculat; acestea trebuie s apar i n comanda SELECT, altfel SQL*Plus ignor comanda COMPUTE; column nu poate fi ataat unui tabel sau unei vizualizri dect folosind un alias pentru coloana respectiv; ON {expr | column | alias | REPORT | ROW} specific evenimentul folosit de SQL*Plus ca break, adic elementul de fragmentare.

Ca i n cazul comenzilor COLUMN sau BREAK, COMPUTE fra nici o clauz listeaz toate definiiile de COMPUTE. Pentru realizarea corect a calculului funciei trebuie ndeplinite condiiile: una sau mai multe dintre expresiile, coloanele sau alias-urile de coloane refereniate n clauza OF trebuie s apar i n comanda SELECT; expresia, coloana sau alias-ul de coloan refereniat n clauza ON trebuie s apar n comanda SELECT i n cea mai recent comand BREAK; dac ROW sau REPORT sunt refereniate n clauza ON atunci ele trebuie s apar i n cea mai recent comand BREAK. Exemplu: S se calculeze valoarea medie a preurilor crilor fiecrui autor. BREAK ON autor SKIP 1 COMPUTE AVG OF pret ON autor SELECT autor,pret

13

FROM ORDER BY

carte autor;

Comanda CL[EAR] opiune permite resetarea valorilor specificate n anumite opiuni. Parametrul opiune reprezint una din urmtoarele clauze: BRE[AKS] , BUFF[ER], COL[UMNS], COMP[UTES], SCR[EEN], SQL, TIMI[NG].

Copierea datelor
Pentru a copia datele furnizate de o interogare ntr-un tabel aflat ntr-o baz de date local sau la distan se poate folosi comanda COPY, care permite: copierea unui tabel dintr-o baz local ntr-o baz distant (opiunea FROM poate fi omis); copierea unui tabel dintr-o baz distant ntr-o baz local (opiunea TO poate fi omis); copierea unui tabel dintr-o baz distant ntr-o baz distant. COPY {FROM username[ /password]@ database_specification| TO username[ /password]@ database_specification} {APPEND | CREATE | INSERT | REPLACE} destination_table [(column, column, ...)] USING query database_specification reprezint un ir de conectare SQL*Net; APPEND insereaz liniile ntoarse de query n destination_table dac acesta exist; n caz contrar, creeaz n prealabil tabelul; CREATE insereaz liniile ntoarse de query n destination_table, dupa ce creeaz tabelul; daca acesta deja exist, COPY returneaz o eroare; INSERT insereaz liniile ntoarse de query n destination_table; dac tabelul nu exist COPY returneaz o eroare; cnd se folosete opiunea INSERT, clauza USING query trebuie s selecteze cte o coloan pentru fiecare coloan din destination_table; REPLACE nlocuiete destination_table i coninutul su cu liniile ntoarse de query; dac destination_table nu exist, atunci COPY creaz tabelul; altfel, COPY terge mai nti tabelul existent i l nlocuiete cu un tabel ce conine datele copiate. Exemplu:

14

S se nlocuiasc coninutul tabelului produse cu informaii ce provin dintr-o baz de date distant (biblioteca). Aceste informaii se refer la crile de informatic din tabelul carte. COPY FROM vasile/ana@biblioteca REPLACE produse USING SELECT * FROM carte WHERE coded = I; Exemplu: S se creeze un fiier care tiprete codul crilor mprumutate i codul cititorilor care au mprumutat aceste cri, la o dat ce aparine unui interval specificat. S se concateneze cele dou coduri astfel nct s apar separate prin virgul i avnd numele informatii. Soluie: SET ECHO OFF FEEDBACK OFF ACCEPT low_date DATE FORMAT MM/DD/YY PROMPT dati limita inferioara a datei: ACCEPT high_date DATE FORMAT MM/DD/YY PROMPT dati limita superioara a datei: COLUMN informatii FORMAT A25 SELECT codel || , || codec informatii, dataim FROM imprumuta WHERE dataim BETWEEN TO_DATE(&low_date, MM/DD/YY) AND TO_DATE(&high_date, MM/DD/YY) / UNDEFINE low_date UNDEFINE high_date CLEAR COLUMNS SET ECHO ON SET FEEDBACK ON

15

Exemplu: S se creeze un fiier care tiprete un raport grupat pe autori, coninnd: numele autorului, titlul crilor sale din bibliotec, domeniul fiecrei cri i valoarea total a fiecrei cri. Aceste rezultate sunt obinute pentru crile din bibliotec care sunt ntr-un numr de exemplare specificat. Rezultatele s apar sub forma: NUME AUTOR Oprean TITLU CARTE Grupuri Inele DOMENIU CARTE Algebra Algebra VALOARE TOTALA 55,000 63,768

Soluie: SET ECHO OFF FEEDBACK OFF ACCEPT num PROMPT Dati numarul de exemplare: COLUMN autor HEADING NUME|AUTOR FORMAT A15 COLUMN titlu HEADING TITLU|CARTE FORMAT A15 COLUMN intdom HEADING DOMENIU|CARTE FORMAT A15 COLUMN val HEADING VALOARE|TOTALA FORMAT $99,999 BREAK ON autor SELECT autor, titlu, intdom, pret*nrex val FROM carte c, domeniu d WHERE c.coded = d.coded AND nrex = &num ORDER BY autor / UNDEFINE num SET ECHO ON FEEDBACK ON CLEAR BREAKS CLEAR COLUMNS

16

Exemplu: S se creeze un script la a crui rulare s apar urmtorul raport:


CONTRACTELE SUBANTREPRENORULUI CONSTRUCT SA LA DATA DE 14/10/2001 NUMAR VALOARE NUME CONTRACT CONTRACT ------------------------------------- --------------CONSTRUCT SA 100 50000 101 120000 ******************** --------VALOAREA MAXIMA 120000 TOTAL 170000 Pagina 1 CONTRACTELE SUBANTREPRENORULUI ERBASU SA LA DATA DE 14/10/2001 NUMAR VALOARE NUME CONTRACT CONTRACT --------------------------------------------ERBASU SA 107 20000 108 300000 109 750000 ******************** --------VALOAREA MAXIMA 750000 TOTAL 1070000 Pagina 2 CONTRACTELE SUBANTREPRENORULUI GAUDI LA DATA DE 14/10/2001 NUMAR VALOARE

17

NUME ----------GAUDI ******************** VALOAREA MAXIMA TOTAL Pagina 3

CONTRACT --------------104 105 106

CONTRACT ---------------500000 27000 10000 --------500000 537000

Soluie: SET ECHO OFF FEEDBACK OFF COLUMN cod NOPRINT COLUMN name NEW_VALUE nv_name HEADING 'NUME' COLUMN nrct FORMAT A8 HEADING 'NUMAR|CONTRACT' COLUMN val HEADING 'VALOARE|CONTRACT' COLUMN azi NOPRINT NEW_VALUE nv_azi TTITLE SKIP 1 LEFT 'CONTRACTELE SUBANTREPRENORULUI'nv_name SKIP 1 LEFT 'LA DATA DE 'nv_azi SKIP 2 BTITLE SKIP 1 LEFT 'Pagina:' FORMAT 99 SQL.PNO COMPUTE MAX LABEL 'VALOAREA MAXIMA' SUM LABEL 'TOTAL' OF val ON name BREAK ON name SKIP PAGE ON name SELECT ct.cod_contractant cod,sub.nume name, ct.nr_contract nrct, ct.val_investitie val, TO_CHAR(SYSDATE,'DD/MM/YYYY') azi FROM contract ct, subantreprenor sub WHERE ct.cod_contractant = sub.cod_contractant AND ct.tip_contract = 1 ORDER BY cod / SET ECHO ON FEEDBACK ON CLEAR BREAKS CLEAR COLUMNS CLEAR COMPUTES

18

Exemplu: Presupunem c tabelul carte conine un cmp suplimentar numit tip, prin care se specific tipul unei cri. Acest tip poate fi: roman, poezie, monografie, culegere sau diverse. S se genereze un raport care s conin pentru fiecare autor: numrul exemplarelor de fiecare tip scrise de acesta i numrul total de exemplare. De asemenea, s se obin n finalul raportului, numrul exemplarelor de fiecare tip din bibliotec. Soluie: SET ECHO OFF FEEDBACK OFF COLUMN autor FORMAT A12 HEADING Nume|autor COLUMN roman FORMAT 99999 HEADING Roman COLUMN poezie FORMAT 99999 HEADING Poezie COLUMN monografie FORMAT 99999 HEADING Monografie COLUMN culegere FORMAT 99999 HEADING Culegere COLUMN diverse FORMAT 99999 HEADING Diverse COLUMN total FORMAT 99999 HEADING Total BREAK ON REPORT SKIP 2 COMPUTE SUM OF roman ON REPORT COMPUTE SUM OF poezie ON REPORT COMPUTE SUM OF monografie ON REPORT COMPUTE SUM OF culegere ON REPORT COMPUTE SUM OF diverse ON REPORT COMPUTE SUM OF total ON REPORT TTITLE CENTER Raport carte SELECT autor, SUM(DECODE(tip,roman,nrex,0)) roman, SUM(DECODE(tip,poezie,nrex,0)) poezie, SUM(DECODE(tip,monografie,nrex,0))monografie, SUM(DECODE(tip,culegere,nrex,0))culegere,

19

SUM(DECODE(tip,diverse,nrex,0)) diverse, SUM(nrex) total FROM carte GROUP BY autor / CLEAR BREAKS CLEAR COLUMNS CLEAR COMPUTES SET ECHO ON FEEDBACK ON Exemplu: S se genereze un raport prin care s se obin pentru fiecare domeniu de carte informaii despre numele domeniului, titlurile crilor din domeniu, numrul de exemplare din fiecare carte i din fiecare domeniu, iar n final raportul s conin i numrul total de cri din bibliotec. Soluie: SET ECHO OFF FEEDBACK OFF COLUMN intdom FORMAT A25 HEADING denumire|domeniu COLUMN titlu FORMAT A30 HEADING titlu|carte COLUMN nrex FORMAT 99999 HEADING numar|carti BREAK ON intdom SKIP 2 ON REPORT SKIP 1 COMPUTE SUM OF nrex ON intdom COMPUTE SUM OF nrex ON REPORT TTITLE CENTER Raport carti SKIP 1 LINE SELECT intdom, titlu, nrex FROM carte c, domeniu d WHERE c.coded = d.coded ORDER BY intdom / COLUMN denumire CLEAR COLUMN titlu CLEAR COLUMN nrex CLEAR CLEAR BREAKS CLEAR COMPUTES SET ECHO ON FEEDBACK ON Observatii

20

In iSQL*Plus, se actioneaza butonul Execute pentru executarea comenzilor din fereastra de editare. Implicit, capul de tabel este centrat si afisat cu litere majuscule. Pentru a accesa iSQL*Plus este necesara adresa URL. Aceasta cere un host name (este dat de instructor). Valoarea null este diferita de zero (care este un numar) sau de spatiu (care este un caracter). Pentru a crea si asigna o valoare unei variabile se poate utiliza comanda DEFINE, iar stergerea acesteia se face prin comanda UNDEFINE. SET VERIFY ON forteaza iSQL*Plus sa tipareasca textul unei comenzi inainte si dupa substituirea variabilelor de substitutie cu valori.

SQL
Structured Query Language (SQL) este un limbaj universal care poate fi utilizat pentru a defini, interoga, reactualiza i gestiona baze de date relaionale. SQL este accesibil utilizatorilor nceptori, dar n acelai timp poate oferi programatorilor experimentai faciliti deosebite. SQL este un limbaj nonprocedural, adic se specific ce informaie este solicitat, dar nu modul cum se obine aceast informaie. SQL poate fi utilizat autonom sau prin inserarea comenzilor sale ntr-un limbaj de programare. SQL a sistemului Oracle este o extensie a normei SQL89 i o implementare a normei SQL92. n SQL se disting trei familii de comenzi: Comenzi pentru definirea datelor, care permit descrierea (definirea) structurii obiectelor ce modeleaz sistemul studiat. Aceste comenzi definesc limbajul de definire a datelor (LDD). Comenzi pentru prelucrarea datelor, ce permit consultarea, reactualizarea, suprimarea sau inserarea datelor. Aceste comenzi definesc limbajul de prelucrare a datelor (LMD). Comenzi pentru controlul datelor, care permit asigurarea confidenialitii i integritii datelor, salvarea informaiei, realizarea fizic a modificrilor n baza de date, rezolvarea unor probleme de concuren. Aceste comenzi definesc limbajul de control al datelor (LCD).

21

Sistemul impune anumite restricii asupra identificatorilor. Numele unui obiect nu poate depi 30 de caractere, cu excepia numelui bazei de date care este limitat la 8 caractere i a numelui legturii unei baze care poate ajunge la 128 caractere. Nu se face distincie ntre litere mici i litere mari. Numele trebuie s nceap printr-un caracter alfabetic i nu poate fi un cuvnt cheie rezervat; poate s conin literele mari i mici ale alfabetului englez, cifrele 0 - 9 i caracterele $, _, #. Un utilizator nu trebuie s defineasc dou obiecte cu acelai nume. n general este bine ca numele unui obiect s fie descriptiv i fr prescurtri excesive.

Limbajul de definire a datelor


La nivel logic, o baz de date Oracle este alctuit din scheme. O schem este o mulime de structuri logice de date, numite obiecte. Ea aparine unui utilizator al bazei de date i poart numele su. Specificarea bazelor de date i a obiectelor care le compun se realizeaz prin intermediul limbajului de definire a datelor (LDD). Definirea unui obiect presupune crearea, modificarea i suprimarea sa. Limbajul de definire a datelor cuprinde instruciunile SQL care permit realizarea acestor operaii (CREATE, ALTER, DROP). Instruciunile LDD au efect imediat asupra bazei de date i nregistreaz informaia n dicionarul datelor. De asemenea, LDD contine instructiunile RENAME, TRUNCATE si COMMENT. n cadrul unei scheme se pot defini obiecte de tip: tabel ( table), vizualizare (view), vizualizare materializat (materialized view), secven (sequence), index (index), sinonim (synonym), grupare (cluster), procedur (procedure) i funcie (function) stocat, declanator (trigger), pachet stocat (package), legtur a bazei de date (database link), dimensiune (dimension) etc.

Tipuri de date
Pentru memorarea datelor numerice, tipurile cele mai frecvent folosite sunt: NUMBER, INTEGER, FLOAT, DECIMAL. Pentru memorarea irurilor de caractere, cele mai frecvent tipuri de date utilizate sunt: CHAR, VARCHAR2 i LONG. Exist restricii referitoare la folosirea tipului de date LONG.

22

ntr-un tabel poate s fie o singur coloan de tip LONG. Nu pot fi comparate dou iruri de caractere de tip LONG. O coloan de tip LONG nu poate fi parametru ntr-o procedur. O funcie nu poate ntoarce ca rezultat o valoare de tip LONG. O coloan de tip LONG nu poate fi folosit n clauzele WHERE, ORDER BY, GROUP BY, CONNECT. Operatorii sau funciile Oracle nu pot fi folosii n SQL pentru a modifica coloane de tip LONG. O coloan de tip LONG nu poate fi indexat. Alte tipuri de date scalare furnizate de SQL sunt NCHAR i NVARCHAR2, folosite pentru reprezentarea caracterelor limbilor naionale. Informaii relative la timp sau dat calendaristic se obin utiliznd tipul DATE. Pentru fiecare dat de tip DATE sunt depuse: secolul, anul, luna, ziua, ora, minutul, secunda. Pentru o coloan de tip DATE sistemul rezerv 7 bytes, indiferent dac se memoreaz doar timpul, sau doar data calendaristic. Formatul implicit al datei se definete cu ajutorul parametrului de iniializare NLS_DATE_FORMAT. n general, acest parametru este setat la forma DD-MONYY. Dac nu este specificat timpul, timpul implicit este 12:00:00. n Oracle8, alturi de aceste tipuri scalare, au fost introduse tipurile de date LOB (Large Objects), care specific locaia unor obiecte de dimensiuni mari. Oracle9i introduce noi tipuri de date pentru timp: TIMESTAMP (precizie_fraciuni_secund) cuprinde valori pentru anul, luna i ziua unei date calendaristice, dar i valori pentru or, minut, secund INTERVAL YEAR (precizie_an) TO MONTH stocheaz o perioad de timp specificat n ani i luni, unde precizie_an reprezint numrul de cifre din cmpul YEAR. INTERVAL DAY (precizie_zi) TO SECOND (prec_fraciuni_sec) stocheaz o perioad de timp reprezentat n zile, ore, minute i secunde. Exemplu: S se creeze un tabel cu trei coloane, inceput, durata_1, durata_2. Coloana inceput va cuprinde valori ce reprezint momente de timp, inclusiv fraciunile de secund corespunztoare. Valorile coloanei durata_1 vor fi intervale de timp specificate n numr de zile, ore, minute i secunde. Coloana durata_3 va conine

23

intervale de timp precizate n numr de ani i luni. S se insereze o nregistrare n acest tabel. CREATE TABLE timp( inceput TIMESTAMP, durata_1 INTERVAL DAY(2) TO SECOND(3), durata_2 INTERVAL YEAR TO MONTH); INSERT INTO timp VALUES (TIMESTAMP '1997-01-31 09:26:50.124', INTERVAL '23 7:44:22' DAY TO SECOND, INTERVAL '19-02' YEAR TO MONTH); INTERVAL YEAR TO MONTH INTERVAL '123' YEAR(3) INTERVAL '30' MONTH(2) INTERVAL '123' YEAR

un interval de 123 ani un interval de 30 luni eroare, deoarece implicit precizia este 2, iar 123 are 3 digiti

INTERVAL DAY TO SECOND INTERVAL '180' DAY(3) un interval de 180 zile INTERVAL '4 5:12' DAY TO MINUTE un interval de 4 zile, 5 ore si 12 minute INTERVAL '400 5' DAY(3) TO HOUR un interval de 400 zile si 5 ore Exemplu CREATE TABLE (durata

exemplu INTERVAL YEAR(3) TO MONTH);

INSERT INTO exemplu VALUES (INTERVAL '120' MONTH(3)); SELECT FROM TO_CHAR(SYSDATE+durata, 'DD-mon-YYYY') exemplu;

Exemplu CREATE TABLE noi_carti (codel NUMBER,

24

start_data TIMESTAMP); SELECT FROM start_data noi_carti;

Pentru informatii de tip TIMESTAMP, numarul maxim de digiti pentru fractiuni de secunda este 9, implicit este 6. Rezultatele cererii: 15-JUN-03 12.00.00.000000 AM 23-SEP-03 12.00.00.000000 AM Pentru informatii de tip DATE, formatul implicit ar fi fost DD-MON-RR
Cmp
YEAR MONTH DAY HOUR MINUTE SECOND

Valori valide pentru date calendaristice De la -4712 la 9999 (cu excepia anului 0). De la 01 la 12. De la 01 la 31 (limitat de valorile cmpurilor MONTH i YEAR, corespunztor regulilor calendarului curent). De la 00 la 23. De la 00 la 59. De la 00 la 59.9(n), unde 9(n) este precizia fraciunilor de secund. De la 12 la 13 (prevede schimbrile datorate trecerilor la ora de var sau iarn). De la 00 la 59.

Valori valide pentru intervale Orice valoare ntreag. De la 0 la 11. Orice valoare ntreag. De la 0 la 23. De la 0 la 59. De la 0 la 59.9(n), unde 9(n) este precizia fraciunilor de secund. Nu se aplic. Nu se aplic.

TIMEZONE_HOUR
TIMEZONE_MINUTE

Sistemul Oracle permite construcia de expresii folosind valori de tip dat calendaristic i interval. Operaiile care pot fi utilizate n aceste expresii i tipul rezultatelor obinute sunt urmtoarele: Data + Interval, Data Interval, Interval + Data, iar rezultatul este de tip dat calendaristic; Data Data, Interval + Interval, Interval Interval, Interval * Number, Number * Interval, Interval / Number, iar rezultatul este de tip interval.

25

Modele de format
Un model de format este un literal caracter care descrie formatul valorilor de tip DATE sau NUMBER stocate ntr-un ir de caractere. Atunci cnd se convertete un ir de caractere ntr-o dat calendaristic sau ntr-un numr, modelul de format indic sistemului cum s interpreteze irul respectiv. n instruciunile SQL se poate folosi un model de format ca argument al funciilor TO_CHAR i TO_DATE. n felul acesta se poate specifica formatul folosit de sistemul Oracle pentru a returna sau a stoca o valoare n/din baza de date. Un model de format nu schimb reprezentarea intern a valorii n baza de date. O parte dintre elementele cel mai frecvent ntlnite ale unui format de tip numeric sunt sintetizate n tabelul urmtor.
Element , (virgul) . (punct) $ 0 9 C D EEEE L MI S Exemplu 9,999 99.99 $9999 0999; 9990 9999 C999 99D99 9.9EEEE L999 9999MI S9999; 9999S Descriere Plaseaz o virgul n poziia specificat. ntr-un model de format numeric pot fi precizate mai multe virgule, dar o virgul nu poate aprea n partea dreapt a punctului zecimal. Plaseaz un punct zecimal n poziia specificat. ntr-un format numeric, se poate specifica cel mult un punct zecimal. Include semnul $ n faa unei valori. Plaseaz zerouri n faa sau la sfritul valorii. ntoarce valoarea cu numrul specificat de cifre. Valoarea va avea un spaiu, respectiv un minus n fa dac este pozitiv, respectiv negativ. Plaseaz n poziia specificat simbolul ISO pentru monede (valoarea curent a parametrului NLS_ISO_CURRENCY). Plaseaz n poziia specificat caracterul zecimal, care este valoarea curent a parametrului NLS_NUMERIC_CHARACTER. Valoarea implicit este punctul. Se poate specifica cel mult un caracter zecimal ntr-un model de format numeric. Returneaz o valoare folosind notaia tiinific. ntoarce n poziia specificat simbolul monedei locale (valoarea curent a parametrului NLS_CURRENCY). Plaseaz semnul minus la sfritul valorilor negative i un spaiu la sfritul celor pozitive. Acest element poate fi specificat numai pe ultima poziie a modelului de format numeric. Plaseaz semnele plus sau minus la nceputul sau la sfritul valorii. Acest element poate aprea doar pe prima sau ultima poziie a modelului de format numeric.

Modelele de format pentru date calendaristice pot fi utilizate n cadrul urmtoarelor funcii: TO_DATE, pentru a converti o valoare de tip caracter, care este ntr-un alt

26

format dect cel implicit, ntr-o valoare de tip DATE; TO_CHAR, pentru a converti o valoare de tip DATE, care este ntr-un alt format dect cel implicit, ntr-un ir de caractere. Un model de format pentru date calendaristice este alctuit dintr-unul sau mai multe elemente specifice. Scrierea cu litere mari sau mici a cuvintelor, abrevierilor sau a numeralelor romane este respectat n elementul de format corespunztor. De exemplu, modelul de format DAY produce cuvinte cu majuscule, cum ar fi FRIDAY, iar Day i day au ca rezultat Friday, respectiv friday. ntr-un model de format pentru date calendaristice se pot preciza semne de punctuaie i literale caracter, incluse ntre ghilimele. Toate aceste caractere apar n valoarea returnat pe locul specificat n modelul de format.
Element AD sau A.D. BC sau B.C. D DAY DD DDD DY FF HH sau HH12 HH24 MI MM MON MONTH RM RR RRRR SS SSSSS TZH TZM Y,YYY YEAR sau SYEAR YYYY sau SYYYY YYY, YY sau Y Explicaie Indicatorul AD (Anno Domini) cu sau fr puncte. Indicatorul BC (Before Christ) cu sau fr puncte. Numrul zilei din sptmn (1-7). Duminica este considerat prima zi a sptmnii. Numele zilei completat cu spaii, pn la lungimea de 9 caractere. Numrul zilei din lun (1-31). Numrul zilei din an (1-366). Numele zilei din sptmn, printr-o abreviere de 3 litere. Fraciunile de secund. Ora din zi (1-12). Ora din zi (0-23). Minutele din or (0-59). Luna din an (01-12). Numele lunii, printr-o abreviere de 3 litere. Numele lunii completat cu spaii, pn la lungimea de 9 litere. Luna n cifre romane (I-XII). Anul cel mai apropiat de data curent. Accept intrarea att cu 2, ct i cu 4 cifre. Dac anul de intrare se d cu 2 cifre, furnizeaz acelai lucru ca i formatul RR. Secundele din minut (0-59). Secundele trecute de la miezul noptii (0-86399). Ora regiunii. Minutul regiunii. Anul scris cu virgul dup prima cifr. Anul n litere (S prefixeaz anii i.Hr. cu semnul minus). Anul cu 4 cifre. Ultimele cifre ale anului.

Modificatorii FM i FX pot fi utilizai n modelele de format din cadrul

27

funciei TO_CHAR, controlnd completarea cu spaii i verificarea exact a formatelor. Un modificator poate s apar ntr-un model de format de mai multe ori. n acest caz, efectele sale sunt active pentru poriunea din model care ncepe la prima apariie i apoi dezactivate pentru poriunea din model care urmeaz celei dea doua apariii .a.m.d. Modificatorul FM (Fill Mode) suprim completarea cu spaii n valoarea returnat de funcia TO_CHAR, iar FX (Format eXact) impune corespondena exact dintre argumentul de tip caracter i modelul de format precizat pentru data calendaristic respectiv. Valoarea null, reprezentnd lipsa datelor, nu este egal sau diferit de nici o alt valoare, inclusiv null. Totui, exist dou situaii n care sistemul Oracle consider dou valori null ca fiind egale: la evaluarea funciei DECODE i dac valorile null apar n chei compuse. Dou chei compuse care conin valori null sunt considerate identice dac toate componentele diferite de null sunt egale.

Pseudocoloane
O pseudocoloan se comport ca i o coloan a unui tabel, dar nu este stocat efectiv ntr-un tabel. Se pot face interogri asupra pseudocoloanelor, dar nu se pot insera, actualiza sau terge valorile acestora. LEVEL returneaz nivelul liniilor rezultat ale unei cereri ierarhice. CURRVAL i NEXTVAL sunt pseudocoloane utile n lucrul cu secvene i sunt tratate n seciunea corespunztoare acestora. ROWID returneaz adresa unei linii din baza de date, furniznd modul cel mai rapid de a accesa linia respectiv. n sistemul Oracle, valorile acestei pseudocoloane conin urmtoarele informaii necesare pentru a localiza o linie: numrul obiectului, blocul de date, fiierul de date, linia n cadrul blocului de date. Valorile pseudocoloanei ROWID sunt de tipul ROWID sau UROWID. ROWNUM returneaz numrul de ordine al liniilor rezultate n urma execuiei unei cereri. Pseudocoloana poate fi utilizat pentru a limita numrul de linii returnate. Dac este folosit clauza ORDER BY ntr-o subcerere, iar condiia n care apare ROWNUM este plasat n cererea de nivel superior, atunci condiia va fi aplicat dup ordonarea liniilor. Exemplu: S se afieze informaii despre operele de art avnd cele mai mici 10 coduri. SELECT *

28

FROM WHERE

(SELECT * FROM opera ORDER BY cod_opera) ROWNUM < 11;

Tabele
Crearea unui tabel
Crearea unui tabel const din generarea structurii sale, adic atribuirea unui nume tabelului i definirea caracteristicelor sale (se definesc coloanele, se definesc constrngerile de integritate, se specific parametrii de stocare etc.). n Oracle9i tabelele pot fi create n orice moment, chiar i n timpul utilizrii bazei. Structura unui tabel poate fi modificat online. Nu este necesar s se specifice dimensiunea acestuia. Totui, din considerente administrative, este important s se cunoasc estimativ ct spaiu va utiliza tabelul. Comanda CREATE TABLE permite crearea unui tabel relaional sau a unui tabel obiect. Tabelul relaional reprezint structura fundamental pentru stocarea datelor utilizatorului. Un tabel obiect utilizeaz un tip obiect pentru definiia unei singure coloane i este folosit pentru a stoca instanele unui obiect particular. Pentru a crea un tabel, utilizatorul trebuie s aib acest privilegiu i s dispun de spaiul de memorie n care s creeze obiectul. La nivelul schemei sale, un utilizator are toate privilegiile. CREATE TABLE [<nume_schema>.] <nume_tabel> ( <nume_coloana_1> <tip_date> [DEFAULT <expresie>], <nume_coloana_n> <tip_date> [DEFAULT <expresie>]) [CLUSTER <nume_cluster> (<coloana_1>,, <coloana_m>)] [ENABLE | DISABLE <clause>]; Comanda poate conine opional clauza TABLESPACE, care specific spaiul tabel n care va fi stocat tabelul. De asemenea, poate conine opional clauza STORAGE care este folosit pentru setarea parametrilor de stocare prin intermediul crora se specific mrimea i modul de alocare a extinderilor segmentului tabel. La crearea unui tabel nu este nevoie s se specifice dimensiunea maxim a acestuia, ea fiind determinat pn la urm de marimea spaiului alocat spaiului tabel n care este creat tabelul. Structura unui tabel poate fi creat n urmtoarele patru moduri: fr a indica cheile; indicnd cheile la nivel de coloan;

29

indicnd cheile la nivel de tabel; prin copiere din alt tabel. 1. Crearea structurii unui tabel fr a indica cheile: CREATE TABLE carte (codel CHAR(5), titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coded CHAR(5)); 2. Crearea structurii unui tabel indicnd cheile la nivel coloan: CREATE TABLE carte (codel CHAR(5) PRIMARY KEY, titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coded CHAR(5) NOT NULL REFERENCES domeniu(coded)); Constrngerea de cheie primar sau extern ce presupune? CREATE TABLE carte (codel CHAR(5) PRIMARY KEY, titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coded CHAR(5) NOT NULL REFERENCES domeniu(coded) ON DELETE CASCADE); Opiunea ON DELETE CASCADE specific c suprimarea oricrui domeniu de carte din tabelul domeniu este autorizat i implic suprimarea automat a tuturor crilor din domeniul respectiv care se gsesc n tabelul carte. 3. Crearea structurii unui tabel indicnd cheile la nivel de tabel: CREATE TABLE carte

30

(codel CHAR(5), titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coded CHAR(5) NOT NULL, PRIMARY KEY (codel), FOREIGN KEY (coded) REFERENCES domeniu (coded)); Dac cheia primar are mai mult de o coloan atunci cheile trebuie indicate la nivel de tabel. CREATE TABLE imprumuta (codel CHAR(5), codec CHAR(5), dataim DATE DEFAULT SYSDATE, datares DATE, dataef DATE, PRIMARY KEY (codel, codec, dataim), FOREIGN KEY (codel) REFERENCES carte(codel), FOREIGN KEY (codec) REFERENCES cititor(codec)); 4. Crearea structurii unui tabel prin copiere din alt tabel: CREATE TABLE carte_info AS SELECT codel, titlu, autor FROM carte WHERE coded = I; Constrngerile din primul tabel nu se pstreaz i pentru al doilea tabel. Comanda creeaz un tabel, dar i insereaz date n tabel.

Constrngeri
Constrngerea este un mecanism care asigur c valorile unei coloane sau a unei mulimi de coloane satisfac o condiie declarat. Unei constrgeri i se poate da un nume unic. Dac nu se specific un nume explicit atunci sistemul automat i atribuie un nume de forma SYS_Cn, unde n reprezint numrul constrngerii. Constrngerile pot fi terse, pot fi adugate, pot fi activate sau dezactivate, dar nu pot fi modificate.

31

Exemplu: S se defineasc o constrngere la nivel de coloan prin care s se specifice cheia primar i cheia extern. CREATE TABLE carte (codel CHAR(5) CONSTRAINT cp_carte PRIMARY KEY, titlu VARCHAR2(30), coded CHAR(5) CONSTRAINT nn_coded NOT NULL CONSTRAINT ce_coded REFERENCES domeniu(coded)); Exemplu: S se defineasc o constrngere la nivel de tabel prin care s se specifice cheia primar i cheia extern. CREATE TABLE carte (codel CHAR(5), titlu VARCHAR2(30), coded CHAR(5) NOT NULL, CONSTRAINT cp_carte PRIMARY KEY (codel), CONSTRAINT ce_coded FOREIGN KEY (coded) REFERENCES domeniu(coded)); Observaii Liniile ce nu respect constngerea sunt depuse automat ntr-un tabel special. Constrngerile previn tergerea unui tabel dac exist dependene. Constrngerile pot fi create o dat cu tabelul sau dup ce acesta a fost creat. Constrngerile pot fi activate sau dezactivate n funcie de necesiti.

Constrngeri declarative: constrngeri de domeniu, constrngerea de integritate a entitii, constrngerea de integritate referenial. Constrngerile de domeniu definesc valori luate de un atribut (DEFAULT, CHECK, UNIQUE, NOT NULL). constrngerea (coloan) DEFAULT ;

32

constrngerea (coloan sau tabel) CHECK ; constrngerea CHECK la nivel de tabel poate compara coloane ntre ele, poate face referin la una sau mai multe coloane, dar nu poate conine subcereri. Constrngerea la nivel de coloan nu poate referi alte coloane ale aceluiai tabel. CREATE TABLE carte (codel CHAR(5), pret NUMBER(8,2) CONSTRAINT alfa CHECK (pret < nrex),); La execuia acestei comenzi apare mesajul: ORA 02438: Column check constraint cannot reference other columns. Dac dupa NUMBER(8, 2) se adaug o virgul, atunci constrngerea va fi la nivel de tabel, iar n aceste caz este permis referirea altei coloane. constrngerea (coloan sau tabel) UNIQUE ; constrngerea declarativ NOT NULL poate fi doar la nivel coloan. Constrngerea de integritate a entitii precizeaz cheia primar a unui tabel. Cnd se creeaz cheia primar se genereaz automat un index unic. Valorile cheii primare sunt distincte i diferite de valoarea null. Constrngerea de integritate referenial asigur coerena ntre cheile primare i cheile externe corespunztoare. Cnd este definit o cheie extern sistemul Oracle verific: dac a fost definit o cheie primar pentru tabelul referit de cheia extern; dac numrul coloanelor ce compun cheia extern corespunde numrului de coloane a cheii primare; dac tipul i lungimea fiecrei coloane a cheii externe corespunde cu tipul i lungimea fiecrei coloane a cheii primare.

Aceast constrngere poate fi definit la nivel de coloan sau tabel i asigur coerena ntre cheile primare i cheile externe corespunztoare. Constrngerea FOREIGN KEY desemneaz o coloan sau o combinaie de coloane drept cheie extern i stabilete relaia cu o cheie primar sau o cheie unic din acelai tabel sau din altul. O cheie extern compus poate fi definit doar la nivel de tabel. Cheia extern se definete n tabelul copil, iar tabelul care conine coloana referit reprezint tabelul printe. Valoarea unei chei externe trebuie s fie egal

33

cu o valoare existent n tabelul printe sau s fie null. Cheile externe se bazeaz pe valorile datelor i sunt pointer-i logici. Cheile externe se definesc folosind urmtoarele cuvinte cheie: FOREIGN KEY este utilizat ntr-o constrngere la nivel de tabel pentru a defini coloana din tabelul copil; REFERENCES identific tabelul printe i coloana corespunztoare din acest tabel; ON DELETE CASCADE determin ca, odat cu tergerea unei linii din tabelul printe, s fie terse i liniile dependente din tabelul copil; ON DELETE SET NULL determin modificarea automat a valorilor cheii externe la valoarea null, atunci cnd se terge valoarea printe. Definiiile i numele constrngerilor definite se pot fi consulta prin interogarea vizualizrilor USER_CONSTRAINTS i ALL_CONSTRAINTS din dicionarul datelor. n versiunea Oracle8 exist posibilitatea ca o constrngere s fie amnat (DEFERRABLE). n acest caz, mai multe comenzi SQL pot fi executate fr a se verifica restricia, aceasta fiind verificat numai la sfritul tranzaciei, atunci cnd este executat comanda COMMIT. Dac vreuna din comenzile tranzaciei ncalc restricia, atunci ntreaga tranzacie este derulat napoi i este returnat o eroare. Opiunea implicit este NOT DEFERRABLE. O noutate introdus n Oracle8 este posibilitatea de a partiiona tabele, adic de a mpri tabelul n mai multe pri independente, fiecare cu parametri de stocare diferii i cu posibilitatea ca pri diferite ale tabelului s se gseasc pe spaii tabel diferite. Fiecare partiie a tabelului va conine nregistrri care au valoarea cheii ntr-un interval specificat. Partiionarea este transparent pentru utilizatori i aplicaii. Dac o parte a tabelului este inaccesibil, celelalte pri pot fi disponibile pentru reactualizare. De asemenea, se poate bloca accesul la o parte a tabelului n timp ce restul nregistrrilor sunt disponibile. Exemplu: CREATE TABLE carte ( ) PARTITIONED BY RANGE (nrex) ((PARTITION mic VALUES LESS THAN(2) TABLESPACE STORAGE ),

34

PARTITION mediu VALUES LESS THAN (10) TABLESPACE STORAGE ), PARTITION mare VALUES LESS THAN (MAXVALUE) TABLESPACE STORAGE )); Exemplu: S se defineasc tabelul opera_part_dom, crend partiii corespunztoare operelor de art achiziionate nainte de 1980, ntre 1980 i 1989, ntre 1990 i 1999, respectiv dup anul 2000. CREATE TABLE opera_part_dom (
cod_opera tip titlu cod_artist data_crearii data_achizitiei valoare cod_galerie cod_sala material stil dim1 dim2 stare NUMBER, VARCHAR2(15), VARCHAR2(100), NUMBER, DATE, DATE, NUMBER, NUMBER, NUMBER, VARCHAR2(2000), VARCHAR2(100), NUMBER, NUMBER, VARCHAR2(50))

PARTITION BY RANGE (data_achizitiei)


(PARTITION opera_inainte_1980 VALUES LESS THAN (TO_DATE('01-JAN-1980','DD-MON-YYYY')), PARTITION opera_inainte_1990 VALUES LESS THAN (TO_DATE('01-JAN-1990','DD-MON-YYYY')), PARTITION opera_inainte_2000 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')), PARTITION opera_dupa_2000 VALUES LESS THAN (MAXVALUE));

Modificarea structurii unui tabel


Comanda care realizeaz modificarea structurii tabelului (la nivel de coloan sau la nivel de tabel), dar nu modificarea coninutului acestuia, este ALTER TABLE. ALTER TABLE realizeaz modificarea structurii unui tabel nepartiionat sau partiionat, a unei partiii sau subpartiii dintr-un tabel. Pentru tabele obiect sau

35

tabele relaionale coninnd coloane obiect, instruciunea poate fi utilizat pentru a converti tabelul la ultima definiie a tipului referit, dup ce acesta a fost modificat. Comanda nu schimb coninutul tabelului. Comanda ALTER TABLE permite: adugarea (ADD) de coloane, chei (primare sau externe), constrngeri ntr-un tabel existent; modificarea (MODIFY) coloanelor unui tabel; specificarea unei valori implicite pentru o coloan existent; activarea i dezactivarea (ENABLE, DISABLE) unor constrngeri; suprimarea unei coloane; suprimarea (DROP) cheii primare, a cheii externe sau a unor constrngeri. Comanda ALTER TABLE are urmtoarea sintax simplificat: ALTER TABLE [<nume_schema>.] <nume_tabel> [ADD (<nume_coloana> <tip_date>, <constrngere>) | MODIFY (<nume_coloana_1>,, <nume_coloana_n>) | DROP <clauza_drop>,] [ENABLE | DISABLE <clause>]; 1. Pentru a aduga o coloan, o cheie primar, o cheie extern sau o constrngere unui tabel este folosit urmtoarea form: ALTER TABLE nume_tabel ADD (nume_coloana constrangere, nume_coloana constrangere); 2. Pentru a modifica una sau mai multe coloane existente: ALTER TABLE MODIFY nume_tabel (nume_coloana nume_coloana constrangere, constrangere);

3. Pentru a suprima cheia primar sau alte constrngeri sunt utilizate formele: ALTER TABLE nume_tabel DROP PRIMARY KEY; ALTER TABLE nume_tabel DROP CONSTRAINT nume_constrangere; 4. Pentru a activa (ENABLE) sau dezactiva (DISABLE) constrngeri:

36

ALTER TABLE nume_tabel ENABLE nume_constrangere; Observaii Nu se poate specifica poziia unei coloane noi n structura tabelului. O coloan nou devine automat ultima n cadrul structurii tabelului. Modificarea unei coloane presupune schimbarea tipului de date, a dimensiunii sau a valorii implicite a acesteia. O schimbare a valorii implicite afecteaz numai inserrile care succed modificrii. Dimensiunea unei coloane numerice sau de tip caracter poate fi mrit, dar nu poate fi micorat dect dac acea coloan conine numai valori null sau dac tabelul nu conine nici o linie. Tipul de date al unei coloane poate fi modificat doar dac valorile coloanei respective sunt null. Definirea cheii primare sau a cheii externe dup crearea tabelului. CREATE TABLE carte (CODEL char(5), ); ALTER TABLE carte ADD CONSTRAINT cheie_prim PRIMARY KEY (codel); Suprimarea cheii primare. ALTER TABLE carte DROP PRIMARY KEY; Dac exist o CE care refer o CP i dac se ncearc tergerea cheii primare, aceast tergere nu se poate realiza (tabelele sunt legate prin declaraia de cheie extern). tergerea este totui permis dac n comanda ALTER apare opiunea CASCADE, care determin i tergerea cheilor externe ce refer cheia primar. ALTER TABLE domeniu DROP PRIMARY KEY CASCADE; Suprimarea cheii externe. ALTER TABLE carte ADD CONSTRAINT beta FOREIGN KEY (coded) REFERENCES domeniu; ALTER TABLE carte DROP CONSTRAINT beta;

37

Schimbarea cheii primare. Este destul de complicat procesul schimbrii cheii primare fr a afecta modul de proiectare a bazei de date. Schimbarea se face n dou etape: se terge cheia primar i apoi se recreeaz. ALTER TABLE carte ADD (PRIMARY KEY(codel)); ALTER TABLE carte DROP PRIMARY KEY; ALTER TABLE carte ADD PRIMARY KEY(titlu, autor)); Adugarea unei coloane. Aceast coloan iniial va fi null (pentru toate liniile). Nu se poate specifica unde s apar coloana, ea devenind ultima coloan a tabelului. ALTER TABLE carte ADD (rezumat LONG); Pentru suprimarea unei coloane a tabelului este utilizat urmtoarea form: ALTER TABLE nume_tabel DROP (nume_coloan) [CASCADE CONSTRAINTS]; Opiunea DROP a comenzii ALTER TABLE a fost introdus n versiunea Oracle8i. Coloana care este suprimat poate s conin date. O comand ALTER TABLE permite tergerea unei singure coloane. Dup o astfel de operaie, n tabel trebuie s rmn cel puin o coloan. Odat suprimat, o coloan nu poate fi recuperat. Clauza CASCADE CONSTRAINTS permite suprimarea tuturor constrngerilor de integritate referenial care se refer la cheile primare sau unice definite asupra coloanelor terse. De asemenea, prin aceast clauz se suprim i constrngerile multicoloan definite pe baza coloanelor terse. Constrngerile pot fi adugate (ADD CONSTRAINT), terse (DROP CONSTRAINT), activate (ENABLE) sau dezactivate (DISABLE), dar nu pot fi modificate. ALTER TABLE cititor ADD CONSTRAINT cp_cititor PRIMARY KEY (codec) DISABLE; ALTER TABLE cititor ENABLE CONSTRAINT cp_cititor; Prima comand adaug o constrngere, dar nu-i d via. Constrngerea exist, dar server-ul nu o verific. Cnd se activeaz o constrngere, sistemul

38

controleaz toate liniile tabelului i insereaz ntr-un tabel special toate liniile care nu verific constrngerea. Tabelul are urmtoarea structur: (ROW_ID ROWID (OWNER VARCHAR2(30), (TABLE_NAME VARCHAR2(30), (CONSTRAINT VARCHAR2(30)) Din punct de vedere fizic, comanda ALTER TABLE permite schimbarea parametrilor PCTFREE i PCTUSED i a parametrilor din clauza STORAGE. Comanda permite alocarea (ALLOCATE EXTENT) i dealocarea (DEALLOCATE UNUSED) manual a spaiului utilizat de ctre un tabel. Alocarea se face prin adugarea de noi extinderi, iar dealocarea reprezint eliberarea spaiului nefolosit de tabel (care nu a fost folosit niciodat sau a devenit liber datorit tergerii unor linii). Alte opiuni ale comenzii ALTER TABLE, care au aprut ncepnd cu versiunea Oracle8i, sunt SET UNUSED i DROP UNUSED COLUMNS: ALTER TABLE nume_tabel SET UNUSED [ ( ] nume_coloan [ ) ]; ALTER TABLE nume_tabel DROP UNUSED COLUMNS; Opiunea SET UNUSED permite marcarea uneia sau mai multor coloane ca fiind nefolosite, cu scopul de a fi terse atunci cnd necesitile sistemului impun acest lucru. Coloanele nefolosite sunt tratate ca i cum ar fi fost suprimate, dei datele acestora rmn n liniile tabelului. Dup ce o coloan a fost marcat UNUSED, utilizatorul nu mai are acces la aceasta prin intermediul cererilor. n plus, numele i tipurile de date ale coloanelor nefolosite nu vor fi afiate cu comanda DESCRIBE din SQL*Plus. Utilizatorul poate s adauge tabelului o nou coloan avnd acelai nume cu cel al unei coloane nefolosite. DROP UNUSED COLUMNS terge din tabel toate coloanele marcate ca fiind nefolosite. Acest lucru se poate utiliza pentru eliberarea spaiului de pe disc corespunztor coloanelor nefolosite din tabel. Dac tabelul nu conine nici o coloan nefolosit, instruciunea nu ntoarce o eroare i nu are nici un efect. Atunci cnd se elimin o coloan dintr-un tabel folosind opiunea DROP a comenzii ALTER TABLE, vor fi suprimate i coloanele din tabel care sunt marcate cu opiunea SET UNUSED.

39

Suprimarea unui tabel


Pentru tergerea unui tabel este utilizat comanda DROP TABLE: DROP TABLE [nume_schema.]nume_tabel [CASCADE CONSTRAINTS]; Clauza CASCADE CONSTRAINTS permite suprimarea tuturor constrngerilor de integritate referenial corespunztoare cheilor primare i unice din tabelul supus tergerii. Dac se omite aceast clauz i exist constrngeri de integritate referenial, sistemul returneaz o eroare i nu suprim tabelul. Suprimarea unui tabel presupune: suprimarea definiiei sale n dicionarul datelor; suprimarea indecilor asociai; suprimarea privilegiilor conferite n legtur cu tabelul; recuperarea spaiului ocupat de tabel; permanentizarea tranzactiilor in asteptare; invalidarea (dar nu suprimarea) funciilor, procedurilor, vizualizrilor, secventelor, sinonimelor referitoare la tabel. Odat executat, instruciunea DROP TABLE este ireversibil. Ca i n cazul celorlalte instruciuni ale limbajului de definire a datelor, aceast comand nu poate fi anulat (ROLLBACK). Oracle 10g introduce o noua maniera pentru suprimarea unui tabel. Cand se sterge un tabel, baza de date nu elibereaza imediat spatiul asociat tabelului. Ea redenumeste tabelul si acesta este plasat intr-un recycle bin de unde poate fi eventual recuperat ulterior prin comanda FLASBACK TABLE. Exemplu: DROP TABLE exemplu; SELECT INSERT FLASHBACK TABLE exemplu TO BEFORE DROP; In Oracle 10g stergerea unui tabel se poate face simultan cu eliberarea spatiului asociat tabelului, daca este utilizata clauza PURGE in comanda DROP TABLE. Nu este posibil un rollback pe o comanda DROP TABLE cu clauza PURGE. Pentru tergerea ntregului coninut al unui tabel i eliberarea spaiului de memorie ocupat de acesta, sistemul Oracle ofer instruciunea:

40

TRUNCATE TABLE nume_tabel; Fiind o instruciune LDD, aceasta nu poate fi anulat ulterior (printr-o operaie ROLLBACK). Ea reprezint o alternativ a comenzii DELETE din limbajul de prelucrare a datelor. De remarcat c instruciunea DELETE nu elibereaz spaiul de memorie. Comanda TRUNCATE este mai rapid deoarece nu genereaz informaie ROLLBACK i nu activeaz declanatorii asociai operaiei de tergere. Dac tabelul este printele unei constrngeri de integritate referenial, el nu poate fi trunchiat. Pentru a putea fi aplicat instruciunea TRUNCATE, constrngerea trebuie s fie mai nti dezactivat. In DD, informaiile despre tabele se gsesc n vizualizarea USER_TABLES. Dintre cele mai importante coloane ale acesteia, se remarca:
TABLE_NAME TABLESPACE_NAME CLUSTER_NAME PCT_FREE PCT_USED INI_TRANS NITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BACKED_UP NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN TABLE_LOCK PARTITIONED TEMPORARY NESTED Numele tabelului Spaiul tabel n care se afl tabelul Numele cluster-ului din care face parte tabelul Procentul de spaiu pstrat liber n interiorul fiecrui bloc Procentul de spaiu ce poate fi utilizat n fiecare bloc Numrul iniial de tranzacii concurente n interiorul unui bloc Dimensiunea spaiului alocat pentru prima extensie Dimensiunea spaiului alocat pentru urmtoarea extensie Numrul minim de extensii ce se aloc la crearea unui tabel Numrul maxim de extensii ce se aloc la crearea unui tabel Procentul cu care crete dimensiunea unei extensii Y sau N, dup cum tabelului i-a fost fcut o copie de siguran de la ultima modificare Numrul de nregistrri din tabel Numrul de blocuri utilizate de tabel Numrul de blocuri ce nu conin date Spaiul mediu liber din tabel Lungimea medie, n octei, a unei linii ENABLED (activat) sau DISABLED (dezactivat): este activat sau nu blocarea tabelului YES sau NO, indic dac tabelul este partiionat (sau nu) Y sau N, indic dac tabelul este temporar (sau nu) YES sau NO, indic dac tabelul este imbricat (sau nu)

Exemplu: DESCRIBE USER_TABLES SELECT TABLE_NAME, NUM_ROWS, NESTED FROM USER_TABLES;

41

Exemplu: SELECT 'DROP TABLE' || OBJECT_NAME || ';' FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE'; ** Versiunea Oracle9i

introduce urmtoarele funcionaliti:

crearea de tabele externe (ale cror date se afl n afara bazei de date);

crearea de fiiere gestionate de sistemul Oracle (Oracle partiionarea de tip list sau domeniu-list a unui tabel.

Managed Files);

Sintaxa comenzii CREATE TABLE este urmtoarea: CREATE [GLOBAL TEMPORARY] TABLE [schema.]nume_tabel {nume_coloan_1 tip_date [DEFAULT expresie] [constr_coloan_ref] [constr_coloan [constr_coloan] ] | {constr_tabel_sau_view | constr_tabel_ref} } [, {nume_coloan_2} ] [ON COMMIT {DELETE | PRESERVE} ROWS] [proprieti_fizice] [proprieti_tabel];

Tabele temporare
Opiunea GLOBAL TEMPORARY permite crearea unui tabel temporar, al crui scop este de a stoca date specifice unei sesiuni. Aceste date sunt stocate n tabel numai pe durata unei tranzacii sau a ntregii sesiuni. Definiia unui tabel temporar este accesibil tuturor sesiunilor, dar informaiile dintr-un astfel de tabel sunt vizibile numai sesiunii care insereaz linii n acesta. Precizarea opiunii ON COMMIT determin dac datele din tabelul temporar persist pe durata unei tranzacii sau a unei sesiuni. Clauza DELETE ROWS se utilizeaz pentru definirea unui tabel temporar specific unei tranzacii, caz n care sistemul trunchiaz tabelul, tergnd toate liniile acestuia dup fiecare operaie de permanentizare (COMMIT). Clauza PRESERVE ROWS se specific pentru a defini un tabel temporar specific unei sesiuni, caz n care sistemul trunchiaz tabelul la terminarea sesiunii. Exemplu: S se creeze un tabel temporar achizitii_azi. Sesiunea fiecrui angajat care se ocup de achiziii va permite stocarea n acest tabel a achiziiilor sale de la data curent. La sfritul sesiunii, aceste date vor fi terse.

42

CREATE GLOBAL TEMPORARY TABLE achizitii_azi ON COMMIT PRESERVE ROWS AS SELECT * FROM opera WHERE data_achizitiei = SYSDATE;

Tabele externe
n cadrul clauzei proprieti_fizice, cuvntul cheie EXTERNAL i opiunea clauza_tabel_extern permit crearea unui tabel extern. Un astfel de tabel este read-only. Metadatele corespunztoare lui sunt reinute n dicionarul datelor, iar datele sale sunt stocate n afara bazei, n sistemul de fiiere al server-ului. Tabelele externe permit interogarea datelor fr ncrcarea lor prealabil n baz. Nici o operatie LMD nu este permisa asupra acestora, nici un index nu poate fi creat relativ la aceste tabele. Sunt permise doar interogari utilizand SQL, PL/SQL sau Java.

Tabele organizate pe baz de index


Opiunile INDEX i clauza_tabel_org_index, prezente n cadrul clauzei proprieti_fizice, permit crearea unui tabel organizat pe baz de index. Sistemul Oracle va menine liniile acestui tabel (att valorile coloanelor care compun cheia primar, ct i valorile celorlalte coloane) ntr-un index construit pe baza cheii primare. Prin clauza AS se poate specifica o subcerere care determin crearea i popularea unui tabel. Coloanele tabelului vor fi cele precizate n lista SELECT a subcererii. Liniile returnate de subcerere vor fi inserate n tabel la momentul crerii. Crearea unui tabel prin copierea structurii i coninutului dintr-un tabel surs nu pstreaz constrngerile tabelului surs. Exemplu: S se creeze un tabel care conine codurile, titlurile i valorile corespunztoare operelor care au fost expuse n galeria avnd codul 100. CREATE TABLE opere_100 AS SELECT cod_opera, titlu, valoare FROM opera WHERE cod_galerie = 100; Prin clauza_paralelism se poate paraleliza operaia de creare a unui tabel. De asemenea, clauza stabilete gradul implicit de paralelism al interogrilor i instruciunilor LMD ce vor fi efectuate asupra tabelului. Gradul de paralelism al unei operaii este egal cu numrul de fire paralele de execuie ( thread) utilizate

Paralelism

43

pentru realizarea acesteia. Fiecare fir de execuie poate utiliza unul sau dou servere cu execuie paralel. Sintaxa clauzei este urmtoarea: {NOPARALLEL | PARALLEL [nr_ntreg] } Opiunea NOPARALLEL este implicit i determin execuia serial a operaiei de creare, a cererilor i comenzilor de prelucrare. Pentru indicarea unui anumit grad de paralelism, se precizeaz un numr ntreg n clauza PARALLEL. Acest lucru nu este, ns, necesar deoarece sistemul Oracle poate determina gradul optim de paralelism. Utilizarea paralelismului accelereaz crearea tabelului, iar operaiile de interogare i prelucrare asupra acestuia vor fi mai rapide. Exemplu: S se creeze tabelul opere_100 utiliznd un numr optim de server-e cu execuie paralel pentru a scana tabelul opera i a introduce linii n tabelul creat.

Indeci
Un index este un obiect al schemei unei baze de date care: crete viteza de execuie a cererilor; garanteaz c o coloan conine valori unice. Server-ul Oracle utilizeaz identificatorul ROWID pentru regsirea liniilor n structura fizic a bazei de date. Indexul, din punct de vedere logic, este compus dintr-o valoare cheie i din identificatorul adres ROWID. Cheia indexului poate fi coloana unui tabel sau concatenarea mai multor coloane (numrul maxim de coloane care pot defini cheia indexului este 32). Coloanele care apar n cheia indexului trebuie declarate NOT NULL n tabel. Indecii sunt utilizai i ntreinui automat de ctre server-ul Oracle. Odat creat indexul, el nu necesit o aciune direct din partea utilizatorului. Indecii pot fi creai n dou moduri: automat, de server-ul Oracle (PRIMARY KEY, UNIQUE KEY); manual, de ctre utilizator (CREATE INDEX, CREATE TABLE). Server-ul Oracle creeaz automat un index unic atunci cnd se definete o constrngere PRIMARY KEY sau UNIQUE asupra unei coloane sau unui grup de coloane. Numele indexului va fi acelai cu numele constrngerii. Indecii, fiind obiecte ale schemei bazei, beneficiaz de procesul de definire a unui obiect. Crearea unui index (care nu este obligatoriu unic) pe una sau mai multe coloane ale unui tabel se face prin comanda: CREATE [UNIQUE] INDEX <nume_index>

44

ON [<nume_schema>.] <nume_tabel> (<nume_col> [ASC | DESC], <nume_col> [ASC | DESC], ) | CLUSTER <nume_cluster>]; Cnd este creat un index, un segment de date este rezervat automat n spaiul tabel. Alocarea de memorie este controlat prin clauzele INITIAL, PCTINCREASE, PCTFREE, NEXT, care pot s apar n comanda CREATE INDEX. Gestiunea inseriilor i a reactualizrilor se face, ca i la tabele, utiliznd parametrii PCTFREE i PCTUSED. Exemplu: 1) S se creeze un index descresctor relativ la coloana adresa din tabelul cititor. CREATE INDEX cititor_idx ON cititor (adresa DESC); 2) S se afieze informaiile referitoare la indexul cititor_idx. SELECT FROM WHERE TABLE_NAME, UNIQUENESS, MIN_EXTENTS USER_INDEXES INDEX_NAME='cititor_idx';

3) S se creeze un index explicit, referitor la cheia primara a unui tabel. CREATE TABLE exemplu (cod_id NUMBER(6) PRIMARY KEY USING INDEX (CREATE INDEX cod_id_idx ON exemplu (cod_id)), nume VARCHAR2(20)); Mai muli indeci asupra unui tabel nu implic ntotdeuna interogri mai rapide. Fiecare operaie LMD care este permanentizat asupra unui tabel cu indeci asociai presupune actualizarea indecilor respectivi. Prin urmare, este recomandat crearea de indeci numai n anumite situaii: coloana conine o varietate mare de valori; coloana conine un numr mare de valori null; una sau mai multe coloane sunt utilizate frecvent mpreun ntr-o clauz WHERE sau ntr-o condiie de join; tabelul este mare i este de ateptat ca majoritatea interogrilor asupra acestuia s regseasc mai puin de 2-4% din linii. Crearea unui index nu este recomandat n urmtoarele cazuri:

45

tabelul este mic; coloanele nu sunt utilizate des n cadrul unei condiii dintr-o cerere; majoritatea interogrilor regsesc mai mult de 2-4% din liniile tabelului; tabelul este actualizat frecvent; coloanele indexate sunt referite n expresii.

In concluzie, ce tabele sau ce coloane trebuie (sau nu) indexate? indexai tabelele pentru care interogrile selecteaz un numr redus de rnduri (sub 5%); indexai tabelele care sunt interogate folosind clauze SQL simple; nu indexai tabelele ce conin puine nregistrri (accesul secvenial este mai simplu); nu indexai tabelele care sunt frecvent actualizate, deoarece tergerile, inserrile i modificrile sunt ngreunate de indeci; indexai coloanele folosite frecvent n clauza WHERE sau n clauza ORDER BY; nu indexai coloanele ce conin date asemntoare (puine valori distincte); Exemplu: CREATE INDEX upper_nume_idx ON artist (UPPER(nume)); Indexul creat prin instruciunea precedent faciliteaz prelucrarea unor interogri precum: SELECT * FROM artist WHERE UPPER(nume) = 'GRIGORESCU'; Pentru a asigura c server-ul Oracle utilizeaz indexul i nu efectueaz o cutare asupra ntregului tabel, valoarea funciei corespunztoare expresiei indexate trebuie s nu fie null n interogrile ulterioare crerii indexului. Urmtoarea instruciune garanteaz utilizarea indexului dar, n absena clauzei WHERE, serverul Oracle ar putea cerceta ntreg tabelul. SELECT * FROM artist WHERE UPPER(nume) IS NOT NULL ORDER BY UPPER(nume); Exemplu: S se creeze tabelul artist, specificndu-se indexul asociat cheii primare.

46

CREATE TABLE artist ( cod_artist NUMBER PRIMARY KEY USING INDEX (CREATE INDEX artist_cod_idx ON artist(cod_artist)), nume VARCHAR2(30) NOT NULL, prenume VARCHAR2(30), ); tergerea unui index se face prin comanda: DROP INDEX nume_index [ON [nume_schema.] nume_tabel] Pentru a suprima indexul trebuie ca acesta s se gseasc n schema personal sau s ai privilegiul de sistem DROP ANY INDEX. Pentru a reconstrui un index se pot folosi dou metode: se terge indexul (DROP INDEX) i se recreeaz (CREATE INDEX); se utilizeaz comanda ALTER INDEX cu opiunea REBUILD. Modificarea parametrilor de stocare a indecilor (STORAGE), alocarea (ALLOCATE EXTENT) i dealocarea (DEALLOCATE UNUSED) manual a spaiului utilizat de un index se pot realiza cu ajutorul comenzii ALTER INDEX. ncepnd cu Oracle9i, este posibil modificarea structurii indecilor prin comanda ALTER INDEX. Validarea unui index, adic verificarea integritii indexului specificat pentru un tabel, se face prin comanda: VALIDATE INDEX nume_index [ON nume_tabel] [WITH LIST] Oracle8 folosete urmtoarele tipuri de indeci: index de tip arbore B* creat la executarea unei comenzi standard CREATE INDEX; index partiionat folosit n cazul tabelelor mari pentru a stoca valorile coloanei indexate n mai multe segmente; index de cluster bazat pe coloanele comune ale unui cluster; index cu cheie invers sunt B* arbori, dar care stocheaz datele n mod invers; index de tip bitmap nu se stocheaz valorile efective ale coloanei indexate, ci un bitmap format pe baza acestor valori. Versiunea Oracle8 permite construirea de tabele organizate pe baz de index. n acest caz, datele sunt stocate n indexul asociat. Un astfel de tabel poate fi manipulat de ctre aplicaii la fel ca un tabel obinuit, folosind comenzi SQL.

47

Diferena const n faptul c n cazul tabelului organizat pe baz de index, toate operaiile sunt efectuate numai asupra indexului. n loc ca fiecare intrare a indexului s conin valoarea coloanei sau coloanelor indexate i valoarea ROWID (care identific unic un rnd) pentru rndul corespunztor, ea conine ntreg rndul. Coloana sau coloanele dup care se face indexarea sunt cele care constituie cheia primar a tabelului. Informaii referitoare la indeci i la coloanele care i definesc pot fi regsite n vizualizrile USER_INDEXES, respectiv USER_IND_COLUMNS din dicionarul datelor. Dintre coloanele tabelului USER_INDEXES se remarc:
INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABEL_TYPE UNIQUENESS TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BLEVEL LEAF_BLOCKS DISTINCT_KEYS STATUS NUM_ROWS PARTITIONED GENERATED Numele indexului Tipul indexului (NORMAL, LOB, CLUSTER etc.) Proprietarul tabelului indexat Numele tabelului indexat Tipul tabelului indexat (TABLE, CLUSTER etc.) Starea de unicitate (UNIQUE, NONUNIQUE) Spaiul tabel n care este stocat indexul Spaiul alocat pentru prima extensie Spaiul alocat pentru urmtoarea extensie Numrul minim de extensii alocate Numrul maxim de extensii Procentul cu care cresc extensiile Nivelul din B-arbore. Acesta arat adncimea indexului de la ramuri la frunze Numrul de blocuri frunz din index Numrul de chei distincte n index Starea indexului (VALID, INVALID, DIRECT_LOAD) Numrul de linii utilizate. Acesta nu trebuie s includ valorile NULL din tabelul de baz Determin dac indexul este partiionat (YES sau NO) Determin dac sistemul a generat numele indexului (Y) sau utilizatorul (N)

Exemplu: S se obin informaii referitoare la indecii tabelului carte. SELECT a.index_name, a.column_name, a.column_position poz, b.uniqueness FROM user_indexes b, user_ind_columns a WHERE a.index_name = b.index_name AND a.table_name = carte;

Secvene

48

O secven este un obiect n baza de date care servete pentru a genera ntregi unici n sistemele multi-utilizator, evitnd apariia conflictelor i a blocrii. Secvenele sunt memorate i generate indiferent de tabele aceeai secven poate fi utilizat pentru mai multe tabele. O secven poate fi creat de un utilizator i poate fi partajat de mai muli utilizatori. Crearea unei secvene se face cu ajutorul comenzii: CREATE SEQUENCE [<nume_schema>.]<nume_secventa> [INCREMENT BY n] [START WITH m] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CACHE k | NOCACHE}] CACHE k | NOCACHE specific numrul de valori alocate de server-ul Oracle pe care le va pstra n memoria cache pentru a oferi utilizatorilor un acces rapid (implicit sunt alocate 20 de valori); O secven este referit ntr-o comand SQL cu ajutorul pseudo-coloanelor: NEXTVAL refer valoarea urmtoare a secvenei; CURRVAL refer valoarea curent a secvenei.

NEXTVAL i CURRVAL pot fi folosite n: clauza VALUES a unei comenzi INSERT; clauza SET a unei comenzi UPDATE; lista SELECT a unei subcereri dintr-o comanda INSERT; lista unei comenzi SELECT. NEXTVAL i CURRVAL nu pot fi folosite n: subinterogare in SELECT, DELETE sau UPDATE; interogarea unei vizualizri; comand SELECT cu operatorul DISTINCT; comand SELECT cu clauza GROUP BY, HAVING sau ORDER BY; clauza WHERE a unei comenzi SELECT; condiia unei constrngeri CHECK; valoarea DEFAULT a unei coloane ntr-o comand CREATE TABLE sau ALTER TABLE;

49

comand SELECT care este combinat cu alt comand SELECT printr-un operator mulime (UNION, INTERSECT, MINUS). Din dicionarul datelor pot fi obinute informaii despre secvene folosind vizualizarea USER_SEQUENCES.
1) 2)

S se creeze o secven domeniuseq care s fie utilizat pentru a insera noi domenii n tabelul domeniu i s se insereze un nou domeniu. S se afieze informaiile referitoare la secvena domeniuseq. CREATE SEQUENCE domeniuseq START WITH 1 INCREMENT BY 1; INSERT INTO domeniu VALUES (domeniuseq.NEXTVAL,Informatica); SELECT INCREMENT, START, MAXVALUE, MINVALUE, FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'domeniuseq';

Modificarea unei secvene se face prin comanda ALTER SEQUENCE. Sintaxa comenzii este similar instruciunii CREATE SEQUENCE , dar: noua valoare maxim pentru MAXVALUE nu poate fi mai mic dect valoarea curent; opiunea START WITH nu poate fi modificat de comand. Suprimarea unei secvene se face cu ajutorul comenzii: DROP SEQUENCE [<nume_schema>.]<nume_secventa>; Dup ce a fost tears, secvena nu mai poate fi referit. Pentru a putea terge sau modifica secvena trebuie fie s fi proprietarul acesteia, fie s ai privilegiul de sistem DROP ANY SEQUENCE, respectiv privilegiul ALTER SEQUENCE.

Comentarii
Sistemul Oracle ofer posibilitatea de a comenta obiectele create, printr-un text care este inserat n dicionarul datelor. Comentariul se poate referi la tabele, vizualizri, cliee sau coloane. COMMENT ON {TABLE nume_obiect | COLUMN nume_obiect.nume_coloana} IS text comentariu

50

Sinonime
Oracle ofer posibilitatea de a atribui mai multe nume aceluiai obiect. Aceste nume adiionale sunt numite sinonime (synonymes). Ele sunt utile deoarece permit simplificarea formulrii cererii i referirea la obiecte, fr a fi nevoie s se specifice proprietarii obiectelor sau localizarea acestora. Spre deosebire de alias a crui durat de via este limitat la cererea ce conine alias-ul, sinonimele sunt salvate n dicionarul datelor i pot fi reutilizate. Sistemul Oracle permite crearea de sinonime pentru obiecte de tipul: tabel, vizualizare, secven, funcie, procedur, pachet, clieu, sinonim. CREATE [PUBLIC] SYNONYM [schema.]nume_sinonim FOR [schema.]obiect Administratorul bazei poate produce i poate suprima sinonime publice sau private, iar utilizatorii pot genera sau suprima doar sinonime private. Pentru suprimarea unui sinonim din baza de date se utilizeaz comanda: DROP [PUBLIC] SYNONYM [schema.]nume_sinonim

Definirea legturilor ntre baze de date


O legtur ntre dou baze de date (database link) este un obiect al unei scheme dintr-una din baze, care permite accesarea obiectelor din cealalt baz de date. A doua baz poate s nu aparin sistemului Oracle. Odat creat o legtur, aceasta poate fi utilizat n instruciunile SQL pentru a face referin la tabele sau vizualizri dintr-o alt baz de date, prin sufixarea numelor acestora cu irul de caractere @nume_legtur_bd. Prin intermediul unei legturi se pot interoga tabele sau vizualizri din cealalt baz de date. De asemenea, aceste obiecte distante pot constitui subiectul instruciunilor INSERT, UPDATE, DELETE sau LOCK TABLE. O legtur ntre baze de date se creeaz prin comanda CREATE DATABASE LINK, care are urmtoarea sintax simplificat: CREATE [SHARED] [PUBLIC] DATABASE LINK nume_legtura_bd [ {CONNECT TO {CURRENT_USER | utilizator IDENTIFIED BY parola [clauza_autentificare] } | clauza_autentificare} ] [USING 'ir_conectare']; Cuvntul cheie SHARED determin utilizarea unei singure conexiuni de reea

51

pentru a crea o legtur public ntre bazele de date. Aceasta va putea fi folosit de mai muli utilizatori. Cuvntul cheie PUBLIC determin crearea unei legturi publice ntre bazele de date. O astfel de legtur este disponibil tuturor utilizatorilor. Dac se omite aceast opiune, legtura este privat i, n acest fel, disponibil numai utilizatorului care a creat-o. Prin nume_legtura_bd se poate specifica numele complet sau parial al legturii bazei de date. Dac se precizeaz numai numele bazei de date, sistemul va aduga implicit domeniul bazei locale. O legtur ntre baze de date nu poate fi creat n schema altui utilizator. De alfel, nume_legtura_bd nu poate fi prefixat de numele unei scheme. Clauza USING specific numele serviciului corespunztor bazei de date distante. Dac se precizeaz doar numele bazei, sistemul adaug implicit numele domeniului. Prin urmare, dac numele domeniului bazei distante este diferit de numele domeniului bazei curente, trebuie specificat ntreg numele serviciului. Exemplu: a) S se defineasc o legtur de baze de date public partajat care face referin la baza de date specificat prin numele de serviciu arta.
CREATE SHARED PUBLIC DATABASE LINK distant USING 'arta';

b) Se presupune c tabelul opera se afl n baza de date accesata prin legatura distant. S se mreasc cu 10% valoarea operelor de art create de artistul avnd codul 100. UPDATE SET WHERE opera@distant valoare = valoare * 1.1 cod_artist = 100;

Clauza CONNECT TO permite activarea conexiunii la baza distant. Cu ajutorul opiunii CURRENT_USER se poate crea o legtur a utilizatorului curent. Acesta trebuie s aib un cont valid n baza de date distant i s fie un utilizator global. Clauza IDENTIFIED BY specific numele utilizatorului i parola pentru conexiunea la baza de date distant, crend o legtur a unui utilizator fixat. n absena acestei clauze, legtura va folosi numele i parola fiecrui utilizator care este conectat la baz.

52

Exemplu: 1. Se presupune c utilizatorul student, avnd parola oracle, de pe baza de date distant definete o legtur proprie, numit local, ctre schema student de pe baza de date local. CREATE DATABASE LINK local CONNECT TO student IDENTIFIED BY oracle USING 'local'; 2. S se afieze coninutul tabelului artist din schema student a bazei de date local. SELECT * FROM artist@local; 3. Se presupune c utilizatorul student are privilegiul SELECT asupra tabelului profesor.opera. S se afieze, de ctre student, coninutul acestui tabel. SELECT * FROM profesor.opera@local; Specificarea numelui utilizatorului i a parolei pentru instana destinaie are loc n clauza_autentificare. Aceast informaie este folosit pentru validarea utilizatorului pe server-ul distant i este necesar din considerente de securitate. Numele i parola sunt utilizate exclusiv pentru autentificare, nefiind efectuat nici o alt operaie n numele acestui utilizator. Clauza este obligatorie dac se precizeaz cuvntul cheie SHARED. Exemplu: 1. S se defineasc o legtur a utilizatorului curent ctre baza de date distant, utiliznd numele ntreg al serviciului ca identificator al legturii. CREATE DATABASE LINK distant.info.univ.ro CONNECT TO CURRENT_USER USING 'distant'; 2. S se defineasc un sinonim care s mascheze faptul c tabelul opera al schemei student se afl pe baza de date distant. CREATE SYNONYM tab_opera FOR student.opera@distant.info.univ.ro; Odat accesat, o legtur ctre o baz de date rmne deschis pn la nchiderea sesiunii. O legtur este deschis n sensul c exist un proces activ pe fiecare dintre bazele de date distante accesate prin legtur.

53

La nchiderea unei sesiuni, legturile care au fost active vor fi nchise n mod automat. Dac se stabilete o conexiune de reea care nu este utilizat frecvent n aplicaie, poate fi util nchiderea manual a legturii active din sesiunea curent. Instruciunea care permite acest lucru este urmtoarea: ALTER SESSION CLOSE DATABASE LINK nume_legtura_bd; Suprimarea unei legturi ctre o baz de date se realizeaza prin comanda: DROP [PUBLIC] DATABASE LINK nume_legtura_bd; n cazul tergerii unei legturi private, aceasta trebuie s aparin schemei utilizatorului care iniiaz suprimarea. Suprimarea unei legturi publice necesit privilegiul corespunztor (DROP PUBLIC DATABASE LINK).

Vizualizri
Vizualizarea (view) este un tabel logic (virtual) relativ la date din una sau mai multe tabele sau vizualizri. Vizualizarea este definit plecnd de la o cerere a limbajului de interogare a datelor, motenind caracteristicile obiectelor la care se refer. Vizualizarea, fiind virtual, nu solicit o alocare de memorie pentru date. Ea este definit n DD cu aceleai caracteristici ca i un tabel. Textul cererii care definete vizualizarea este salvat n DD. Nucleul Oracle determin fuzionarea cererii relative la vizualizare cu comanda de definire a vizualizrii, analizeaz rezultatul fuziunii n zona partajat i execut cererea. Oracle transform cererea referitoare la o vizualizare ntr-o cerere relativ la tabelele de baz. Vizualizarea este memorata in DD sub forma unui SELECT. Dac sunt utilizate clauzele UNION, GROUP BY i CONNECT BY, atunci Oracle nu determin fuzionarea, el va rezolva vizualizarea i apoi va aplica cererea rezultatului obinut. O vizualizare reflect la orice moment coninutul exact al tabelelor de baz. Orice modificare efectuat asupra tabelelor se repercuteaz instantaneu asupra vizualizrii. tergerea unui tabel implic invalidarea vizualizrilor asociate tabelului i nu tergerea acestora. Vizualizrile sunt definite pentru: furnizarea unui nivel mai nalt de securizare a bazei; simplificarea formulrii unei cereri;

54

mascarea complexitii datelor; afiarea datelor ntr-o alt reprezentare dect cea a tabelelor de baz; asigurarea independenei datelor; asigurarea confidenialitii anumitor informaii; definirea constrngerilor de integritate; restricionarea acesului la date.

Vizualizrile pot fi simple i complexe. O vizualizare simpl extrage date dintr-un singur tabel, nu conine funcii sau grupri de date i asupra ei pot fi efectuate operaii LMD. O vizualizare este considerat complex dac extrage date din mai multe tabele, conine funcii sau grupri de date i nu permite ntotdeauna (prin intermediul su) operaii LMD asupra tabelelor de baz. Operaiile LMD asupra vizualizrilor complexe sunt restricionate de urmtoarele reguli: nu se poate insera, actualiza sau terge o linie dintr-o vizualizare dac aceasta conine funcii grup, clauza GROUP BY, cuvntul cheie DISTINCT sau pseudocoloana ROWNUM; nu se poate aduga sau modifica o linie dintr-o vizualizare, dac aceasta conine coloane definite prin expresii; nu pot fi adugate linii printr-o vizualizare, dac tabelul de baz conine coloane care au constrngerea NOT NULL i nu apar n lista SELECT a vizualizrii. Pentru a obine informaii referitoare la vizualizrile definite, se pot interoga vizualizrile USER_VIEWS i ALL_VIEWS din dicionarul datelor. Textul instruciunii SELECT care definete o vizualizare este stocat ntr-o coloan de tip LONG, numit TEXT. Atunci cnd datele sunt accesate prin intermediul unei vizualizri, server-ul Oracle efectueaz urmtoarele operaii: recupereaz definiia acesteia din USER_VIEWS; verific privilegiile de acces la tabelele ei de baz; convertete cererea ntr-o operaie echivalent asupra tabelelor de baz. Crearea unei vizualizri se realizeaz cu ajutorul comenzii: CREATE [OR REPLACE][FORCE | NOFORCE] VIEW [<nume_schema>.]<nume_view> [(<alias>[,<alias>])] AS <cerere_SELECT>

55

[WITH {CHECK OPTION [CONSTRAINT <nume_constrangere>] | READ ONLY }]; OR REPLACE recreeaz vizualizarea dac aceasta deja exist. FORCE creeaz vizualizarea chiar dac tabelul de baz nu exist sau chiar dac vizualizarea face referin la obiecte care nc nu sunt create. Dei vizualizarea va fi creat, utilizatorul nu poate s o foloseasc. NO FORCE este implicit i se refer la faptul c vizualizarea este creat numai dac tabelele de baz exist. Cererea este o comand SELECT care poate s conin alias pentru coloane. WITH CHECK OPTION specific faptul c reactualizarea datelor din tabele (inserare sau modificare) se poate face numai asupra datelor selectate de vizualizare (care apar n clauza WHERE). WITH READ ONLY asigur c nici o operaie LMD nu poate fi executat asupra vizualizrii. Exemplu: S se genereze o vizualizare care conine informaii referitoare la mprumutul crilor i n care s fie implementat constrngerea c orice carte, care exist ntrun singur exemplar, poate fi mprumutat maximum 15 zile. CREATE VIEW imprumutare AS SELECT * FROM imprumuta WHERE codel NOT IN (SELECT codel FROM carte WHERE nrex = 1) OR datares - dataim < 15 WITH CHECK OPTION; Cererea care definete vizualizarea poate fi complex, incluznd join-uri, grupri i subcereri, ns nu poate conine clauza ORDER BY. Dac este necesar, aceast clauz poate fi specificat la interogarea vizualizrii. Interogarea unei vizualizri este similar celei unui tabel. Numrul coloanelor specificate n definiia vizualizrii trebuie s fie egal cu cel din lista asociat comenzii SELECT. Asupra cererii care definete vizualizarea se impun urmtoarele restricii: nu pot fi selectate pseudocoloanele CURRVAL i NEXTVAL ale unei secvene;

56

dac sunt selectate pseudocoloanele ROWID, ROWNUM sau LEVEL, acestora trebuie s li se specifice alias-uri; dac cererea selecteaz toate coloanele unui tabel, utiliznd simbolul *, iar ulterior se adaug coloane noi tabelului, vizualizarea nu va conine acele coloane pn la recrearea sa printr-o instruciune CREATE OR REPLACE VIEW; pentru vizualizrile obiect, numrul i tipul elementelor selectate de cerere trebuie s coincid cu cel al atributelor de pe primul nivel al tipului obiect. Aportul versiunii Oracle9i n ceea ce privete instruciunea CREATE VIEW const n posibilitatea: crerii de subvizualizri ale vizualizrilor obiect; definirii de constrngeri asupra vizualizrilor. Exemplu: a) S se creeze o vizualizare care conine numele i prenumele artistului, numrul operelor sale i valoarea medie a acestora.
CREATE VIEW artist_nr_val(nume, numar_opere, val_medie) AS SELECT a.nume || ' ' || a .prenume "Nume si prenume", COUNT(o. cod_opera) numar, AVG(o.valoare) medie FROM opera o, artist a WHERE o.cod_artist = a.cod_artist GROUP BY o.cod_artist, a.nume, a.prenume;

b) S se creeze vizualizarea sculptura ce va conine codul operei, data achiziiei, codul artistului i stilul operelor al cror tip este sculptura.
CREATE OR REPLACE VIEW sculptura (cod_sculptura, informatii, cod_sculptor, stil) AS SELECT cod_opera, 'Sculptura ' || titlu || ' a fost achizitionata la data ' || data_achizitiei, cod_artist, stil FROM opera WHERE tip = 'sculptura';

Modificarea unei vizualizri presupune modificarea definiiei acesteia. Pentru a nlocui o vizualizare trebuie avut privilegiul de sistem necesar pentru distrugerea i crearea acesteia. nlocuirea se poate face n dou moduri.

57

Vizualizarea poate fi distrus (DROP VIEW) i apoi recreat (CREATE) cu noua definiie. Atunci cnd este distrus, toate privilegiile sunt retrase. Aceste privilegii trebuie s fie create pentru noua vizualizare. Vizualizarea poate fi recreat prin redefinire cu instruciunea CREATE VIEW, dar cu clauza OR REPLACE. Aceast metod conserv toate privilegiile curente. In Oracle9i este posibila adaugarea de constrangeri unei vizualizari prin comanda ALTER VIEW. Modificarea unui vizualizri are urmtoarele efecte: definiia vizualizrii din DD este actualizat; nici unul din obiectele de baz nu este afectat de nlocuire; toate restriciile care existau n vizualizarea original sunt distruse; toate vizualizrile i programele PL/SQL dependente de vizualizarea nlocuit devin invalide. Suprimarea unei vizualizri se realizeaz prin comanda DROP VIEW care terge definiia vizualizrii din baza de date. DROP VIEW <nume_view> [CASCADE CONSTRAINT]; tergerea vizualizrii nu va afecta tabelele relativ la care a fost definit vizualizarea. Aplicaiile i vizualizrile care se bazeaz pe vizualizarea suprimat devin invalide. Pentru a suprima o vizualizare, utilizatorul trebuie s aib privilegiul DROP ANY VIEW sau s fie creatorul vizualizrii respective. Similar opiunii corespunztoare din comanda DROP TABLE, clauza CASCADE CONSTRAINTS permite suprimarea tuturor constrngerilor de integritate referenial corespunztoare cheilor primare i unice din vizualizarea supus tergerii. Dac se omite aceast clauz i exist astfel de constrngeri, instruciunea DROP VIEW va eua. Recompilarea unei vizualizri permite detectarea eventualelor erori referitoare la vizualizare, naintea executrii vizualizrii. Dup fiecare modificare a tabelelor de baz este recomandabil ca vizualizarea s se recompileze: ALTER VIEW <nume_view> COMPILE; Reactualizarea tabelelor implic reactualizarea corespunztoare a vizualizrilor!!!

58

Reactualizarea vizualizrilor implic reactualizarea tabelelor de baz? NU! Exist restricii care trebuie respectate!!!
Nu pot fi modificate date din vizualizare sau adaugate date prin vizualizare, daca aceasta contine coloane definite prin expresii. Nu pot fi nserate, terse sau actualizate date din vizualizri ce conin: operatorul DISTINCT; clauzele GROUP BY, HAVING, START WITH, CONNECT BY; pseudo-coloana ROWNUM; funcii grup; operatori de mulimi. Nu pot fi inserate sau actualizate date care ar nclca constrngerile din tabelele de baz. Nu pot fi inserate sau actualizate valorile coloanelor care rezult prin calcul. Nu se pot face operaii LMD asupra coloanelor calculate cu DECODE. Alturi de restriciile prezentate anterior, aplicabile tuturor vizualizrilor, exist restricii specifice, aplicabile vizualizrilor bazate pe mai multe tabele. Regula fundamental este c orice operaie INSERT, UPDATE sau DELETE pe o vizualizare bazat pe mai multe tabele poate modifica datele doar din unul din tabelele de baz. In care??? Un tabel de baz al unei vizualizri este protejat prin cheie (key preserved table) dac orice cheie selectat a tabelului este de asemenea i cheie a vizualizrii. Deci, un tabel protejat prin cheie este un tabel ale crui chei se pstreaz i la nivel de vizualizare. Pentru ca un tabel s fie protejat prin cheie nu este necesar ca tabelul s aib toate cheile selectate n vizualizare. Este suficient ca, atunci cnd cheia tabelului este selectat, aceasta s fie i cheie a vizualizrii. Asupra unui join view pot fi aplicate instruciunile INSERT, UPDATE sau DELETE, doar dac sunt ndeplinite urmtoarele condiii: instruciunea LMD afecteaz numai unul dintre tabelele de baz; n cazul instruciunii UPDATE, toate coloanele care pot fi reactualizate trebuie s corespund coloanelor dintr-un tabel protejat prin cheie (n caz contrar, Oracle nu va putea identifica unic nregistrarea care trebuie reactualizat); n cazul instruciunii DELETE, rndurile unei vizualizri pot fi terse numai dac exist un tabel n join protejat prin cheie i numai unul (n caz contrar, Oracle nu ar ti din care tabel s tearg);

59

n cazul instruciunii INSERT, toate coloanele n care sunt inserate valori trebuie s provin dintr-un tabel protejat prin cheie. ALL_UPDATABLE_COLUMNS, DBA_UPDATABLE_COLUMNS i USER_UPDATABLE_COLUMNS sunt vizualizri din DD ce conin informaii referitoare la coloanele vizualizrilor existente, care pot fi reactualizate. Exmplu: 1. S se creeze un view ce conine cmpurile nume, prenume, job din tabelul salariat. 2. S se insereze, s se actualizeze i s se tearg o nregistrare n acest view. Ce efect vor avea aceste aciuni asupra tabelului de baz? CREATE VIEW vederea2 AS SELECT nume, prenume, job FROM salariat; Nu se pot face inserari deoarece view-ul nu conine cheia primar! INSERT INTO vederea2 VALUES ('Popescu','Valentin','grafician'); va genera eroarea: ORA-01400: cannot insert NULL into ("SCOTT"."SALARIAT"."COD_SALARIAT") Actualizarea job-ului salariatului avnd numele "Popescu": UPDATE vederea2 SET job = 'programator' WHERE nume = 'Popescu'; SELECT nume, prenume, job FROM salariat; tergerea nregistrrii referitoare la salariatul avnd numele "Popescu": DELETE vederea2 WHERE nume = 'Popescu'; Operaiile care se realizeaz asupra view-ului se realizeaz i n tabelul salariat. Pentru un caz mai general, cnd view-ul conine cheia extern a tabelului de baz, sunt permise modificri ale view-ului, dac acestea nu afecteaz cheia extern. Exemplu: S se creeze un view care conine cmpurile nume, prenume, job din tabelul salariat. S se introduc n view doar persoanele care sunt graficieni.

60

CREATE VIEW vederea21 AS SELECT nume, prenume, job FROM salariat WHERE job = 'grafician' WITH CHECK OPTION; S se creeze o vizualizare care s conin cod_salariat, nume, prenume din tabelul salariat i coloana tip din tabelul grafician. Apoi s se insereze, s se actualizeze i s se tearg o nregistrare din acest view (vizualizarea conine cheia primar cod_salariat din tabelele salariat i grafician). CREATE VIEW vederea4 AS SELECT s.cod_salariat,nume,prenume,tip FROM salariat s, grafician g WHERE s.cod_salariat=g.cod_salariat; n cazul inserrii unei nregistrri pentru care se specific toate cmpurile: INSERT INTO vederea4 VALUES (30,'Popescu','Valentin','artist plastic'); va apare urmtoarea eroare: ORA-01776: cannot modify through a join view more than one base TABLE

Pot fi inserate date doar ntr-un tabel de baz (n oricare, dar n unul singur) prin intermediul view-ului, astfel: INSERT INTO vederea4 (cod_salariat, nume) VALUES (30, 'Popescu'); Comanda pentru tergerea unei nregistrri: DELETE vederea4 WHERE cod_salariat = 3; va genera urmtoarea eroare: ORA-01752: cannot delete from view without exactly one key-preserved TABLE. Modificarea unei nregistrri se face prin secvena care urmeaz. Toate actualizrile care se fac n view se fac i n tabelele de baz. UPDATE vederea4 SET tip = 'designer' WHERE cod_salariat = 3;

61

Exemplu: Care dintre coloanele unei vizualizri sunt actualizabile? SELECT column_name, updatable FROM user_updatable_columns WHERE table_name = 'vederea4'; Exemplu: 1. S se creeze un view (vederea3) care s conin, pentru fiecare categorie de salariat, salariile medii i numrul de angajai din tabelul salariat. 2. S se insereze, s se actualizeze i s se tearg o nregistrare n view. CREATE VIEW vederea3 (nr, job, salmed) AS SELECT COUNT(*), job, AVG(salariu) FROM salariat GROUP BY job; Nu se pot face inserri, actualizri sau tergeri ntr-un view ce conine funcii grup. Dup oricare din aceste operaii apare acelai mesaj: ORA-01732: data manipulation operation not legal on this view Exemplu: S se creeze o vizualizare care s conin coloanele cod_contractant, adresa, telefon din tabelul contractant i coloanele nr_contract, tip_contract, data_incheiere din tabelul contract. S se insereze o nregistrare n vizualizare. CREATE VIEW vederea44 AS SELECT c.cod_contractant, adresa, telefon, co.nr_contract, tip_contract, data_incheiere FROM contractant c, contract co WHERE c.cod_contractant=co.cod_contractant; La inserarea unei nregistrri creia i se specific valorile tuturor cmpurilor din ambele tabele: INSERT INTO vederea44(cod_contractant, adresa, nr_contract, data_incheiere) VALUES (200, 'Str. Marmurei, 14', '6235', TO_DATE('January 03,2002','Month dd,yyyy')); se obine eroarea: ORA-01779: cannot modify a column which maps to a non key-preserved TABLE

62

Cele dou tabele de baz, contractant i contract, se afl ntr-o relaie oneto-many, iar view-ul creat conine cheile primare din ambele tabele. Doar tabelul contract este protejat prin cheie i, prin urmare, doar el poate fi modificat prin intermediul view-ului. Aceasta, deoarece ar putea exista mai multe nregistrri n view, cu aceeai valoare corespunztoare cmpului cod_contractant (CP n contractant). Exact aceeai eroare se obine dac ncercm inserarea unei nregistrri n vederea44, specificnd fie i numai un cmp provenind din tabela contractant (indiferent dac el conine sau nu CP). Singura operaie de inserare permis este aceea efectuat prin specificarea cheilor provenind doar din tabelul contract. Astfel, prin executarea comenzii: INSERT INTO vederea44(nr_contract, tip_contract) VALUES ('6234', 0); este creat o nregistrare, dar este modificat i tabelul contract. Dac la inserie nu se specific cheia primar din contract: INSERT INTO vederea44(tip_contract) VALUES (1); ORA-01400: mandatory (NOT NULL) column is missing or NULL during insert Cererea din definiia vizualizrii poate fi restricionat prin clauzele WITH READ ONLY i WITH CHECK OPTION. Opiunea WITH READ ONLY asigur c nu pot fi efectuate operaii LMD asupra vizualizrii. Constrngerea WITH CHECK OPTION garanteaz faptul c va fi permis, prin intermediul vizualizrii, numai inserarea sau actualizarea de linii accesibile acesteia (care sunt selectate de cerere). Prin urmare, aceast opiune asigur constrngeri de integritate i verificri asupra validitii datelor inserate sau actualizate. Opiunea WITH CHECK OPTION nu poate funciona dac: exist o cerere imbricat n cadrul subcererii vizualizrii sau n vreuna dintre vizualizrile de baz; operaiile de inserare, tergere i modificare se fac prin intermediul declanatorilor INSTEAD OF. Cuvntul cheie CONSTRAINT permite numirea constrngerii WITH CHECK OPTION. n absena acestei clauze, constrngerea va avea un nume implicit de forma SYS_Cn, unde n este un numr ntreg unic. Exemplu: S se creeze o vizualizare ce conine artitii de naionalitate romn, care au opere expuse n muzeu. Definiia vizualizrii nu va permite modificarea

63

naionalitii unui artist sau inserarea unui artist avnd alt naionalitate dect cea romn.
CREATE VIEW artist_roman AS SELECT * FROM artist WHERE nationalitate = 'romana' WITH CHECK OPTION CONSTRAINT artist_roman_ck;

UPDATE SET WHERE

artist_roman nationalitate = 'engleza' cod_artist = 25;

ncercarea de actualizare a unei linii prin instruciunea anterioar va genera eroarea ORA-01402: view WITH CHECK OPTION where-clause violation. Exemplu: S se creeze o vizualizare asupra tabelului galerie care s nu permit efectuarea nici unei operaii LMD. CREATE VIEW viz_galerie AS SELECT cod_galerie, nume_galerie FROM galerie WITH READ ONLY; DELETE FROM viz_galerie WHERE cod_galerie = 10; ncercarea de tergere a unei linii din vizualizarea viz_galerie determin apariia erorii ORA-01752: cannot delete from view without exactly one keypreserved table. Dac se ncearc modificarea sau inserarea unei linii prin intermediul unei vizualizri asupra creia a fost definit o constrngere WITH READ ONLY, server-ul Oracle genereaz eroarea ORA-01733: virtual column not allowed here. Exemplu: S se creeze o vizualizare care conine codul i titlul operelor de art, codul i numele artitilor care le-au creat, precum i codul galeriilor unde sunt expuse. S se afle dac este posibil adugarea unei noi nregistrri prin intermediul acestei vizualizri. CREATE VIEW opera_artist AS SELECT o.cod_opera, o.titlu, o.cod_galerie, a.cod_artist, a.nume FROM opera o, artist a WHERE o.cod_artist = a.cod_artist;

64

Instruciunea urmtoare afieaz numele coloanelor i valorile YES/NO, dup cum aceste coloane sunt, sau nu, modificabile. SELECT COLUMN_NAME, UPDATABLE FROM USER_UPDATABLE_COLUMNS WHERE TABLE_NAME = 'OPERA_ARTIST'; Se va obine c doar primele trei coloane ale vizualizrii sunt modificabile. Indexul primar al coloanei cod_artist din tabelul artist nu este unic n vizualizarea opera_artist. Prin urmare, tabelul artist nu este key-preserved, iar coloanele sale nu sunt modificabile. Instruciunea urmtoare va genera eroarea ORA-01776: cannot modify more than one base table through a join view. INSERT INTO opera_artist VALUES (200, 'Poeme de l''ame', 20, 147, 'Janmot'); n schimb, instruciunea urmtoare va fi executat cu succes, ntruct adaug o nregistrare n tabelul de baz opera, ale crui coloane sunt modificabile.
INSERT INTO opera_artist (cod_opera, titlu, cod_galerie)

VALUES (200, 'Poeme de l''ame', 20);

Constrngeri asupra vizualizrilor


ncepnd cu versiunea Oracle9i pot fi specificate constrngeri pentru vizualizri. Se pot defini constrngeri la nivel de vizualizare, respectiv la nivel de coloan sau atribut. Constrngerile asupra vizualizrilor constituie o submulime a constrngerilor specifice tabelelor. Pot fi specificate explicit numai constrngerile UNIQUE, PRIMARY KEY i FOREIGN KEY. Constrngerea de tip CHECK poate fi realizat prin precizarea clauzei WITH CHECK OPTION n comanda care definete vizualizarea. Constrngerile asupra vizualizrilor pot fi definite numai n modul DISABLE NOVALIDATE. Aceste cuvinte cheie trebuie specificate la declararea constrngerii, nefiind permis precizarea altor stri. Exemplu: S se creeze o vizualizare care conine codurile, numele i adresele galeriilor. Se va impune unicitatea valorilor coloanei adresa i constrngerea de cheie primar pentru coloana corespunztoare codului galeriei.
CREATE VIEW viz_galerie( cod_gal, nume, adresa UNIQUE DISABLE NOVALIDATE, CONSTRAINT cp_viz PRIMARY KEY (cod_gal) DISABLE NOVALIDATE) AS SELECT cod_galerie, nume_galerie, adresa FROM galerie;

65

Definirea vizualizrilor materializate


O vizualizare materializat, cunoscut n versiunile anterioare sub numele de clieu (snapshot), este un obiect al schemei ce stocheaz rezultatele unei cereri i care este folosit pentru a rezuma, calcula, replica i distribui date. Clauza FROM a cererii poate referi tabele, vizualizri sau alte vizualizri materializate. Luate n ansamblu, aceste obiecte sunt referite prin tabele master (n temeni de replicare) sau prin tabele detaliu (n termeni de data warehouse). Optimizorul pe baz de costuri poate utiliza vizualizrile materializate pentru a mbunti execuia cererilor. Acesta recunoate automat situaiile n care o astfel de vizualizare poate i trebuie s fie utilizat pentru rezolvarea unei cereri. n urma unui asemenea demers, optimizorul rescrie cererea utiliznd vizualizarea materializat. n data warehouse, vizualizrile materializate sunt utile pentru a calcula i stoca date agregat, precum totaluri sau medii aritmetice. De asemenea, acest tip de vizualizare este utilizat pentru a efectua cereri n care intervin operaii de compunere i n care pot aprea agregri. n mediile distribuite, vizualizrile materializate sunt utilizate pentru replicarea datelor la site-uri distribuite i sincronizarea modificrilor efectuate pe diferite site-uri. Astfel, vizualizrile materializate permit accesul local la date care, altfel, ar fi trebuit s fie accesate de la locaii distante. Din anumite puncte de vedere, vizualizrile materializate sunt similare indecilor: consum spaiu de stocare; trebuie reactualizate dac datele din tabelele de baz sunt modificate; mbuntesc performana execuiei instruciunilor SQL dac sunt folosite pentru rescrierea cererilor; sunt transparente aplicaiilor SQL i utilizatorilor. Spre deosebire de indeci, vizualizrile materializate pot fi accesate utiliznd instruciuni SELECT i pot fi actualizate prin instruciunile INSERT, UPDATE, DELETE. Asupra unei vizualizri materializate se pot defini unul sau mai muli indeci. O vizualizare materializat poate fi partiionat. De asemenea, se pot defini vizualizri materializate asupra unui tabel partiionat. Similar vizualizrilor obinuite, asupra celor materializate se pot defini constrngerile PRIMARY KEY, UNIQUE i FOREIGN KEY. Singura stare valid a unei constrngeri este DISABLE NOVALIDATE. Pentru compatibilitate cu versiunile anterioare, cuvintele cheie SNAPSHOT

66

i MATERIALIZED VIEW sunt echivalente. CREATE MATERIALIZED VIEW [schema.]nume_viz_materializat [OF [schema.]tip_obiect] [ (constr_ref_domeniu) ] [ORGANIZATION INDEX clauza_tabel_org_index] [ {proprieti_vm | ON PREBUILT TABLE [{WITH | WITHOUT} REDUCED PRECISION] } ] [ {USING INDEX [ {clauza_atribute_fizice | TABLESPACE nume_sp_tabel} [ {clauza_atribute_fizice | TABLESPACE nume_sp_tabel} ] ] | USING NO INDEX} ] [refresh_vm] [FOR UPDATE] [ {DISABLE | ENABLE} QUERY REWRITE] AS subcerere; Clauza OF permite crearea unei vizualizri materializate obiect. Sintaxa clauzei constr_ref_domeniu este urmtoarea: SCOPE FOR ( {ref_coloana | ref_atribut} ) IS [schema.]nume_tabel_scope [, SCOPE FOR ( {ref_coloana | ref_atribut} ) IS [schema.]nume_tabel_scope] Clauza poate fi utilizat pentru restricionarea domeniului referinelor la tabelul nume_tabel_scope. Valorile dintr-o coloan de tip REF vor adresa obiecte din tabelul identificat prin nume_tabel_scope. n acest tabel sunt stocate instane de obiecte care au acelai tip ca i coloana REF. Opiunea ON PREBUILT TABLE permite considerarea unui tabel existent ca fiind o vizualizare materializat predefinit. Tabelul trebuie s aib acelai nume i s se afle n aceeai schem ca vizualizarea materializat rezultat. La tergerea acestei vizualizri, tabelul revine la statutul su iniial. Pentru o vizualizare materializat de acest tip, alias-urile de coloan din clauza subcerere trebuie s corespund, ca numr i tip de date, coloanelor din tabel. Clauza WITH REDUCED PRECISION permite ca precizia coloanelor tabelului sau vizualizrii materializate s nu coincid cu precizia coloanelor returnate de subcerere. Pentru a impune respectarea ntocmai a preciziei, sintaxa dispune de opiunea WITHOUT REDUCED PRECISION, care este implicit. Atributele fizice au o semantic asemntoare celei descrise de clauza_proprieti_fizice din cadrul comenzii CREATE TABLE. Spre deosebire de tabele, pentru o vizualizare materializat nu poate fi specificat opiunea ORGANIZATION EXTERNAL.

67

Clauza TABLESPACE specific spaiul tabel n care urmeaz s fie creat vizualizarea materializat. n absena acesteia, vizualizarea va fi creat n spaiul tabel implicit al schemei care o conine. Clauza USING INDEX permite stabilirea de valori ale parametrilor INITRANS, MAXTRANS i STORAGE ai indexului implicit care este utilizat de sistemul Oracle pentru a ntreine datele vizualizrii materializate. Dac este omis clauza, sistemul va utiliza indexul implicit pentru ameliorarea vitezei de reactualizare incremental a vizualizrii materializate. Clauza proprieti_vm este util pentru descrierea vizualizrilor materializate care nu se bazeaz pe un tabel existent (nu sunt construite cu opiunea ON PREBUILT TABLE). Dintre proprietile care pot fi specificate n aceast clauz, se menioneaz: clauza_partiionare_tabel, CACHE sau NOCACHE, clauza_paralelism. Pe lng acestea, poate fi menionat opiunea BUILD IMMEDIATE | DEFERRED care determin introducerea de linii n vizualizarea materializat imediat, respectiv la prima operaie de reactualizare (refresh). n acest ultim caz, pn la prima operaie de reactualizare, vizualizarea nu va putea fi utilizat n rescrierea cererilor. Opiunea IMMEDIATE este implicit. Prin refresh_vm se specific metodele, modurile i momentele la care sistemul va reactualiza vizualizarea materializat. {REFRESH [ {FAST | COMPLETE | FORCE} ] [ON {DEMAND | COMMIT} ] [START WITH data] [NEXT data] [ WITH {PRIMARY KEY | ROWID} ] | USING {DEFAULT [ {MASTER | LOCAL} ] ROLLBACK SEGMENT | [ {MASTER | LOCAL} ] ROLLBACK SEGMENT nume_segm_anulare } [ {DEFAULT [ {MASTER | LOCAL} ] ROLLBACK SEGMENT | [ {MASTER | LOCAL} ] ROLLBACK SEGMENT nume_segm_anulare}] } | NEVER REFRESH} Opiunea FAST indic metoda de reactualizare incremental, care se efectueaz corespunztor modificrilor survenite n tabelele master. Modificrile sunt stocate ntr-un fiier log asociat tabelului master. Clauza COMPLETE implic reactualizarea complet, care se realizeaz prin reexecutarea complet a cererii din definiia vizualizrii materializate. Clauza FORCE este implicit i presupune

68

reactualizarea de tip FAST, dac este posibil. n caz contrar, reactualizarea va fi de tip COMPLETE. Clauza ON COMMIT indic declanarea unei operaii de reactualizare de tip FAST ori de cte ori sistemul permanentizeaz o tranzacie care opereaz asupra unui tabel master al vizualizrii materializate. Clauza nu este permis pentru vizualizrile materializate ce conin tipuri obiect. Clauza ON DEMAND este implicit i indic efectuarea reactualizrii vizualizrii materializate la cererea utilizatorului, prin intermediul procedurilor specifice din pachetul DBMS_MVIEW (REFRESH, REFRESH_ALL_MVIEWS, REFRESH_DEPENDENT). Opiunile START WITH i NEXT nu pot fi specificate dac s-au precizat clauzele ON COMMIT sau ON DEMAND. Expresiile de tip dat calendaristic indicate n cadrul acestor opiuni specific momentul primei reactualizri automate i determin intervalul dintre dou reactualizri automate consecutive. Clauza WITH PRIMARY KEY este implicit i permite ca tabelele master s fie reorganizate fr a afecta eligibilitatea vizualizrii materializate pentru reactualizarea de tip FAST. Tabelul master trebuie s conin o constrngere PRIMARY KEY. Opiunea nu poate fi specificat pentru vizualizri materializate obiect. Opiunea WITH ROWID asigur compatibilitatea cu tabelele master din versiunile precedente lui Oracle8. Clauza USING ROLLBACK SEGMENT specific segmentul de anulare distant care urmeaz s fie utilizat pentru reactualizarea vizualizrii materializate. Cuvntul cheie DEFAULT determin ca sistemul s aleag acest segment n mod automat. Opiunile MASTER i LOCAL specific segmentul de anulare distant care urmeaz s fie utilizat pe site-ul distant pentru vizualizarea materializat individual, respectiv pentru grupul local de reactualizare care conine vizualizarea materializat. Opiunea LOCAL este implicit. Clauza NEVER REFRESH previne reactualizarea vizualizrii materializate prin mecanisme Oracle sau prin proceduri. Pentru a permite reactualizarea, trebuie efectuat o operaie ALTER MATERIALIZED VIEWREFRESH. Clauza FOR UPDATE permite actualizarea unei vizualizri materializate. QUERY REWRITE permite specificarea faptului c vizualizarea materializat este eligibil pentru operaia de rescriere a cererilor. Opiunea AS specific cererea care definete vizualizarea materializat. Dac

69

n clauza FROM a cererii din definiia vizualizrii materializate se face referin la o alt vizualizare materializat, atunci aceasta va trebui reactualizat ntotdeauna naintea celei create n instruciunea curent. Exemplu: a) S se creeze i s se completeze cu nregistrri o vizualizare materializat care va conine titlul operelor de art, numele artistului i suma valorilor polielor de asigurare ncheiate. Reactualizrile ulterioare ale acestei vizualizri se vor realiza prin reexecutarea cererii din definiie. Vizualizarea creat va putea fi aleas pentru rescrierea cererilor.
CREATE MATERIALIZED VIEW opera_artist_polite BUILD IMMEDIATE REFRESH COMPLETE ENABLE QUERY REWRITE AS SELECT o.titlu, a.nume, SUM(p.valoare) suma_polite FROM opera o, artist a, polita_asig p WHERE o.cod_artist = a.cod_artist AND o.cod_opera = p.cod_opera GROUP BY o.cod_opera, o.titlu, a.nume;

b) S se creeze tabelul opera_artist_polite. Acesta va fi utilizat ca tabel sumar preexistent n crearea unei vizualizri materializate ce va permite diferene de precizie i rescrierea cererilor.
CREATE TABLE opera_artist_polite( titlu VARCHAR2(25), nume VARCHAR2(15), suma_polite NUMBER); CREATE MATERIALIZED VIEW opera_artist_polite ON PREBUILT TABLE WITH REDUCED PRECISION ENABLE QUERY REWRITE AS SELECT o.titlu, a.nume, SUM(p.valoare) suma_polite FROM opera o, artist a, polita_asig p WHERE o.cod_artist = a.cod_artist AND o.cod_opera = p.cod_opera GROUP BY o.cod_opera, o.titlu, a.nume;

c) S se creeze o vizualizare materializat care conine informaiile din tabelul artist, permite reorganizarea acestuia i este reactualizat la momentul crerii, iar apoi la fiecare 5 minute.

70

CREATE MATERIALIZED VIEW artist_vm REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/288 WITH PRIMARY KEY AS SELECT * FROM artist;

Pentru reactualizarea de tip FAST, este necesar un fiier log n care s fie stocate modificrile. Instruciunea precedent genereaz eroarea ORA-23413: table artist does not have a materialized view log. Pentru remedierea acestei situaii, nainte de crearea vizualizrii se va lansa urmtoarea comand: CREATE MATERIALIZED VIEW LOG ON artist; Comanda ALTER MATERIALIZED VIEW permite intervenia asupra unei vizualizri materializate, ntr-unul din urmtoarele sensuri: modificarea caracteristicilor de stocare; modificarea metodei, modului sau timpului de reactualizare (refresh); modificarea structurii, astfel nct s devin un alt tip de vizualizare materializat; activarea sau dezactivarea funciei de rescriere a cererilor. ALTER MATERIALIZED VIEW [ schema.]nume_viz_materializat [atribute_fizice] [USING INDEX atribute_fizice] [ {REBUILD | alter_vm_refresh} ] [ { {ENABLE | DISABLE} QUERY REWRITE | COMPILE | CONSIDER FRESH} ]; Opiunea USING INDEX modific parametrii de stocare asociai indexului folosit de sistem pentru a ntreine datele vizualizrii materializate. Clauza REBUILD permite regenerarea operaiilor de reactualizare atunci cnd se modific un tip care este referit n vizualizarea materializat. Specificarea acestei opiuni interzice utilizarea altor clauze n aceeai instruciune ALTER MATERIALIZED VIEW. Clauza alter_vm_refresh permite modificarea metodelor, modurilor i timpului implicit de reactualizare automat. n cazul modificrii coninutului tabelelor master ale vizualizrii materializate, datele din vizualizare trebuie reactualizate astfel nct s reflecte datele existente. Clauza QUERY REWRITE, prin opiunile ENABLE i DISABLE, determin ca vizualizarea materializat s fie, sau nu, eligibil pentru rescrierea cererilor. Clauza COMPILE permite revalidarea explicit a vizualizrii materializate. Dac un obiect de care depinde vizualizarea materializat este suprimat sau

71

modificat, vizualizarea rmne accesibil, dar nu este eligibil pentru rescrierea cererilor. Clauza este util pentru revalidarea explicit a vizualizrii materializate, astfel nct aceasta s devin eligibil n operaia de rescriere a cererilor. Opiunea CONSIDER FRESH indic sistemului s considere vizualizarea materializat ca fiind reactualizat i deci eligibil pentru rescrierea cererilor. Exemplu: S se modifice vizualizarea materializat opera_artist_polite creat anterior, astfel nct metoda de reactualizare implicit s fie de tip FAST, iar intervalul de timp la care se realizeaz reactualizarea s fie de 7 zile. Nu va fi permis utilizarea acestei vizualizri pentru rescrierea cererilor.
ALTER MATERIALIZED VIEW opera_artist_polite REFRESH FAST NEXT SYSDATE + 7 DISABLE QUERY REWRITE;

Pentru c nu se specific valoarea corespunztoare opiunii START WITH n clauza REFRESH, urmtoarea reactualizare va avea loc la momentul stabilit prin comanda de creare a vizualizrii materializate sau prin ultima comand de modificare a acesteia. Sistemul va reactualiza vizualizarea evalund expresia din clauza NEXT, iar apoi va executa aceast operaie o dat pe sptmn. DROP MATERIALIZED VIEW [schema.]nume_viz_materializat;

Grupri
Cluster-ul este o regrupare fizic a dou sau mai multe tabele, relativ la una sau mai multe coloane, cu scopul mririi performanelor. Coloanele comune definesc cheia cluster-ului. Un cluster este un obiect al bazei care necesit: un nume unic la nivelul schemei, specificare a coloanelor care compun cheia cluster-ului, specificare a spaiului de stocare (opional), un index (relativ la cheia cluster-ului). Un cluster trebuie s aib cel puin un index. Acest index trebuie creat naintea oricrei comenzi LMD care va aciona asupra tabelelor cluster-ului. Un index al cluster-ului se deosebete de un index al tabelului (de exemplu, absena indexului afecteaz utilizatorul datele cluster-ului nu sunt accesibile).

72

Coloanele comune definite pentru cluster, reprezint cheia cluster-ului i criteriul de regrupare. Liniile diferitelor tabele sunt regrupate n interiorul aceluiai bloc urmrind cheia cluster-ului. Dac liniile asociate unei aceiai valori a cheii cluster-ului necesit un spaiu de mai multe blocuri, atunci blocurile sunt nlnuite. Crearea unui cluster presupune: crearea structurii cluster-ului; crearea indexului cluster-ului; crearea tabelelor care vor compune cluster-ul. Crearea unui cluster se realizeaza prin comanda: CREATE CLUSTER nume_cluster (nume_coloana tip_data [,nume_coloana tip_data] ) [SIZE n] Exist dou modaliti pentru introducerea unui tabel ntr-un cluster. O prim variant presupune c cluster-ul este creat pentru un tabel care deja exist. De fapt, nu se poate asocia un cluster unui tabel care exist! A doua variant presupune c introducerea tabelului n cluster se face n momentul crerii structurii tabelului (comanda CREATE TABLE). Exerciiu: S se obin un cluster referitor la lista crilor din fiecare domeniu. Varianta 1 CREATE CLUSTER cdoml(cdom CHAR(1)); CREATE INDEX indcom ON CLUSTER cdoml; CREATE TABEL domino CLUSTER cdoml(coded) AS SELECT * FROM domeniu; DROP TABEL domeniu; RENAME domino TO domeniu; ALTER TABLE carte MODIFY coded NOT NULL; CREATE TABEL carticica CLUSTER cdoml(coded) AS SELECT * FROM carte; DROP TABLE carte; RENAME carticica TO carte; Varianta 2

73

CREATE CLUSTER cdoml(cdom CHAR(1)); CREATE INDEX indcom ON CLUSTER cdoml; -- crearea spatiului CREATE TABLE domeniu (coded CHAR(1) NOT NULL, intdom CHAR() ... ) CLUSTER cdoml(coded); CREATE TABLE carte (codel CHAR(5) NOT NULL, coded CHAR(1) NOT NULL) CLUSTER cdoml(coded); Pentru a scoate un tabel dintr-un cluster sunt parcurse urmtoarele etape: se creeaz un nou tabel, n afara cluster-ului, prin duplicarea celui vechi; se distruge tabelul din cluster; se suprim cluster-ul. CREATE TABLE alfa AS SELECT * FROM domeniu; DROP TABLE domeniu; RENAME alfa TO domeniu; CREATE TABLE beta AS SELECT * FROM carte; DROP TABLE carte; RENAME beta TO carte; DROP CLUSTER cdoml; Un alt tip de cluster oferit de Oracle este cluster-ul hash. n acest caz, pentru a accesa o nregistrare, cluster-ul hash nu folosete un index, ci o funcie numeric, numit funcia hash. Funcia are ca parametru cheia cluster-ului i returneaz o anumit valoare (valoare hash). Aceast valoare corespunde blocului de date din cluster pe care Oracle l va citi sau scrie pe baza comenzii executate. De exemplu, apelurile telefonice efectuate de un client ntr-o lun vor fi facturate mpreun. Apelurile pot fi depozitate ntr-un cluster hash a crui cheie este format din coloanele ce conin numrul telefonului, anul i luna n care a avut loc convorbirea. Suprimarea unui cluster din baza de date se face prin comanda: DROP CLUSTER nume_cluster

74

n urma tergerii unui cluster, tabelele pe care acesta le conine nu mai sunt grupate. Secvena urmtoare suprim: cluster-ul, toate tabelele definite relativ la acest cluster i constrngerile lor de integritate. DROP CLUSTER nume_cluster INCLUDING TABLES CASCADE CONSTRAINTS; Modificarea unui cluster permite redefinirea condiiilor, modificarea parametriilor de stocare i a caracteristicelor de stare (ALTER CLUSTER).

Informaii despre obiectele bazei de date


Pot fi obinute consultnd DD. Dintre ele se remarc: definiiile tuturor obiectelor din baza de date; spaiul alocat i spaiul utilizat n prezent de obiectele schemei; constrngerile de integritate; numele utilizatorilor bazei; privilegiile i rolurile acordate fiecrui rol; alte informaii generale despre baza de date. Tabelul USER_CATALOG conine informaii despre tabelele i vizualizrile definite de un utilizator particular. Acest tabel poate fi referit i prin sinonimul su public CAT. Tabelul USER_OBJECTS conine informaii despre toate obiectele definite de utilizatorul curent. Tabelul are urmtoarea schem relaional: USER_OBJECTS (object_name, object_id, object_type, created, last_ddl_time, timestamp, status) Vizualizrile cele mai importante ale dicionarului datelor conin: descrierea tabelelor definite de utilizatori (USER_ALL_TABLES), informaii despre constrngerile definite de utilizator(USER_CONSTRAINTS), informaii despre legturile bazei de date (USER_DB_LINKS),

75

erorile curente ale obiectelor depozitate (USER_ERRORS), informaii despre indecii creai de utilizator (USER_INDEXES), informaii despre tabelele utilizatorului (USER_TABLES) etc. Vizualizrile din dicionarul datelor referitoare la tabele conin: USER_TAB_COLUMNS|COLS informaii despre coloanele tabelelor, USER_CONS_COLUMNS informaii despre constrngeri la nivel coloan, USER_TAB_COMMENTS informaii despre comentarii la nivel tabel, USER_COL_COMMENTS informaii despre comentarii la nivel coloan, USER_TAB_PARTITIONS informaii despre partiiile tabelelor.

You might also like