Sunteți pe pagina 1din 90

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;

Oracle

nu permit manipularea datelor din baza de date; 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


SQLPLUS [nume_utiliz/parola][@nume_baza_de_date] [@nume_fisier] [-SILENT]

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.

SQL

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 deschide un editor n care se poate modifica ultima comand; 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]

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;

Oracle

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; I[NPUT] [text] adaug una sau mai multe linii de text dup linia curent din buffer;

SQL

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) 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. Pentru variabilele de tip caracter sau de tip dat

Oracle

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;

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 d comanda SHOW ALL. SET variabila_sistem valoare

SQL

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.

Oracle

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: 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]]

SQL

coloana este numele coloanei asupra creia se aplic sau creia i se citete formatarea ntr-o comand SELECT. Dintre valorile parametrului opiune:

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 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;

10

Oracle

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: 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;

SQL

11

dac ROW sau REPORT sunt refereniate n clauza ON atunci ele trebuie s apar i n cea mai recent comand BREAK.

S se calculeze valoarea medie a preurilor crilor fiecrui autor. BREAK ON autor SKIP 1 COMPUTE AVG OF pret ON autor SELECT autor,pret FROM carte ORDER BY 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;

12

Oracle

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: 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

SQL

13

SET ECHO ON SET FEEDBACK ON 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

14

Oracle

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 CONTRACT CONTRACT ---------------- --------------100 50000 101 120000 ******************** --------VALOAREA MAXIMA 120000 TOTAL 170000 NUME ---------------------CONSTRUCT SA Pagina 1 CONTRACTELE SUBANTREPRENORULUI ERBASU SA LA DATA DE 14/10/2001 NUMAR VALOARE CONTRACT CONTRACT --------------- ---------------107 20000 108 300000 109 750000 ******************** --------VALOAREA MAXIMA 750000 TOTAL 1070000 NUME ---------------ERBASU SA Pagina 2 CONTRACTELE SUBANTREPRENORULUI GAUDI LA DATA DE 14/10/2001 NUME ----------GAUDI NUMAR CONTRACT --------------104 105 106 VALOARE CONTRACT ---------------500000 27000 10000

SQL

15

******************** VALOAREA MAXIMA TOTAL Pagina 3

--------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

16

Oracle

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, SUM(DECODE(tip,diverse,nrex,0)) diverse, SUM(nrex) total FROM carte

SQL

17

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

18

Oracle

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) obiectelor ce modeleaz sistemul studiat. Aceste comenzi definesc limbajul de definire a datelor (LDD). Comenzi pentru manipularea datelor, care permit consultarea, reactualizarea, suprimarea sau inserarea datelor. Aceste comenzi definesc limbajul de manipulare 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). 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.

SQL

19

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


Limbajul de definire a datelor const din acele instruciuni SQL (CREATE, ALTER, DROP) care permit crearea, modificarea i distrugerea obiectelor BD. Principalele obiecte ce pot fi definite i manipulate n sistemul Oracle sunt urmtoarele: tabele (table), indeci (index), secvene (sequence), vizualizri (view), proceduri (procedure), funcii (function), pachete (package), declanatori (trigger), cliee (snapshot) 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. 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.

20

Oracle

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, exist i tipuri de date LOB (Large Objects), care specific locaia unor obiecte de dimensiuni mari.

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.). 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 ct de mult spaiu a fost alocat spaiului tabel n care este creat tabelul. Structura unui tabel poate fi creat n urmtoarele patru moduri: fr a indica cheile;

SQL

21

indicnd cheile la nivel de coloan; 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 (codel titlu autor pret nrex coded carte CHAR(5) PRIMARY KEY, VARCHAR2(30), VARCHAR2(30), NUMBER(8,2), NUMBER(3), CHAR(5) NOT NULL REFERENCES domeniu(coded) ON DELETE CASCADE);

22

Oracle

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 (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

SQL

23

Constrngere 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. 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.

24

Oracle

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 ; 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 se adaug o virgul dup NUMBER(8, 2) 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. 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

SQL

25

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 ), PARTITION mediu VALUES LESS THAN (10) TABLESPACE STORAGE ), PARTITION mare VALUES LESS THAN (MAXVALUE) TABLESPACE STORAGE )); 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. 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 (DROP) cheii primare, a cheii externe sau a unor constrngeri. Comanda ALTER TABLE are urmtoarea sintax simplificat:

26

Oracle

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 este utilizat forma: ALTER TABLE nume_tabel ENABLE nume_constrangere; Observa ii Schimbarea definiiei unei coloane din NOT NULL n NULL O.K. Schimbarea definiiei unei coloane din NULL n NOT NULL se poate face doar dac exist sigurana c fiecare linie a coloanei respective este NOT NULL sau dac tabelul (???sau coloana???) este vid.

Pentru mrirea lungimii coloanei nu exist condiii speciale. Pot reduce lungimea unei coloane sau pot schimba tipul unei coloane doar dac coloana nu conine valori sau conine doar valori NULL.

Definirea cheii primare sau a cheii externe dup crearea tabelului. CREATE TABLE carte

SQL

27

(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 carte DROP PRIMARY KEY CASCADE;

Suprimarea cheii externe. ALTER TABLE carte ADD CONSTRAINT beta FOREIGN KEY (coded) REFERENCES domeniu; ALTER TABLE carte DROP CONSTRAINT beta;

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);

Suprimarea unei coloane.

28

Oracle

se creeaz un tabel selectnd toate cmpurile, cu excepia coloanei care

trebuie tears (CREATE se transfer privilegiile; se terge tabelul iniial.

TABLE

AS SELECT

);

n Oracle9i se poate terge direct prin DROP COLUMN. 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 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). Suprimarea unui tabel

DROP TABLE [<nume_schema>.]<nume_tabel>; Suprimarea unui tabel presupune: suprimarea definiiei sale n dicionarul datelor;

SQL

29

suprimarea indecilor asociai; suprimarea privilegiilor conferite n legtur cu tabelul; recuperarea spaiului ocupat de tabel; invalidarea (dar nu suprimarea) funciilor, procedurilor, vizualizrilor, sinonimelor referitoare la tabel. DROP TABLE este ireversibil. Nu poate fi fcut un rollback pe aceast comand. In DD, informaiile despre tabele se gsesc n vizualizarea USER_TABLES. Dintre cele mai importante coloane ale acesteia, fac parte:
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)

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

30

Oracle

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, fiind obiecte ale schemei bazei, beneficiaz de procesul de definire a unui obiect. Un index unic este creat automat cnd n definirea unui tabel apar constrngerile PRIMARY KEY sau UNIQUE. Crearea unui index pe una sau mai multe coloane ale unui tabel se face prin comanda: CREATE [UNIQUE] INDEX <nume_index> 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. 2) S se afieze informaiile referitoare la indexul cititor_idx. Soluie: CREATE INDEX cititor_idx ON cititor (adresa DESC); SELECT TABLE_NAME, UNIQUENESS, MIN_EXTENTS FROM USER_INDEXES WHERE INDEX_NAME='cititor_idx'; tergerea unui index se face prin comanda: DROP INDEX nume_index [ON [nume_schema.] nume_tabel]

SQL

31

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. 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.

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); indexai coloanele care sunt utilizate pentru a face legtura dintre tabele.

32

Oracle

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. 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 despre indeci pot fi obinute cu ajutorul view-urilor USER_INDEXES i USER_IND_COLUMNS. 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

SQL

33

FROM WHERE AND

user_indexes b, user_ind_columns a a.index_name = b.index_name a.table_name = carte;

Secvene
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}] [{ORDER | NOORDER}] 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); ORDER | NOORDER specific dac valorile generate de secven sunt ordonate n conformitate cu cererile. 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 unei comenzi SELECT. NEXTVAL i CURRVAL nu pot fi folosite n: subinterogare;

34

Oracle

interogarea unei vizualizri; comand SELECT cu operatorul DISTINCT; comand SELECT cu clauza GROUP BY 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; 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. Exemplu: 1) 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. 2) 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.

SQL

35

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

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

36

Oracle

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. 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; 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.

SQL

37

Crearea unei vizualizri se realizeaz cu ajutorul comenzii: CREATE [OR REPLACE][FORCE | NOFORCE] VIEW [<nume_schema>.]<nume_view> [(<alias>[,<alias>])] AS <cerere_SELECT> [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 crile mprumutate i n care s fie implementat constrngerea c orice carte, care exist ntr-un 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; Observaii: Numrul coloanelor specificate n definiia vizualizrii trebuie s fie egal cu cel din lista asociat comenzii SELECT.

38

Oracle

Cererea ce definete o vizualizare poate conine cereri SELECT complexe care includ subcereri, grupri, operaii de compunere. Cererea care definete o vizualizare nu poate conine clauza ORDER BY. Clauza poate fi specificat dac se fac interogri asupra vizualizrii.

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. Vizualizarea poate fi distrus (DROP VIEW) i apoi recreat (CREATE) cu noua defini ie. 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. 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.

Modificarea unui vizualizri are urmtoarele efecte:

Suprimarea unei vizualizri se realizeaz prin comanda DROP VIEW care terge definiia vizualizrii din baza de date. DROP VIEW <nume_view>; 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. 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;

SQL

39

Reactualizarea tabelelor implic reactualizarea corespunztoare a vizualizrilor!!!

Reactualizarea vizualizrilor implic reactualizarea tabelelor de baz? NU! Exist restricii care trebuie respectate!!!

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. 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); n cazul instruciunii INSERT, toate coloanele n care sunt inserate valori trebuie s provin dintr-un tabel protejat prin cheie;

