Documente Academic
Documente Profesional
Documente Cultură
Oracle
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.
Suprimarea unei legturi ntre dou BD, una local i una la distan:
DROP [PUBLIC] DATABASE LINK nume_legatura.
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;
comanda ;
comenzile GET i RUN;
comenzile GET i /.
Oracle
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;
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.
SQL
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
Oracle
Exemplu:
SELECT
FROM
WHERE
ORDER BY
&coloana
&tabel
&conditie
&ordine;
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
Parametrul variabila_sistem poate lua oricare din valorile care apar la
execuia comenzii SHOW ALL.
SQL
Oracle
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]]
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;
SQL
10
Oracle
SQL
11
Copierea datelor
Pentru a copia datele furnizate de o interogare ntr-un tabel aflat ntr-o baz
de date local sau la distan se poate folosi comanda COPY, care permite:
copierea unui tabel dintr-o baz local ntr-o baz distant (opiunea FROM
poate fi omis);
copierea unui tabel dintr-o baz distant ntr-o baz local (opiunea TO
poate fi omis);
copierea unui tabel dintr-o baz distant ntr-o baz distant.
COPY {FROM username[ /password]@ database_specification|
TO username[ /password]@ database_specification}
{APPEND | CREATE | INSERT | REPLACE}
destination_table [(column, column, ...)]
USING query
database_specification reprezint un ir de conectare SQL*Net;
APPEND insereaz liniile ntoarse de query n destination_table dac
acesta exist; n caz contrar, creeaz n prealabil tabelul;
CREATE insereaz liniile ntoarse de query n destination_table, dupa ce
creeaz tabelul; daca acesta deja exist, COPY returneaz o eroare;
INSERT insereaz liniile ntoarse de query n destination_table; dac
tabelul nu exist COPY returneaz o eroare; cnd se folosete opiunea
INSERT, clauza USING query trebuie s selecteze cte o coloan pentru
fiecare coloan din destination_table;
REPLACE nlocuiete destination_table i coninutul su cu liniile
ntoarse de query; dac destination_table nu exist, atunci COPY creaz
tabelul; altfel, COPY terge mai nti tabelul existent i l nlocuiete cu
un tabel ce conine datele copiate.
12
Oracle
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
SET ECHO ON
SET FEEDBACK ON
SQL
13
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
NUME
CONTRACT CONTRACT
------------------------------ ---------------ERBASU SA
107
20000
108
300000
109
750000
********************
--------VALOAREA MAXIMA
750000
TOTAL
1070000
Pagina 2
CONTRACTELE SUBANTREPRENORULUI GAUDI
LA DATA DE 14/10/2001
NUME
----------GAUDI
********************
VALOAREA MAXIMA
TOTAL
Pagina 3
NUMAR
CONTRACT
--------------104
105
106
VALOARE
CONTRACT
---------------500000
27000
10000
--------500000
537000
SQL
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
15
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
GROUP BY autor
/
CLEAR BREAKS
CLEAR COLUMNS
CLEAR COMPUTES
SET ECHO ON FEEDBACK ON
SQL
17
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.
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.
SQL
19
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.
20
Oracle
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>],
SQL
21
carte
CHAR(5),
VARCHAR2(30),
VARCHAR2(30),
NUMBER(8,2),
NUMBER(3),
CHAR(5));
carte
CHAR(5) PRIMARY KEY,
VARCHAR2(30),
VARCHAR2(30),
NUMBER(8,2),
NUMBER(3),
CHAR(5) NOT NULL
REFERENCES domeniu(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
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
AS SELECT
FROM
WHERE
carte_info
codel, titlu, autor
carte
coded = I;
SQL
23
Exemplu:
S se defineasc o constrngere la nivel de coloan prin care s se specifice
cheia primar i cheia extern.
CREATE TABLE carte
(codel
CHAR(5)
CONSTRAINT cp_carte PRIMARY KEY,
titlu
VARCHAR2(30),
coded
CHAR(5)
CONSTRAINT nn_coded NOT NULL
CONSTRAINT ce_coded
REFERENCES domeniu(coded));
Exemplu:
S se defineasc o constrngere la nivel de tabel prin care s se specifice
cheia primar i cheia extern.
CREATE TABLE carte
(codel
CHAR(5),
titlu
VARCHAR2(30),
coded
CHAR(5) NOT NULL,
CONSTRAINT cp_carte PRIMARY KEY (codel),
CONSTRAINT ce_coded
FOREIGN KEY (coded)
REFERENCES domeniu(coded));
Observaii
Liniile ce nu respect constngerea sunt depuse automat ntr-un tabel special.
Constrngerile previn tergerea unui tabel dac exist dependene.
Constrngerile pot fi create o dat cu tabelul sau dup ce acesta a fost creat.
Constrngerile pot fi activate sau dezactivate n funcie de necesiti.
Constrngeri declarative: constrngeri de domeniu, constrngerea de
integritate a entitii, constrngerea de integritate referenial.
Constrngerile de domeniu definesc valori luate de un atribut (DEFAULT,
CHECK, UNIQUE, NOT NULL).
constrngerea (coloan) DEFAULT ;
24
Oracle
SQL
25
26
Oracle
nume_tabel
(nume_coloana
nume_coloana
constrangere,
constrangere);
nume_tabel
(nume_coloana
nume_coloana
constrangere,
constrangere);
3. Pentru a suprima cheia primar sau alte constrngeri sunt utilizate formele:
ALTER
DROP
ALTER
DROP
TABLE
nume_tabel
PRIMARY KEY;
TABLE
nume_tabel
CONSTRAINT nume_constrangere;
SQL
27
carte
(rezumat LONG);
28
Oracle
cititor
cp_cititor
PRIMARY KEY (codec)
DISABLE;
cititor
cp_cititor;
SQL
29
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;
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.
30
Oracle
SQL
31
32
Oracle
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
FROM
WHERE
AND
a.index_name, a.column_name,
a.column_position poz, b.uniqueness
user_indexes b, user_ind_columns a
a.index_name = b.index_name
a.table_name = carte;
SQL
33
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:
34
Oracle
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
38
Oracle
SQL
39
40
Oracle
vederea2
nume, prenume, job
salariat;
vederea2
('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
WHERE
vederea2
nume = 'Popescun';
SQL
41
vederea4
s.cod_salariat,nume,prenume,tip
salariat s, grafician g
s.cod_salariat=g.cod_salariat;
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
VALUES
vederea4
42
Oracle
WHERE
cod_salariat = 3;
vederea4
tip = 'designer'
cod_salariat = 3;
Exemplu:
Care dintre coloanele unei vizualizri sunt actualizabile?
SELECT
FROM
WHERE
column_name, updatable
user_updatable_columns
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
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
SQL
43
Exemplu:
S se creeze o vizualizare care s conin coloanele cod_contractant, adresa,
telefon din tabelul contractant i coloanele nr_contract, tip_contract,
data_incheiere din tabelul contract. S se insereze o nregistrare n vizualizare.
CREATE VIEW
AS SELECT
FROM
WHERE
vederea44
c.cod_contractant, adresa, telefon,
co.nr_contract, tip_contract,
data_incheiere
contractant c, contract co
c.cod_contractant=co.cod_contractant;
vederea44(cod_contractant, adresa,
nr_contract, data_incheiere)
(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
VALUES
vederea44(nr_contract, tip_contract)
('6234', 0);
este creat o nregistrare, dar este modificat i tabelul contract. Dac la inserie nu
se specific cheia primar din contract:
INSERT INTO
VALUES
vederea44(tip_contract)
(1);
44
Oracle
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,
46
Oracle
SQL
47
48
Oracle
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:
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
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
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
SQL
51
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));
AND
AND
Comanda DELETE
DELETE
[WHERE
Observaii:
Pentru a se putea executa instruciunea DELETE, utilizatorul care o
lanseaz n execuie trebuie s aib acest privilegiu.
Exemplu:
S se elimine
care au restituit
DELETE FROM
WHERE
OR
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.
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]
SQL
55
Exemplu:
n ce interogri este necesar utilizarea cuvntului cheie HAVING?
A.
B.
C.
D.
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
FROM
WHERE
titlu, nrex
carte
autor LIKE S%;
56
Oracle
Exemplu:
S se afieze data i ora curent.
SELECT
FROM
TO_CHAR(SYSDATE,DD/MM/YY HH24:MI:SS)
DUAL;
Exemplu:
Utiliznd ideea c directorul este salariatul care nu are ef, s se tipreasc
numele directorului.
SELECT
FROM
WHERE
Exemplu:
S se afieze codurile cititorilor care nu au mprumutat cri ntr-un interval
precizat.
SELECT
FROM
WHERE
DISTINCT codec
imprumuta
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
autor, AVG(pret)
carte
autor;
Exemplu:
Pentru departamentele n care salariul maxim depete 5000$ s se obin
codul acestor departamente i salariul maxim pe departament.
SELECT
FROM
GROUP BY
HAVING
deptno, MAX(sal)
emp
deptno
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
FROM
WHERE
GROUP BY
codel, COUNT(*)
imprumuta
dataef IS NULL
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
FROM
GROUP BY
HAVING
COUNT(COUNT(codel))
imprumuta
codel
COUNT(*)>1;
codec
imprumuta
dataef IS NULL AND datares < SYSDATE
codec
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
FROM
GROUP BY
HAVING
AND
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
60
Oracle
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
FROM
WHERE
carte.codel, titlu
carte, imprumuta
carte.codel = imprumuta.codel;
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
FROM
WHERE
AND
AND
x.titlu, x.pret
carte x, carte y
x.pret > y.pret
y.titlu = Baze de date
y.autor = Oszu;
62
Oracle
titlu, pret
carte x
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
deptno
1
2
emp
dname
algebra
analiza
empno
101
102
103
105
106
deptno
null
null
null
1
1
a.dname
algebra
algebra
analiza
b.empno
105
106
null
b.deptno
1
1
null
64
Oracle
NVL(TO_CHAR(b.empno),***) id,
NVL(a.dname,***) nume_dep
dept a, emp b
a.deptno = b.deptno(+)
NVL(TO_CHAR(b.empno),***) id,
NVL(a.dname,***) nume_dep
dept a, emp b
a.deptno(+) = b.deptno;
nume_dep
analiza
***
***
***
algebra
algebra
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
SQL
65
FROM
WHERE
emp
sal=(SELECT
FROM
MIN(sal)
emp);
Exemplu:
S se obin job-ul i salariul minim.
SELECT
FROM
GROUP BY
HAVING
job, AVG(sal)
emp
job
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
FROM
WHERE
66
Oracle
S se obin salariaii al cror salariu este mai mare ca salariile medii din
toate departamentele.
SELECT
FROM
WHERE
ename, job
emp
sal > ALL(SELECT
FROM
GROUP BY
AVG(sal)
emp
deptno);
col,col,
tabel
(col,col,) IN (SELECT
FROM
WHERE
col,col,
tabel
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
FROM
WHERE
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
FROM
WHERE
e.ename
emp e
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
FROM
WHERE
AND
a.ename,a.sal,a.deptno,b.salavg
emp a,(SELECT
deptno,avg(sal) salavg
FROM
emp
GROUP BY deptno) b
a.deptno=b.deptno
a.sal>b.salavg
Exemplu:
S se obin lista celor mai scumpe cri.
SELECT
FROM
WHERE
titlu
carte
pret = (SELECT
FROM
MAX(pret)
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
FROM
WHERE
DISTINCT autor
carte
nrex > (SELECT
FROM
AVG(nrex)
carte);
68
Oracle
Exemplu:
S se obin informaii despre crile al cror pre depete media preurilor
crilor ce aparin aceluiai domeniu
SELECT
FROM
WHERE
*
carte c
pret > (SELECT
FROM
WHERE
AVG(pret)
carte
coded = c.coded);
Exemplu:
S se obin lista cititorilor care au mprumutat cel puin o carte.
SELECT
FROM
WHERE
nume
cititor
codec IN (SELECT DISTINCT codec
FROM
imprumuta);
Exemplu:
S se obin codurile cititorilor care nu au mprumutat niciodat cri.
SELECT
FROM
WHERE
codec
cititor
codec NOT IN
(SELECT DISTINCT codec
FROM
imprumuta);
Exemplu:
S se obin lista cititorilor care sunt n ntrziere cu predarea crilor.
SELECT
FROM
WHERE
nume
cititor
codec IN (SELECT
FROM
WHERE
AND
DISTINCT codec
imprumuta
dataef IS NULL
dares<SYSDATE);
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte scris de
ZOLA.
SELECT
FROM
WHERE
nume
cititor
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 care nu au mprumutat nici o carte scris de
ZOLA.
SELECT
FROM
WHERE
nume
cititor
codec NOT IN
(SELECT DISTINCT codec
FROM
imprumuta
WHERE
codel IN
(SELECT codel
FROM
carte
WHERE
autor=ZOLA));
DISTINCT codec
imprumuta
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
FROM
WHERE
nume
cititor
codec NOT IN
70
Oracle
titlu
carte
nrex=(SELECT
FROM
WHERE
AND
COUNT(*)
imprumuta
codel = carte.codel
dataef IS NULL);
Exemplu:
S se obin titlurile crilor al cror pre depete media preurilor crilor
din domeniul respectiv.
SELECT
FROM
titlu
carte c
SQL
71
WHERE
AVG(pret)
carte
coded = c.coded);
Exemplu:
S se obin codurile cititorilor i codul ultimei cri mprumutate.
SELECT
FROM
WHERE
codec, codel
imprumuta i
dataim>=ALL (SELECT
FROM
WHERE
dataim
imprumuta
codec=i.codec);
dataim=(SELECT
FROM
WHERE
MAX(dataim)
imprumuta
codec=i.codec);
Exemplu:
S se obin lista codurilor crilor mprumutate i codul primului cititor care
a mprumutat aceste crti.
SELECT
FROM
WHERE
codel,codec
imprumuta i
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
FROM
WHERE
codel
carte
EXISTS
(SELECT
FROM
WHERE
AND
codel
imprumuta
codel = carte.codel
dataef IS NULL);
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
*
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
FROM
WHERE
codel
carte
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
FROM
WHERE
ename
emp a
3>(SELECT
FROM
WHERE
COUNT(*)
emp
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
FROM
WHERE
nume
cititor
NOT EXISTS
(SELECT
FROM
WHERE
MINUS
SELECT
FROM
WHERE
codel
imprumuta
codec=C19
codel
imprumuta
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.
74
Oracle
SELECT
FROM
WHERE
AND
AND
codec
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);
SQL
75
codec
imprumuta
codec
COUNT(*)>1);
Exemplu:
S se obin numele cititorilor i titlurile crilor de informatic mprumutate
de aceti cititori.
SELECT
FROM
WHERE
AND
AND
AND
nume, titlu
cititor, carte, imprumuta, domeniu
imprumuta.codel = carte.codel
carte.coded = domeniu.coded
imprumuta.codec = cititor.codec
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:
76
Oracle
SELECT
nume, prenume
FROM
salariat
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
SQL
77
Funcii de conversie
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;
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
78
Oracle
SQL
79
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
VARIANCE (dispersia).
Observaii:
Funciile grup opereaz pe un grup de linii i nu cer folosirea clauzei
GROUP BY.
80
Oracle
Ele ntorc valoarea null cnd sunt aplicate unei mulimi vide, cu excepia
operatorului COUNT care ntoarce valoarea zero.
Exemplu:
S se afieze numrul crilor distincte mprumutate.
SELECT
FROM
COUNT(DISTINCT codel)
imprumuta;
Exemplu:
Comanda care urmeaz este greit! De ce?
SELECT
titlu, COUNT(*)
FROM
carte;
Exemplu:
S se calculeze media preurilor crilor din bibliotec.
SELECT
FROM
AVG(pret)
carte;
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
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
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
82
Oracle
YEAR
CC
Q
W
WW
Anul n litere
Secolul
Numrul trimestrului
Sptmna lunii
Sptmna anului
de exemplu, 17
1-4
1-5
1-52
Rezultat
Data
Data
Numr zile
Data
Descriere
Adaug un numr de zile la o dat
Scade un numr de zile dintr-o dat
Scade dou date calendaristice
Adun un numr de ore la o dat
Funcii diverse
NVL(e1, e2) dac e1 este NULL, returneaz e2; altfel, returneaz e1;
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.
SQL
83
SELECT
FROM
pret,editura,
DECODE(editura, ALL,pret*2,
UNIVERS,pret*3,
XXX,pret/2,
pret) pret_revizuit
carte;
normal (commit);
anormal (rollback).
Controlul tranzaciilor const n:
84
Oracle
SQL
85
86
Oracle
*
salariat;
(b) SAVEPOINT
a;
SQL
87
SELECT
FROM
AVG(salariu)
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);
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.
88
Oracle
SQL
89
salariat
salariu = 23456
cod_salariat = 1234;
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
90
Oracle
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?
SELECT
ROLLBACK
UPDATE
DELETE
CREATE TABLE