40

Oracle

Exerciiu!!! Dac vizualizarea este definit folosind clauza WITH CHECK OPTION, atunci pot fi terse, inserate sau modificate rnduri din vizualizare??? 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? Soluie: CREATE VIEW AS SELECT FROM vederea2 nume, prenume, job 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 = 'Popescun'; 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

SQL

41

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. CREATE VIEW vederea21 AS SELECT nume, prenume, job FROM salariat WHERE job = 'grafician' WITH CHECK OPTION; Exemplu: 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). Soluie: CREATE VIEW AS SELECT FROM WHERE vederea4 s.cod_salariat,nume,prenume,tip salariat s, grafician g 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;

42

Oracle

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; 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. Soluie: CREATE VIEW AS SELECT FROM GROUP BY vederea3 (nr, job, salmed) COUNT(*), job, AVG(salariu) salariat 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:

SQL

43

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 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. Datorit acestei situaii, 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);

44

Oracle

ORA-01400: mandatory (NOT NULL) column is missing or NULL during insert

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). 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: 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).

SQL

45

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 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;

46

Oracle

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 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).

SQL

47

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 disponibile utilizatorului (USER_ALL_TABLES), informaii despre constrngerile definite de utilizator(USER_CONSTRAINTS), informaii despre legturile bazei de date (USER_DB_LINKS), 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.

48

Oracle

Limbajul de manipulare a datelor


SQL furnizeaz comenzi ce permit consultarea (SELECT) i actualizarea (INSERT, UPDATE, DELETE) coninutului bazei de date. Aceste comenzi definesc limbajul de manipulare a datelor (LMD).

Comenzile limbajului LMD pot fi: formulate direct, utiliznd interfaa SQL*PLUS ; utilizate n utilitare ale sistemului ORACLE; ncapsulate ntr-un program PL/SQL ;

ncapsulate ntr-un program scris n limbaj gazd. n funcie de momentul n care se dorete realizarea actualizrilor asupra bazei de date, utilizatorul poate folosi una din urmtoarele comenzi: SET AUTOCOMMIT ON schimbrile se efectueaz imediat; SET AUTOCOMMIT OFF schimbrile sunt pstrate ntr-un buffer pn la execuia uneia din comenzile: COMMIT, care are rolul de a permanentiza schimbrile efectuate; ROLLBACK, care determin renunarea la schimbrile realizate.

SQL

49

Comanda INSERT
INSERT INTO nume_tabel / nume_view [(col1[, col2[,]])] VALUES (expresia1[, expresia2[,]]) / subcerere;

expresia1, expresia2, reprezint expresii a cror evaluare este atribuit coloanelor precizate (se insereaz o linie); subcerere, reprezint o interogare (se insereaz una sau mai multe linii).

Observaii: Dac lipsete specificaia coloanelor se consider c sunt completate toate cmpurile tabelului sau vizualizrii. Dac nu a fost specificat lista coloanelor i dac exist cmpuri care nu au valori efective, atunci valoarea null va fi atribuit acestor cmpuri. Dac se introduc date doar n anumite coloane, atunci aceste coloane trebuie specificate. n restul coloanelor se introduce automat null. Specificarea cererii din comanda INSERT determin copierea unor date dintr-un tabel n altul pe attea linii cte au rezultat din cerere. Dac se introduc numai anumite cmpuri ntr-o nregistrare, atunci printre acestea trebuie s se gseasc cmpurile cheii primare. Pentru a putea executa comanda INSERT este necesar ca utilizatorul care execut aceast instruciune s aib privilegiul de a insera nregistrri n tabel sau n vizualizare.

Exemplu: S se insereze n tabelul carte toate crile din tabelul carte_info, presupunnd c tabelul carte_info a fost deja creat. De asemenea, s se introduc o nou carte creia i se cunoate codul (c34), titlul (algebra) i preul (500). Soluie: INSERT INTO SELECT FROM INSERT INTO VALUES Exemplu: carte * carte_info; carte(codel,titlu,autor,nrex,pret,coded) (c34,algebra,null,null,500,null);

50

Oracle

INSERT VALUES INSERT VALUES

INTO carte(codel, nrex) ('c25', 25); INTO domeniu ('&cod','&intdom');inserare prin parametrizare

Exemplu: Presupunnd c tabelul salariat a fost completat cu datele tuturor salariailor editurii, s se completeze tabelele grafician, tehnoredactor i redactor_sef, n concordan cu datele coninute n tabelul salariat (nu pot exista graficieni, tehnoredactori sau redactori efi care s nu fie salariai!). Soluie: INSERT SELECT FROM WHERE INSERT SELECT FROM WHERE INSERT SELECT FROM WHERE INTO grafician (cod_salariat) cod_salariat salariat job = grafician; INTO tehnoredactor (cod_salariat) cod_salariat salariat job = tehnoredactor; INTO redactor_sef (cod_salariat) cod_salariat salariat job = redactor_sef;

Exemplu: Se dorete ca toi graficienii avnd salariile mai mari dect media salariilor s colaboreze la realizarea tuturor frame-urilor din publicaii coordonate de redactori efi avnd vechimea maxim. S se completeze tabelul realizeaza cu nregistrrile corespunztoare. Soluie: INSERT SELECT FROM WHERE INTO realizeaza (cod_salariat, nr_publicatie, nr_capitol, nr_frame) s.cod_salariat,f.nr_publicatie, f.nr_capitol, f.nr_frame salariat s, frame f s.salariu > (SELECT AVG(s1.salariu)

SQL

51

AND AND

FROM salariat s1) job = 'grafician' f.nr_publicatie IN (SELECT p.nr_publicatie FROM salariat s2, publicatie p WHERE s2.cod_salariat = p.cod_salariat AND s2.vechime = (SELECT MAX(s3.vechime) FROM salariat s3));

Comanda DELETE
DELETE [WHERE [FROM] tablename / viewname condiie]

Observaii: Pentru a se putea executa instruciunea DELETE, utilizatorul care o lanseaz n execuie trebuie s aib acest privilegiu. Comanda DELETE nu terge structura tabelului. n clauza WHERE pot fi folosite i subcereri. Comanda nu poate fi folosit pentru tergerea valorilor unui cmp individual. Acest lucru se poate realiza cu ajutorul comenzii UPDATE. Atenie la tergere, pentru a nu afecta integritatea referenial! Exemplu: S se elimine cititorii care au numele Popai care au restituit ast zi cel pu in o carte. DELETE FROM WHERE OR cititor nume=Popa codec IN (SELECT FROM WHERE cei

codec imprumuta data_ef=SYSDATE);

Exemplu: S se tearg toi tehnoredactorii care colaboreaz la mai puin de trei publicaii.

52

Oracle

DELETE FROM salariat WHERE job = tehnoredactor AND COUNT (SELECT DISTINCT c.nr_publicatie FROM capitol c WHERE c.cod_salariat = cod_salariat)< 3;

Comanda UPDATE
Valorile cmpurilor care trebuie modificate pot fi furnizate explicit sau pot fi obinute n urma unei cereri SQL. UPDATE SET [WHERE tablename / viewname (column1[,column2[,]]) = (subquery) / column = expr / (query) condition]

Observaii: Pentru a se putea executa instruciunea UPDATE, utilizatorul care o lanseaz n execuie trebuie s aib acest privilegiu. Dac nu este specificat clauza WHERE se vor modifica toate liniile. Cererea trebuie s furnizeze un numr de valori corespunztor numrului de coloane din paranteza care precede caracterul de egalitate.

Exemplu: Preul crilor scrise de Lucian Blaga s fie modificat, astfel nct s fie egal cu preul celei mai scumpe cri de informatic din bibliotec. Soluie: UPDATE SET WHERE carte pret = (SELECT MAX(pret) FROM carte WHERE coded = I) autor = Lucian Blaga;

Exemplu: S se modifice preul crilor din bibliotec, care se gsesc ntr-un numr de exemplare mai mic dect media numrului de exemplare pe bibliotec. Noua valoare a preului s fie egal cu suma preurilor crilor scrise de Zola.

SQL

53

Soluie: UPDATE SET WHERE

carte pret = (SELECT FROM WHERE nrex < (SELECT FROM

SUM(pret) carte autor = Zola) AVG(nrex) carte);

Exemplu: S se mreasc cu 5% salariile redactorilor efi care coordoneaz publicaia care are cel mai mare numr de frame-uri. Soluie: UPDATE salariat SET salariu = 1,05*salariu WHERE cod_salariat IN (SELECT cod_salariat FROM publicatie WHERE nr_publicatie IN (SELECT nr_publicatie FROM frame GROUP BY nr_publicatie HAVING COUNT(*) > ANY (SELECT COUNT(*) FROM frame GROUP BY nr_publicatie))); Exemplu: S se reduc cu 10% salariile redactorilor efi care nu sunt asociai nici unei publicaii. Soluie: UPDATE SET WHERE salariat salariu = 0,9*salariu cod_salariat IN (SELECT cod_salariat FROM redactor_sef WHERE cod_salariat NOT IN (SELECT cod_salariat FROM publicatie));

54

Oracle

Comanda SELECT
SELECT FROM [WHERE [START WITH [CONNECT BY [GROUP BY [HAVING [ORDER BY [FOR UPDATE [ALL | DISTINCT] {* | list de atribute selectate | expr AS alias} { [schema.]{tabel [PARTITION (partition_name)] | [THE] (subquery)} [alias_tabel] } condiie] condiie] condiie] list de expresii condiie]] {expresie | poziie | c_alias} [ASC | DESC]] [OF [schema.]{table | view}.coloan] [NOWAIT]

Clauzele START WITH i CONNECT BY sunt utile pentru a construi cereri ierarhizate. Pentru a specifica nregistrarea rdcin a arborelui se va folosi clauza START WITH. Dac aceast clauz este omis fiecare nregistrare din tabel poate fi considerat ca nregistrare de start. Cu ajutorul clauzei CONNECT BY se pot specifica coloanele (printe i copil) care particip la relaie. Prin ordinea apariiilor acestor coloane (n condiie) se poate determina ordinea de parcurgere a structurii arborescente (top-down sau bottom-up). Prin folosirea operatorului PRIOR se poate face referin la nregistrarea printe. Clauza FOR UPDATE permite blocarea coloanei (coloanelor) nainte de a actualiza sau terge nregistrri din tabelele bazei de date. Prin folosirea clauzei NOWAIT se va genera o excepie i nu se va mai atepta pn la ridicarea blocajelor de pe nregistrri. Operatorii utilizai (n ordinea prioritii de execuie) sunt: operatori aritmetici (unari sau binari), operatorul de concatenare ( || ), operatorii de comparare (=, !=, ^=, < >, >, >=, <, <=, IN (echivalent cu =ANY, adic egal cu cel puin una din valorile listei), NOT IN (echivalent cu !=ALL, adic diferit de toate elementele listei), ALL, [NOT] BETWEEN x AND y, [NOT] EXISTS, [NOT] LIKE, IS [NOT] NULL, operatori logici (NOT, AND, OR).

SQL

55

Limbajul permite prezena unor instruciuni SELECT imbricate n oricare din clauzele WHERE, HAVING sau FROM (instruciunile SELECT care apar n clauzele respective se numesc subcereri). n cazul folosirii subcererilor, pot fi utilizai operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ANY), care sunt specifici cererilor ce returneaz mai multe linii (multiple-row subquery) sau operatorii de comparaie =, <, >, >=, <=, <>, specifici cererilor care returneaz o singur linie (single-row subquery). Executarea subcererilor se poate face:

fie cu sincronizare (corelat evaluarea subcererii face referin la o coloan a cererii principale i cererea interioar se execut pentru fiecare linie a cererii principale care o conine); fie fr sincronizare (ncuibrit se execut mai nti cererea interioar, iar rezultatul ei este transmis cererii de nivel imediat superior).

Exemplu: n ce interogri este necesar utilizarea cuvntului cheie HAVING?


A. B. C. D.

cnd este necesar s eliminm linii duble din rezultat; cnd este necesar s ordonm mulimea rezultat; cnd este necesar s efectum un calcul pe grup; cnd este necesar s restricionm grupurile de linii returnate.

Cereri mono relaie


Exemplu: SELECT FROM Exemplu: SELECT FROM WHERE dateresdataim imprumuta; numar zile

codel imprumuta datares >= 01JAN99;

Exemplu: S se obin titlurile i numrul de exemplare ale crilor scrise de autorii al cror nume ncepe cu litera S. SELECT titlu, nrex FROM carte WHERE autor LIKE S%;

56

Oracle

Exemplu: S se afieze data i ora curent. SELECT TO_CHAR(SYSDATE,DD/MM/YY HH24:MI:SS) FROM DUAL; Exemplu: Utiliznd ideea c directorul este salariatul care nu are ef, s se tipreasc numele directorului. SELECT ename,NVL(TO_CHAR(mgr),Nu are sef) FROM emp WHERE mgr IS NULL; Exemplu: S se afieze codurile cititorilor care nu au mprumutat cri ntr-un interval precizat. SELECT DISTINCT codec FROM imprumuta WHERE dataim NOT BETWEEN &d1 AND &d2; Clauza GROUP BY Exemplele care urmeaz arat modul general de constituire a subansamblelor virtuale folosind clauza GROUP BY. Fiecare expresie care apare n SELECT trebuie s aib aceeai valoare pentru toate liniile care aparin aceleiai partiii. Numele coloanelor din GROUP BY nu trebuie s figureze obligatoriu n lista de la SELECT. Exemplu: S se obin numrul de cte ori a fost mprumutat fiecare carte. SELECT codel, COUNT(*) FROM imprumuta GROUP BY codel; Exemplu: Pentru fiecare domeniu de carte s se obin numrul crilor din domeniu, media preurilor i numrul total de exemplare. SELECT coded,COUNT(*),AVG(pret),SUM(nrex) FROM carte GROUP BY coded;

SQL

57

Dac n comanda SELECT apar atribute coloan (nu funcii grup) i se utilizeaz clauza GROUP BY atunci aceste coloane trebuie obligatoriu s apar n clauza GROUP BY. Exemplu: S se obin pentru fiecare autor, media preurilor crilor din bibliotec. SELECT autor, AVG(pret) FROM carte GROUP BY autor; Exemplu: Pentru departamentele n care salariul maxim depete 5000$ s se obin codul acestor departamente i salariul maxim pe departament. SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING MAX(sal)>5000; Exemplu: S se afieze numele i salariul celor mai prost pltii angajai din fiecare departament. SELECT ename, sal FROM emp WHERE (deptno, sal) IN (SELECT deptno, MIN(sal) FROM emp GROUP BY deptno); Exemplu: S se obin pentru fiecare carte, codul su i numrul de exemplare care nu au fost nc restituite. SELECT codel, COUNT(*) FROM imprumuta WHERE dataef IS NULL GROUP BY codel; Exemplu: S se obin numrul crilor mprumutate cel puin o dat.

58

Oracle

SELECT FROM

COUNT(DISTINCT codel) imprumuta;

Exemplu: S se afieze numrul crilor mprumutate cel puin de dou ori (pentru fiecare carte mprumutat mai mult dect o dat s se obin numrul de cte ori a fost mprumutat). SELECT COUNT(COUNT(codel)) FROM imprumuta GROUP BY codel HAVING COUNT(*)>1; n cererea anterioar COUNT(codel), reprezint numrul care arat de cte ori a fost mprumutat fiecare carte, iar COUNT(COUNT(codel)), reprezint numrul total al crilor mprumutate. Exemplu: Lista codurilor cititorilor care au mai mult de 3 cri nerestituite la termen. SELECT codec FROM imprumuta WHERE dataef IS NULL AND datares < SYSDATE GROUP BY codec HAVING COUNT(*) > 2; Exemplu: Pentru fiecare domeniu de carte care conine cel puin o carte i unde preul oricrei cri nu depete o valoare dat, s se obin: codul domeniului, numrul crilor din domeniu i numrul mediu de exemplare. SELECT coded, COUNT(*), AVG(nrex) FROM carte GROUP BY coded HAVING COUNT(*) > 1 AND MAX(pret) < &pret_dat; Relaii ierarhice SQL permite afiarea rndurilor unui tabel innd cont de relaiile ierarhice care apar ntre rndurile tabelului. Parcurgerea n mod ierarhic a informaiilor se poate face doar la nivelul unui singur tabel. Operaia se realizeaz cu ajutorul clauzelor START WITH i CONNECT BY.

SQL

59

n comanda SELECT pot s apar clauzele: CONNECT BY {expresie = PRIOR expresie | PRIOR expresie = expresie} [START WITH conditie] Clauza CONNECT BY specific coloanele prin care se realizeaz relaia ierarhic. Operatorul PRIOR stabilete direcia n care este parcurs arborele. Dac apare n stnga, atunci arborele este parcurs de sus n jos, iar dac apare n dreapta arborele este parcurs de jos n sus. Clauza START WITH specific nodul (nregistrarea de nceput) arborelui. Dac lipsete, orice nod poate fi rdcin. Clauza SELECT poate conine pseudo-coloana LEVEL, care indic nivelul nregistrrii n arbore (ct de departe este de nodul rdcin). Nodul rdcin are nivelul 1, fii acestuia au nivelul 2 .a.m.d. Exemplu: Ierarhia poate fi reprezentat cu ajutorul unui tabel. Se presupune c fiecare salariat are un singur superior (este o ierarhie). S se afieze superiori ierarhic lui Ion. SELECT LEVEL, nume FROM salariat CONNECT BY nume = PRIOR nume_sef START WITH nume = (SELECT nume_sef FROM salariat WHERE nume = Ion);

Cereri multi relaie


Comanda SELECT ofer posibilitatea de a consulta informaii care provin din mai multe tabele. Operatorii care intervin n astfel de cereri pot fi: operatori pe mulimi (UNION, UNION ALL, INTERSECT, MINUS) sau operatori compunere care implementeaz diferite tipuri de join. Exist dou moduri de realizare a cererilor multi-relaie: forma procedural, n care trebuie indicat drumul de acces la informaie prin imbricarea de comenzi SELECT; forma relaional, n care drumul de acces la informaie este n sarcina sistemului. Exemplu: S se obin, utiliznd aceste dou forme, codurile i titlurile crilor mprumutate.

60

Oracle

a) Forma procedural (imbricare de comenzi SELECT):

codel, titlu carte codel IN (SELECT codel FROM imprumuta); b) Forma relaional: SELECT carte.codel, titlu FROM carte, imprumuta WHERE carte.codel = imprumuta.codel; Operatori pe mulimi (UNION, UNION ALL, INTERSECT, MINUS) Comenzile SELECT, care intervin n cereri ce conin operatori pe mulimi, trebuie s satisfac anumite condiii: toate comenzile SELECT trebuie s aib acelai numr de coloane; opiunea DISTINCT este implicit (excepie UNION ALL); numele coloanelor sunt cele din prima comand SELECT; dimensiunea coloanei implicit este cea mai mare dintre cele dou coloane; sunt admise combinaii de forma: 1. SELECT1 UNION SELECT2 INTERSECT SELECT3 i ordinea de execuie este de la stnga la dreapta; 2. SELECT1 UNION (SELECT2 INTERSECT SELECT3) i ordinea este dat de paranteze. Exemplu: S se obin, utiliznd operatorul INTERSECT, codurile crilor din care sunt mai puin de 15 exemplare i care au fost mprumutate de cel puin trei ori. SELECT codel FROM carte WHERE nrex < 15 INTERSECT SELECT codel FROM imprumuta GROUP BY codel HAVING COUNT(*) > 3; Exemplu: S se afieze codurile cititorilor care nu au mprumutat cri.

SELECT FROM WHERE

SQL

61

SELECT FROM MINUS SELECT FROM

codec cititor DISTINCT codec imprumuta;

Operaii de compunere Un join simplu (natural join) este o instruciune SELECT care returneaz linii din dou sau mai multe tabele. Este preferabil ca tabelul care are linii mai puine s fie al doilea n operaia de compunere. Comanda dureaz mai puin, dac tabela este indexat dup coloana, relativ la care se face compunerea. Compunerea a n tabele cere minim (n-1) condiii de join. Exemplu: S se obin codurile i titlurile crilor mprumutate. SELECT carte.codel, titlu FROM carte, imprumuta WHERE carte.codel = imprumuta.codel; S-ar putea ca tabelele legate prin operaia de compunere s nu aib coloane comune (non-equijoin). n acest caz n clauza WHERE nu apare operatorul egalitate i sunt folosii operatorii: <=, >=, BETWEEN. Pentru a simplifica scrierea i pentru a elimina ambiguitile care pot s apar este necesar folosirea alias-ului pentru tabele. Alias-ul este valid doar pentru instruciunea SELECT curent. Exemplu: S se obin pentru fiecare salariat numele, salariul i grila de salarizare ( join). SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.lasal AND s.hisal; Exemplu: S se obin titlurile i preurile crilor mai scumpe dect cartea avnd titlul Baze de date, al crui autor este Oszu (self join). SELECT x.titlu, x.pret FROM carte x, carte y WHERE x.pret > y.pret AND y.titlu = Baze de date AND y.autor = Oszu;

62

Oracle

O alt variant de rezolvare a problemei, ca o cerere cu sincronizare: SELECT titlu, pret FROM carte x WHERE EXISTS (SELECT * FROM carte WHERE carte.titlu=Baze de date AND carte.autor=Oszu AND x.pret > pret); Exemplu: S se obin informaii despre cititorii al cror cod este mai mare dect codul unui cititor avnd un nume dat. a) Forma procedural: SELECT * FROM cititor WHERE codec > (SELECT codec FROM cititor WHERE nume=&nume1); b) Forma relaional: SELECT c2.* FROM cititor c1, cititor c2 WHERE c1.nume = &nume1 AND c2.codec > c1.codec; Dac o linie nu satisface condiia de join, atunci linia respectiv nu va apare n rezultatul cererii. Pentru a evita aceast pierdere, n algebra relaional a fost introdus operatorul outer-join. Un outer-join (join extern) este reprezentat prin operatorul (+) care este plasat n clauza WHERE dup numele tabelului ale crui linii trebuie s nu se piard din rezultatul cererii. Semnul (+) poate fi plasat n oricare parte a condiiei din clauza WHERE, ns nu n ambele pri. Efectul operatorului (+) este c se genereaz valori null pentru coloanele tabelului lng care apare scris, ori de cte ori tabelul nu are nici o linie care s poat fi reunit cu o linie din cellalt tabel. Exemplu: S se obin titlurile crilor i numele domeniului cruia i aparin, remarcnd situaiile n care domeniul nu ar avea cri (dac domeniul este fr cri atunci apare null la titlul crii).

SQL

63

SELECT FROM WHERE

titlu, intdom carte, domeniu carte.coded(+) = domeniu.coded;

Exemplu: Considerm c tabelele dept i emp au urmtorul coninut: dept emp deptno 1 2 dname algebra analiza empno 101 102 103 105 106 deptno null null null 1 1

Interogarea urmtoare furnizeaz lista tuturor salariailor, inclusiv a celor care nu sunt asignai nici unui departament (right outher join). SELECT a.deptno, a.dname, b.empno, b.deptno FROM dept a, emp b WHERE a.deptno(+) = b.deptno; Rezultatul cererii anterioare va fi: a.deptno a.dname b.empno b.deptno 101 102 103 1 algebra 105 1 1 algebra 106 1 Interogarea urmtoare afieaz lista departamentelor, inclusiv a celor care nu au salariai (left outer join). SELECT a deptno, a.dname, b.empno, b.deptno FROM dept a, emp b WHERE a.deptno = b.deptno(+); Rezultatul cererii anterioare va fi: a.deptno a.dname b.empno 1 algebra 105 1 algebra 106 2 analiza null b.deptno 1 1 null

64

Oracle

Interogarea urmtoare produce ca rezultat departamentele, chiar i cele fr funcionari, i funcionarii, chiar i cei care nu sunt asignai nici unui departament (full outer join). SELECT NVL(TO_CHAR(b.empno),***) id, NVL(a.dname,***) nume_dep FROM dept a, emp b WHERE a.deptno = b.deptno(+) UNION SELECT NVL(TO_CHAR(b.empno),***) id, NVL(a.dname,***) nume_dep FROM dept a, emp b WHERE a.deptno(+) = b.deptno; Rezultatul cererii va fi: id *** 101 102 103 105 106 Subcereri De cele mai multe ori, pentru a implementa anumite interogri, nu este suficient o singur cerere SELECT ci sunt necesare subcereri. Subcererile sunt comenzi SELECT ncapsulate n oricare din clauzele WHERE, HAVING, FROM. Dac subcererea urmeaz clauzei WHERE sau HAVING, ea poate conine unul dintre operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ALL) care sunt specifici cererilor care ntorc mai multe linii (multiple-row subquery) sau unul dintre operatorii de comparare (=, <, >, >=, <=, <>) care sunt specifici cererilor care ntorc o singur linie (single-row subquery). Subcererile trebuie incluse ntre paranteze i trebuie plasate n partea dreapt a operatorului de comparare. Subcererea nu poate conine ORDER BY. Exemplu: S se obin numele i salariul angajailor, avnd salariul minim. SELECT ename, sal nume_dep analiza *** *** *** algebra algebra

SQL

65

FROM WHERE

emp sal=(SELECT FROM

MIN(sal) emp);

Exemplu: S se obin job-ul i salariul minim. SELECT job, AVG(sal) FROM emp GROUP BY job HAVING AVG(sal)=(SELECT FROM GROUP BY

MIN(AVG(sal)) emp job);

Exemplu: S se gseasc salariaii din fiecare departament, care au salariul minim n departamentul respectiv. SELECT ename, sal, deptno FROM emp WHERE sal IN (SELECT MIN(sal) FROM emp GROUP BY deptno); Operatorul ANY presupune c este adevrat condiia dac comparaia este adevrat pentru cel puin una din valorile returnate. Sunt evidente relaiile: < ANY mai mic ca maximul; > ANY mai mare ca minimul; = ANY IN. Pentru operatorul ALL se presupune c este adevrat condiia, dac comparaia este adevrat pentru toate elementele listei returnate. Pentru operatorul ALL sunt evidente relaiile: < ALL mai mic ca minimul; > ALL mai mare ca maximul; ! = ALL NOT IN. Exemplu: WHERE codec > ALL (C1, C2) este superior tuturor elementelor din list; WHERE codec > ANY (C1, C2) este superior cel puin unui element din list. Exemplu:

66

Oracle

S se obin salariaii al cror salariu este mai mare ca salariile medii din toate departamentele. SELECT ename, job FROM emp WHERE sal > ALL(SELECT AVG(sal) FROM emp GROUP BY deptno); Exist subcereri care au ca rezultat mai multe coloane (multiple-column subquery). Aceste interogri au urmtoarea sintax general: SELECT col,col, FROM tabel WHERE (col,col,) IN (SELECT col,col, FROM tabel WHERE condiie); Exemplu: S se obin numele, numrul departamentului, salariul i comisionul tuturor funcionarilor ale cror salarii i comisioane coincid cu salariile i comisioanele unor salariai din departamentul 7. SELECT ename, deptno, sal, com FROM emp WHERE (sal,NVL(com,-1)) IN (SELECT sal,NVL(com,-1) FROM emp WHERE deptno = 7); Rezultatul acestei interogri este diferit de rezultatul urmtoarei interogri: SELECT ename, deptno, sal, com FROM emp WHERE sal IN (SELECT sal FROM emp WHERE deptno=7) AND NVL(com,-1) IN (SELECT NVL(com,-1) FROM emp WHERE deptno=7); Dac una din valorile returnate de subcerere este valoarea null atunci cererea nu ntoarce nici o linie. Prin urmare, dac valoarea null poate s fac parte din

SQL

67

rezultatul subcererii nu trebuie utilizat operatorul NOT IN. Problema nu mai apare dac se utilizeaz operatorul IN. Exemplu: S se obin salariaii care nu au subordonai. SELECT e.ename FROM emp e WHERE e.empno NOT IN (SELECT FROM

m.mgr emp m);

n acest caz, instruciunea SQL nu ntoarce nici o linie deoarece una din valorile furnizate de subcerere este valoarea null. Exemplu: S se obin numele salariailor, salariile, codul departamentului n care lucreaz i salariul mediu pe departament pentru toi angajaii care au salariul mai mare ca media salariilor din departamentul n care lucreaz (folosirea subcererii n clauza FROM). SELECT a.ename,a.sal,a.deptno,b.salavg FROM emp a,(SELECT deptno,avg(sal) salavg FROM emp GROUP BY deptno) b WHERE a.deptno=b.deptno AND a.sal>b.salavg Exemplu: S se obin lista celor mai scumpe cri. SELECT titlu FROM carte WHERE pret = (SELECT MAX(pret) FROM carte); Exemplu: S se obin lista scriitorilor care au n bibliotec un numr de exemplare mai mare dect numrul mediu al crilor din bibliotec. SELECT DISTINCT autor FROM carte WHERE nrex > (SELECT AVG(nrex) FROM carte);

68

Oracle

Exemplu: S se obin informaii despre crile al cror pre depete media preurilor crilor ce aparin aceluiai domeniu SELECT * FROM carte c WHERE pret > (SELECT AVG(pret) FROM carte WHERE coded = c.coded); Exemplu: S se obin lista cititorilor care au mprumutat cel puin o carte. SELECT nume FROM cititor WHERE codec IN (SELECT DISTINCT codec FROM imprumuta); Exemplu: S se obin codurile cititorilor care nu au mprumutat niciodat cri. SELECT codec FROM cititor WHERE codec NOT IN (SELECT DISTINCT codec FROM imprumuta); Exemplu: S se obin lista cititorilor care sunt n ntrziere cu predarea crilor. SELECT nume FROM cititor WHERE codec IN (SELECT DISTINCT codec FROM imprumuta WHERE dataef IS NULL AND dares<SYSDATE); Exemplu: S se obin numele cititorilor care au mprumutat cel puin o carte scris de ZOLA. SELECT nume FROM cititor WHERE codec IN (SELECT DISTINCT codec

SQL

69

FROM imprumuta WHERE codel IN (SELECT codel FROM carte WHERE autor=ZOLA)); Exemplu: S se obin numele cititorilor ZOLA. SELECT nume FROM cititor WHERE codec NOT IN (SELECT FROM WHERE care nu au mprumutat nici o carte scris de

DISTINCT codec imprumuta codel IN (SELECT codel FROM carte WHERE autor=ZOLA));

Operatorul IN poate fi nlocuit cu = ANY (un element este n list dac i numai dac este egal cu un element al listei), iar operatorul NOT IN poate fi nlocuit prin !=ALL. Exemplu: S se obin codurile cititorilor care au mprumutat o carte de algebr. SELECT DISTINCT codec FROM imprumuta WHERE codel IN (SELECT codel FROMcarte WHERE coded= (SELECT coded FROM domeniu WHERE intdom=ALGEBRA)); Exemplu: S se obin cititorii care au mprumutat numai cri scrise de ZOLA. SELECT nume FROM cititor WHERE codec NOT IN

70

Oracle

(SELECT DISTINCT codec FROM imprumuta WHERE codel NOT IN (SELECT codel FROM carte WHERE autor=ZOLA)); Exemplu: S se obin numele cititorilor care au mprumutat cel puin o carte de informatic (procedural). SELECT nume FROM cititor WHERE codec IN (SELECT DISTINCT codec FROM imprumuta WHERE codel IN (SELECT codel FROM carte WHERE coded= (SELECT coded FROM domeniu WHERE intdom= INFORMATICA))); Exemplu: S se obin, utiliznd sincronizarea subcererii cu cererea principal, titlurile crilor care au toate exemplarele mprumutate (se selecteaz un titlu din carte i pentru acest titlu se numr cte exemplare sunt mprumutate). SELECT titlu FROM carte WHERE nrex=(SELECT COUNT(*) FROM imprumuta WHERE codel = carte.codel AND dataef IS NULL); Exemplu: S se obin titlurile crilor al cror pre depete media preurilor crilor din domeniul respectiv. SELECT titlu FROM carte c

SQL

71

WHERE

pret > (SELECT FROM WHERE

AVG(pret) carte coded = c.coded);

Exemplu: S se obin codurile cititorilor i codul ultimei cri mprumutate. SELECT codec, codel FROM imprumuta i WHERE dataim>=ALL (SELECT dataim FROM imprumuta WHERE codec=i.codec); Pentru aceast interogare, clauza WHERE putea fi scris i sub forma: WHERE dataim=(SELECT MAX(dataim) FROM imprumuta WHERE codec=i.codec); Exemplu: S se obin lista codurilor crilor mprumutate i codul primului cititor care a mprumutat aceste crti. SELECT codel,codec FROM imprumuta i WHERE dataim<=ALL (SELECT dataim FROM imprumuta WHERE i.codel=codel); Exemplu: S se obin codurile crilor din care cel puin un exemplar este mprumutat. SELECT codel FROM carte WHERE EXISTS (SELECT codel FROM imprumuta WHERE codel = carte.codel AND dataef IS NULL); Operatorul WHERE EXISTS (subcerere) presupune c predicatul este adevrat dac subcererea ntoarce cel puin un tuplu, iar WHERE NOT EXISTS (subcerere) presupune c predicatul este adevrat dac subcererea nu ntoarce nici un tuplu. EXISTS i NOT EXISTS cer sincronizarea subcererii.

72

Oracle

Exemplu: S se obin titlurile crilor care sunt momentan mprumutate. Soluia 1 (cu sincronizare): SELECT titlu FROM carte WHERE EXISTS (SELECT FROM WHERE AND Soluia 2 (fr sincronizare): SELECT titlu FROM carte WHERE codel IN (SELECT FROM WHERE

* imprumuta codel = carte.codel dataef IS NULL);

DISTINCT codel imprumuta dataef IS NULL);

Exemplu: S se obin codurile crilor care nu au fost mprumutate niciodat. Soluia 1 (cu sincronizare) SELECT codel FROM carte WHERE NOT EXISTS (SELECT codel FROM imprumuta WHERE codel = carte.codel); Soluia 2 (fr sincronizare) SELECT codel FROM carte WHERE codel NOT IN (SELECT FROM

DISTINCT codel imprumuta);

Exemplu: S se obin lista salariailor avnd salariul minim n departamentul n care lucreaz. SELECT ename,sal

SQL

73

FROM WHERE

emp e sal=(SELECT FROM WHERE

MIN(sal) emp deptno=e.deptno);

Exemplu: S se obin numele primilor trei salariai avnd retribuia maxim (ideea rezolvrii este de a verifica dac numrul salariailor care au leafa mai mare dect leafa salariatului considerat, este mai mic dect 3). SELECT ename FROM emp a WHERE 3>(SELECT COUNT(*) FROM emp WHERE sal > a.sal); Exemplu: S se obin numele cititorilor care au mprumutat cel puin aceleai cri ca i cititorul avnd codul C19 (ideea problemei este de a selecta cititorii pentru care este vid lista crilor mprumutatede C19 mai puin lista crilor mprumutate de acei cititori). SELECT nume FROM cititor WHERE NOT EXISTS (SELECT codel FROM imprumuta WHERE codec=C19 MINUS SELECT codel FROM imprumuta WHERE codec= cititor.codec); Dac problema era modificat n sensul c cel puineste nlocuit prin cel mult atunci trebuiau inversate interogrile legate prin MINUS. Exemplu: S se obin codurile cititorilor care au mprumutat aceleai cri ca i cititorul avnd un cod specificat. Rezolvarea problemei se bazeaz pe urmtoarea idee: A = B A B i B A (A-B) = i (B-A) = A-B i B-A nu furnizeaz nici un tuplu rezultat. SELECT codec

74

Oracle

FROM WHERE

AND

AND

imprumuta i NOT EXISTS (SELECT codel FROM imprumuta WHERE codec=i.codec MINUS SELECT codel FROM imprumuta WHERE codec=&ccc) NOT EXISTS (SELECT codel FROM imprumuta WHERE codec=&ccc MINUS SELECT codel FROM imprumuta WHERE codec=i.codec) codec!=&ccc);

Ultimul operator (AND), asigur s nu apar n rezultat cititorul specificat. n cazul formei relaionale de rezolvare a cererii, drumul de acces la informaie este n sarcina SGBD-lui i prin urmare nu mai apar cereri imbricate. Exemplu: S se obin numele cititorilor care au mprumutat cel puin o carte. Soluia 1 (forma relaional): SELECT DISTINCT nume FROM cititor,imprumuta WHERE cititor.codec=imprumuta.codec; Soluia 2 (forma procedural): SELECT nume FROM cititor WHERE codec IN (SELECT DISTINCT codec FROM imprumuta); Exemplu: S se obin numele cititorilor care au mprumutat cel puin dou cri. Soluia 1 (forma relaional):

SQL

75

SELECT FROM WHERE GROUP BY HAVING

nume cititor, imprumuta cititor.codec=imprumuta.codec nume COUNT(*)>1;

Soluia 2 (forma procedural): SELECT nume FROM cititor WHERE codec IN (SELECT FROM GROUP BY HAVING

codec imprumuta codec COUNT(*)>1);

Exemplu: S se obin numele cititorilor i titlurile crilor de informatic mprumutate de aceti cititori. SELECT nume, titlu FROM cititor, carte, imprumuta, domeniu WHERE imprumuta.codel = carte.codel AND carte.coded = domeniu.coded AND imprumuta.codec = cititor.codec AND intdom = INFORMATICA; Exemplu: S se obin numele salariailor care nu cunosc nici o limb strin. SELECT nume, prenume FROM salariat WHERE NOT EXISTS (SELECT * FROM limba WHERE limba.cod_salariat = salariat.cod_salariat AND limba.limba_cun IS NOT NULL); Exemplu: S se afieze graficienii care au ntrziat s predea frame-urile. a) cu sincronizare: SELECT nume, prenume FROM salariat

76

Oracle

WHERE EXISTS (SELECT * FROM realizeaza r WHERE salariat.cod_salariat=r.cod_salariat AND data_lim < SYSDATE); b) fr sincronizare: SELECT nume, prenume FROM salariat WHERE cod_salariat IN (SELECT DISTINCT cod_salariat FROM realizeaza WHERE data_lim < SYSDATE); Exemplu: S se determine revistele coordonate de redactori efi care nu cunosc limba n care sunt scrise. Se tie c n urma inspectrii vizuale a rezultatului interogrii se poate decide schimbarea redactorilor efi ai revistelor respective, de aceea se dorete blocarea nregistrrilor gsite. SELECT p.nr_publicatie FROM salariat s, publicatie p WHERE s.cod_salariat = p.cod_salariat AND p.limba NOT IN (SELECT limba_cun FROM limba WHERE limba.cod_salariat = s.cod_salariat) FOR UPDATE OF p.cod_salariat;

Funcii n SQL
funcii pentru manipularea caracterelor, funcii aritmetice, funcii pentru manipularea datelor calendaristice, funcii de conversie, funcii grup funcii diverse.

Funcii de conversie

SQL

77

Conversiile pot fi fcute: implicit de ctre server-ul Oracle ; explicit de ctre utilizator. Conversii implicite n cazul atribuirilor, sistemul poate converti automat: VARCHAR2 sau CHAR n NUMBER ; VARCHAR2 sau CHAR n DATE; VARCHAR2 sau CHAR n ROWID; NUMBER, ROWID, sau DATE n VARCHAR2. Pentru evaluarea expresiilor, sistemul poate converti automat: VARCHAR2 sau CHAR n NUMBER, dac irul de caractere reprezint un numr; VARCHAR2 sau CHAR n DATE, dac irul de caractere are formatul implicit DD-MON-YY; VARCHAR2 sau CHAR n ROWID. Conversii explicite funcia TO_CHAR convertete data calendaristic sau informaia numeric n ir de caractere conform unui format; funcia TO_NUMBER convertete un ir de caractere n numr; funcia TO_DATE convertete un ir de caractere n dat calendaristic conform unui format. Dac formatul este omis, convertirea se face conform unui format implicit. Funcia TO_DATE are forma TO_DATE(ir_de_caractere [,fmt]). Funcia este utilizat dac se dorete conversia unui ir de caractere care nu are formatul implicit al datei calendaristice (DD-MON-YY). Alte funcii de conversie sunt: CHARTOROWID, CONVERT, HEXTORAW, RAWTOHEX, ROWIDTOCHAR etc., iar denumirea semnificativ arat rolul fiecreia. Exemplu: SELECT FROM TO_DATE(Feb 22,1981,Mon dd,YYYY) DUAL;

Funcii pentru manipularea caracterelor

LENGTH(string) returneaz lungimea irului de caractere string;

78

Oracle

LENGTHB(string) ndeplinete aceai funcie ca i LENGTH, cu deosebirea c returneaz numrul de octei ocupai; SUBSTR(string, start [,n]) returneaz subirul lui string care ncepe pe poziia start i are lungimea n; dac n nu este specificat, subirul se termin la sfritul lui string; LTRIM(string [,chars]) terge din stnga irului string orice caracter care apare n chars pn la gsirea primului caracter care nu este n chars; dac chars nu este specificat, se terg spaiile libere din stnga lui string; RTRIM(string [,chars]) este similar funciei LTRIM, cu excepia faptului c tergerea se face la dreapta irului de caractere; LPAD(string, length [,chars]) adaug chars la stnga irului de caractere string pn cnd lungimea noului ir devine length; n cazul n care chars nu este specificat, atunci se adaug spaii libere la stnga lui string; RPAD(string, length [,chars]) este similar funciei LPAD, dar adugarea de caractere se face la dreapta irului; REPLACE(string1, string2 [,string3]) returneaz string1 cu toate apariiile lui string2 nlocuite prin string3; dac string3 nu este specificat, atunci toate apariiile lui string2 sunt terse; INITCAP(string) transform primul caracter al irului n majuscul; INSTR(string, chars [,start [,n]]) caut n string, ncepnd de de la poziia start, a n-a apariie a secvenei chars i ntoarce poziia respectiv; dac start nu este specificat, cutarea se face de la nceputul irului; dac n nu este specificat, se caut prima apariie a secvenei chars; UPPER(string), LOWER(string) transform toate literele irului de caractere string n majuscule, respectiv minuscule; ASCII(char) returneaz codul ASCII al unui caracter; CHR(num) returneaz caracterul corespunztor codului ASCII specificat; CONCAT(string1, string2) realizeaz concatenarea a dou iruri de caractere; SOUNDEX(string) returneaz reprezentarea fonetic a irului de caractere specificat;

SQL

79

TRANSLATE(string, from, to) fiecare caracter care apare n irurile de caractere string i from este transformat n caracterul corespunztor (aflat pe aceeai poziie ca i n from) din irul de caractere to;

Funcii aritmetice
Cele mai importante funcii aritmetice sunt: ABS (valoarea absolut), ROUND (rotunjire cu un numr specificat de zecimale), TRUNC (trunchiere cu un numr specificat de zecimale), EXP (ridicarea la putere a lui e), LN (logaritm natural), LOG (logaritm ntr-o baz specificat), MOD (restul mpririi a dou numere specificate), POWER (ridicarea la putere), SIGN (semnul unui numr), COS (cosinus), COSH (cosinus hiperbolic), SIN(sinus), SQRT(rdcina ptrat), TAN(tangent), funciile LEAST i GREATEST, care returneaz cea mai mic, respectiv cea mai mare valoare a unei liste de expresii etc.

Funcii grup

AVG (media aritmetic), COUNT(*) (numrul de linii returnate de o cerere), COUNT (numrul valorilor unui expresii), SUM (suma valorilor unei expresii), MIN (valoarea minim a unei expresii), MAX (valoarea maxim a unei expresii), STDDEV (deviaia standard), VARIANCE (dispersia).

Observaii: Funciile grup opereaz pe un grup de linii i nu cer folosirea clauzei GROUP BY. Funciile grup ignor valorile null.

Orice funcie grup ntoarce o singur valoare. Ele ntorc valoarea null cnd sunt aplicate unei mulimi vide, cu excepia operatorului COUNT care ntoarce valoarea zero. Spre deosebire de funciile COUNT, MIN i MAX care pot fi aplicate unor cmpuri numerice sau nenumerice, restul funciilor grup se aplic doar cmpurilor numerice. Funciile grup pot s apar n lista de la SELECT sau n clauza HAVING.

80

Oracle

Exemplu: S se afieze numrul crilor distincte mprumutate. SELECT COUNT(DISTINCT codel) FROM imprumuta; Exemplu: Comanda care urmeaz este greit! De ce? SELECT titlu, COUNT(*) FROM carte; Exemplu: S se calculeze media preurilor crilor din bibliotec. SELECT AVG(pret) FROM carte;

Funcii pentru manipularea datelor calendaristice


SYSDATE returneaz data i timpul curent; ADD_MONTHS(d, count) returneaz data care este dup count luni de la data d; NEXT_DAY(d, day) returneaz urmtoarea dat dup data d, a crei zi a sptmnii este cea specificat prin irul de caractere day; LAST_DAY(d) returneaz data corespunztoare ultimei zile a lunii din care data d face parte; MONTHS_BETWEEN(d2, d1) returneaz numrul de luni dintre cele dou date calendaristice specificate; NEW_TIME(data, zona_intrare, zona_iesire) returneaz ora din zona_intrare corespunztoare orei din zona_iesire; ROUND(d) dac data d este nainte de miezul zilei, ntoarce data d cu timpul setat la ora 12:00 AM; altfel, este returnat data corespunztoare zilei urmtoare, cu timpul setat la ora 12:00 AM; TRUNC(d) ntoarce data d, dar cu timpul setat la ora 12:00 AM (miezul nopii); LEAST(d1, d2, , dn), GREATEST(d1, d2, , dn) returneaz, dintr-o list de date calendaristice, prima, respectiv ultima dat n ordine cronologic.

SQL

81

Exemplu: ROUND(25-jul-95, MONTH) este 01-AUG-95, ROUND(25-jul-95, YEAR) este 01-JAN-96, TRUNC(25-jul-95, MONTH) este 01-JUL-95, TRUNC(25-jul-95, YEAR) este 01-JAN-95. Utilizarea literelor mari sau mici n formatul unei date calendaristice precizeaz forma rezultatului. De exemplu, MONTH va da rezultatul MAY, iar Month va da rezultatul May. Pentru afiarea cmpurilor de tip dat calendaristic sau pentru calcule n care sunt implicate aceste cmpuri, exist funcii specifice. Cteva din elementele care apar n formatul unei date calendaristice sunt prezentate n tabelul urmtor. Format SS SSSSS MI HH HH24 DAY D DD DDD MM MON MONTH YY YYYY YEAR CC Q W WW Descriere Secunda relativ la minut Secunda relativ la zi Minut Ora Ora Ziua sptmnii Ziua sptmnii Ziua lunii Ziua anului Numrul lunii Numele prescurtat al lunii Luna Ultimele dou cifre ale anului Anul Anul n litere Secolul Numrul trimestrului Sptmna lunii Sptmna anului Rezultat Data Data
Domeniu

0-59 0-86399 0-59 0-12 0-24 SUNDAY-SATURDAY 1-7 1-31 (depinde de lun) 1-366 (depinde de an) 1-12 JAN-DEC JANUARY-DECEMBER de exemplu, 99 de exemplu, 1999 de exemplu, 17 1-4 1-5 1-52

Operaii cu date calendaristice Operaie Data + numr Data - numr Descriere Adaug un numr de zile la o dat Scade un numr de zile dintr-o dat

82

Oracle

Data - data Data + numar/24

Numr zile Data

Scade dou date calendaristice Adun un numr de ore la o dat

Funcii diverse

DECODE(value, if1, then1, if2, then2, , ifN, thenN, else) returneaz then1 dac value este egal cu if1, then2 dac value este egal cu if2 etc.; dac value nu este egal cu nici una din valorile if, atunci funcia ntoarce valoarea else (selecie multipl); NVL(e1, e2) dac e1 este NULL, returneaz e2; altfel, returneaz e1; UID returneaz ID-ul utilizatorului curent; USER returneaz username-ul utilizatorului curent; VSIZE(expr) returneaz numrul de octei ai unei expresii de tip DATE, NUMBER sau VARCHAR2; EMPTY_BLOB iniializeaz o variabil sau o coloan de tip BLOB; NLS_CHARSET_NAME(id_set_caractere) returneaz numele setului de caractere NLS asociat cu identificatorul setului transmis ca argument. Aceast funcie nu exist n versiuni anterioare Oracle8.

Exemplu: NVL(comision, 0) este 0 dac comisionul este null. Prin urmare, expresia salariu*12 + comision nu este corect, deoarece rezultatul su este null dac comisionul este null. Forma corect este salariu*12 + NVL(comision, 0). Exemplu: S se afieze preul modificat al unor cri n funcie de editur. Pentru crile din editura ALL s se dubleze preurile, pentru cele din editura UNIVERS s se tripleze preurile, iar pentru cele din editura XXX s se reduc la jumtate acest pre. SELECT pret,editura, DECODE(editura, ALL,pret*2, UNIVERS,pret*3, XXX,pret/2, pret) pret_revizuit FROM carte;

LIMBAJUL PENTRU CONTROLUL DATELOR

SQL

83

Sistemul de gestiune trebuie: s pun la dispoziia unui numr mare de utilizatori o mulime coerent de date;

s garanteze coerena datelor n cazul manipulrii simultane de ctre diferii utilizatori. Coerena este asigurat cu ajutorul conceptului de tranzacie. Tranzacia este unitatea logic de lucru constnd din una sau mai multe instruciuni SQL, care trebuie s fie executate atomic (ori se execut toate, ori nu se execut nici una!), asigurnd astfel trecerea BD dintr-o stare coerent n alt stare coerent. Dac toate operaiile ce constituie tranzacia sunt executate i devin efective, spunem c tranzacia este validat, iar modificrile aduse de tranzacie devin definitive. Dac dintr-un motiv sau altul (neverificarea condiiilor, accesul imposibil) o operaie a tranzaciei nu a fost executat spunem c tranzacia a fost anulat. Modificrile aduse de toate operaiile tranzaciei anulate sunt i ele anulate i se revine la starea bazei de date de dinaintea tranzaciei anulate. Este posibil ca o tranzacie s fie descompus n subtranzacii, astfel nct dac este necesar s se anuleze doar parial unele operaii. Fiecare tranzacie se poate termina: normal (commit); anormal (rollback). Controlul tranzaciilor const n: definirea nceputului i sfritului unei tranzacii, validarea sau anularea acesteia, eventual descompunere n subtranzacii.

Limbajul pentru controlul datelor (LCD) permite salvarea informaiei, realizarea fizic a modificrilor n baza de date, rezolvarea unor probleme de concuren. Limbajul conine urmtoarele instruciuni: COMMIT - folosit pentru permanentizarea modificrilor executate asupra BD (modificrile sunt nregistrate i sunt vizibile tuturor utilizatorilor); ROLLBACK - folosit pentru refacerea strii anterioare a BD (sunt anulate toate reactualizrile efectuate de la nceputul tranzaciei); SAVEPOINT - folosit n conjuncie cu instruciunea ROLLBACK, pentru definirea unor puncte de salvare n fluxul programului.

84

Oracle

O tranzacie const: dintr-o singur instruciune LDD; dintr-o singur instruciune LCD; din instruciuni LMD care fac schimbri consistente n date. Tranzacia ncepe: dup o comand COMMIT, dup o comand ROLLBACK, dup conectarea iniial la Oracle, cnd este executat prima instruciune SQL. Tranzacia se termin: dac sistemul cade; dac utilizatorul se deconecteaz dac se dau comenzile COMMIT sau ROLLBACK ; dac se execut o comand LDD. Dup ce se termin o tranzacie, prima instruciune SQL executabil va genera automat nceputul unei noi tranzacii. Un commit apare automat cnd este executat o comand LDD, sau o comand LCD, sau dup o ieire normal din SQL*Plus fr specificarea explicit a comenzilor COMMIT sau ROLLBACK. Un rollback apare automat dup o ieire anormal din SQL*Plus sau o cdere sistem. Din momentul n care s-a executat instruciunea COMMIT, BD s-a modificat (permanent) n conformitate cu instruciunile SQL executate n cadrul tranzaciei care tocmai s-a terminat. Din acest punct ncepe o nou tranzacie. Dac se folosete utilitarul SQL*Plus, exist posibilitatea ca dup fiecare comand LMD s aib loc o permanentizare automat a datelor (un COMMIT implicit). Acest lucru se poate realiza folosind comanda: SET AUTO[COMMIT] {ON | OFF] Comanda ROLLBACK permite restaurarea unei stri anterioare a BD. ROLLBACK [TO [SAVEPOINT] savepoint]; Dac nu se specific nici un savepoint, toate modificrile fcute n tranzacia curent sunt anulate, iar dac se specific un anumit savepoint, atunci doar

SQL

85

modificrile de la acel savepoint pn n momentul respectiv sunt anulate. Executarea unei instruciuni ROLLBACK presupune terminarea tranzaciei curente i nceperea unei noi tranzacii. Punctele de salvare pot fi considerate ca nite etichete care refer o submulime a schimbrilor dintr-o tranzacie, marcnd efectiv un punct de salvare pentru tranzacia curent. Server-ul Oracle implementeaz un punct de salvare implicit pe care l mut automat dup ultima comand LMD executat. Dac este creat un punct de salvare avnd acelai nume cu unul creat anterior, cel definit anterior este ters automat. SAVEPOINT savepoint; Exemplu: Comanda ROLLBACK nu va genera terminarea tranzaciei. COMMIT INSERT SAVEPOINT a UPDATE INSERT SAVEPOINT b DELETE ROLLBACK TO a Starea datelor nainte de COMMIT sau ROLLBACK este urmtoarea: starea anterioar a datelor poate fi recuperat; utilizatorul curent poate vizualiza rezultatele operaiilor LMD prin interogri asupra tabelelor; ali utilizatori nu pot vizualiza rezultatele comenzilor LMD fcute de utilizatorul curent (read consistency); nregistrrile afectate sunt blocate i, prin urmare, ali utilizatori nu pot face schimbri n datele acestor nregistrri. Execuia unei comenzi COMMIT implic anumite modificri. Toate schimbrile (INSERT, DELETE, UPDATE) din baza de date fcute dup anterioara comand COMMIT sau ROLLBACK sunt definitive. Comanda se refer numai la schimbrile fcute de utilizatorul care d comanda COMMIT. Toate punctele de salvare vor fi terse.

86

Oracle

Starea anterioar a datelor este pierdut definitiv. Toi utilizatorii pot vizualiza rezultatele. Blocrile asupra liniilor afectate sunt eliberate; liniile pot fi folosite de ali utilizatori pentru a face schimbri n date. Execuia unei comenzi ROLLBACK implic anumite modificri. Anuleaz tranzacia n curs i toate modificrile de date fcute dup ultima comand COMMIT. Sunt eliberate blocrile liniilor implicate. Nu terge un tabel creat prin CREATE TABLE. Eliminarea tabelului se poate realiza doar prin comanda DROP TABLE. Exemplu: Ce efect are urmtoarea secven de instruciuni? (a) SELECT * FROM salariat; (b) SAVEPOINT a;

(c) DELETE FROM salariat; INSERT INTO salariat VALUES (18,Breaban,Marin,4,5000, tehnored); INSERT INTO salariat VALUES (23,Popescu,Emil,7,40000,grafician); SAVEPOINT b; (d) INSERT INTO salariat VALUES (29,,,5,3000000,tehnoredactor); SELECT AVG(salariu) FROM salariat; (e) ROLLBACK TO SELECT FROM b; AVG(salariu) salariat;

(f) ROLLBACK TO a; INSERT INTO salariat VALUES (18,Ion,Mihai,5,580,redr_sef);

SQL

87

COMMIT; ntr-un sistem multi-user, sistemul Oracle furnizeaz read consistency la nivel de instruciune SQL, adic o singur comand SQL nu poate da rezultate care sunt contradictorii sau inconsistente. Read consistency asigur c fiecare utilizator vede datele aa cum existau la ultimul commit, nainte s nceap o operaie LMD. Prin urmare, modificrile efectuate asupra unei baze de date nu sunt vizibile dect dup ce operaia de actualizare a fost validat. Numai utilizatorul care a executat tranzacia poate vedea modificrile fcute de el n cursul acestei tranzacii.

Modelul multiversiune, furnizat de Oracle, asigur consistena la citire: garanteaz c setul de date vzut de orice instruciune SQL este consistent i nu se schimb n timpul execuiei unei instruciuni (Oracle asigur o consisten la citire la nivel de instruciune); operaiile de citire(SELECT) nu trebuie s vad datele care sunt n proces de schimbare; operaiile de scriere (INSERT, DELETE, UPDATE) nu trebuie s afecteze consistena datelor i s ntrerup sau s intre n conflict cu alte operaii de scriere concurente.

Cum se implementeaz modelul multiversiune? Dac asupra bazei este executat o comand LMD, server-ul Oracle face o copie a datelor dinainte de modificare i o depune n segmentul rollback. Toi utilizatorii (cu excepia celor care modific datele) vor vedea datele cum sunt nainte de modificare (vd coninutul segmentului rollback). Dac comanda LMD este commit, atunci schimbrile din baza de date devin vizibile oricrui utilizator care folosete instruciunea SELECT. Cnd se termin tranzacia, spaiul ocupat n segmentul rollback de vechea dat este liber pentru reutilizare. Server-ul Oracle asigur astfel o vizualizare consistent a datelor n orice moment. Blocrile sunt folosite n ORACLE pentru a asigura integritatea datelor, permind n acelai timp accesul concurent la date de ctre un numr infinit de utilizatori. Din punct de vedere a resursei blocate, blocrile pot fi: la nivel de linie (blocarea afecteaz un rnd); nivel de tabel (blocarea afecteaz ntreg tabelul).

88

Oracle

La nivel de rnd, blocrile se pot face numai n modul exclusiv (X), adic un utilizator nu poate modifica un rnd pn ce tranzacia care l-a blocat nu s-a terminat (prin permanentizare sau prin derulare napoi). Blocrile la nivel de tabel pot fi fcute n mai multe feluri, n funcie de caracterul mai mult sau mai puin restrictiv al blocrii (RS row share; RX row exclusive; S share; SRX share row exclusive; X exclusive). Modul X de blocare la nivel de tabel este cel mai restrictiv. Blocarea n mod X este obinut la executarea comenzii LOCK TABLE cu opiunea EXCLUSIVE. O astfel de blocare permite altor tranzacii doar interogarea tabelului. Tabelul nu mai poate fi blocat n acelai timp de nici o alt tranzacie n nici un mod. Modul de blocare RX arat c tranzacia care deine blocarea a fcut modificri asupra tabelului. O blocare RX permite acces (SELECT, INSERT, UPDATE, DELETE) concurent la tabel i blocarea concurent a tabelului de ctre alt tranzacie n modurile RS i RX. Modul de blocare S (se obine prin comanda LOCK TABLE cu opiunea SHARE) permite altor tranzacii doar interogarea tabelului i blocarea sa n modurile S i RS. Modul de blocare SRX (se obine prin comanda LOCK TABLE cu opiunea SHARE ROW EXCLUSIVE) permite altor tranzacii doar interogarea tabelului i blocarea sa n modul RS. Modul de blocare RS permite acces (SELECT, INSERT, UPDATE, DELETE) concurent la tabel i blocarea concurent a tabelului de ctre alt tranzacie n orice mod, n afar de X. Modul de blocare RS, care este cel mai puin restrictiv, arat c tranzacia care a blocat tabelul, a blocat rnduri din tabel i are intenia s le modifice. Din punct de vedere a modului de declanare a blocrii, blocrile pot fi: implicite (blocarea este fcut automat de sistem n urma unei operaii INSERT, DELETE sau UPDATE i nu necesit o aciune din partea utilizatorului); explicite (blocarea este declanat ca urmare a comenzilor LOCK TABLE sau SELECT cu clauza FOR UPDATE). Folosirea clauzei FOR UPDATE ntr-o comand SELECT determin blocarea rndurilor selectate n modul X i blocarea ntregului tabel (sau tabelelor) pe care se

SQL

89

face interogarea n modul RS. La actualizarea rndurilor (UPDATE) blocarea la nivel de linie se menine n timp ce blocarea la nivel de tabel devine RX. Exemplu: SELECT salariu FROM salariat WHERE cod_salariat = 1234 FOR UPDATE OF salariu; UPDATE SET WHERE COMMIT; La executarea primei comenzi, rndul cu cod_salariat = 1234 este blocat n mod X n timp ce tabelul salariat este blocat n modul RS. La executarea celei de a doua comenzi, blocarea la nivel de linie se menine n timp ce blocarea la nivel de tabel devine RX. La executarea comenzii COMMIT, tranzacia este permanentizat i toate blocrile sunt eliberate. Unul sau mai multe tabele pot fi blocate n oricare din modurile prezentate mai sus folosind comanda LOCK TABLE, care are sintaxa: LOCK TABLE nume_tabel [, nume tabel] IN mod_blocare MODE [NOWAIT] unde mod_blocare poate avea valorile ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE. Dac se specific NOWAIT i rndurile selectate sunt deja blocate de alt tranzacie, atunci utilizatorul este ntiinat de acest lucru, returnndu-i-se controlul. Datorit accesului concurent la date este posibil ca mai muli utilizatori s se blocheze reciproc. Aceast situaie este numit interblocare (deadlock), pentru c fiecare dintre utilizatori ateapt ca cellalt s elibereze resursa blocat. n cazul acesta problema nu se poate rezolva prin simpla ateptare, una din tranzacii trebuind s fie derulat napoi. Oracle detecteaz automat interblocrile. n acest caz, Oracle semnaleaz o eroare uneia dintre tranzaciile implicate i deruleaz napoi ultima instruciune din aceast tranzacie. Acest lucru rezolv interblocarea, dei cealalt tranzacie poate nc s atepte pn la deblocarea resursei pentru care ateapt. Care din urmtoarele comenzi ncheie o tranzacie? salariat salariu = 23456 cod_salariat = 1234;

90

Oracle

SELECT ROLLBACK UPDATE DELETE CREATE TABLE

S-ar putea să vă placă și