Documente Academic
Documente Profesional
Documente Cultură
ro
cer un caracter de continuare dac comanda este mai mare dect o linie;
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*Plus.
se prsete SQL*Plus;
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 /.
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 bufferul SQL;
I[NPUT] [text] adaug una sau mai multe linii de text dup linia curent din
buffer;
comanda PAUSE permite afiarea unei linii vide sau unui text suspendnd
temporar aciunea i ateptnd un RETURN de la utilizator;
opiunea HIDE face ca valoarea dat de utilizator s fie mascat (de exemplu,
o parol);
Exemplu:
ACCEPT alfa PROMPT Numarul de exemplare:
ACCEPT beta PROMPT Numele autorului:
SELECT *
FROM carte
WHERE nrex = &alfa
AND
autor = β
Exemplu:
SELECT &coloana
FROM
WHERE
&tabel
&conditie
ORDER BY &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:
Exemplu:
COLUMN sal JUSTIFY LEFT
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:
una sau mai multe dintre expresiile, coloanele sau alias-urile de coloane
refereniate n clauza OF trebuie s apar i n comanda SELECT;
dac ROW sau REPORT sunt refereniate n clauza ON atunci ele trebuie s
apar i n cea mai recent comand BREAK.
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
clauza USING query trebuie s selecteze cte o coloan pentru fiecare coloan
din destination_table;
REPLACE nlocuiete destination_table i coninutul su cu liniile ntoarse de
query; dac destination_table nu exist, atunci COPY creaz tabelul; altfel,
COPY terge mai nti tabelul existent i l nlocuiete cu un tabel ce conine
datele copiate.
Exemplu:
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
Exemplu:
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
Exemplu:
S se creeze un script la a crui rulare s apar urmtorul raport:
CONTRACTELE SUBANTREPRENORULUI CONSTRUCT SA
LA DATA DE 14/10/2001
NUME
NUMAR
VALOARE
CONTRACT CONTRACT
---------------------CONSTRUCT SA
---------------100
101
********************
VALOAREA MAXIMA
TOTAL
--------------50000
120000
--------120000
170000
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
********************
VALOAREA MAXIMA
TOTAL
NUMAR
CONTRACT
--------------104
105
106
VALOARE
CONTRACT
---------------500000
27000
10000
--------500000
537000
Pagina 3
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'
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
carte
GROUP BY autor
/
CLEAR BREAKS
CLEAR COLUMNS
CLEAR COMPUTES
SET ECHO ON FEEDBACK ON
Exemplu:
S se genereze un raport prin care s se obin pentru fiecare domeniu de carte
informaii despre numele domeniului, titlurile crilor din domeniu, numrul de
exemplare din fiecare carte i din fiecare domeniu, iar n final raportul s conin i
numrul total de cri din bibliotec.
Soluie:
SET ECHO OFF FEEDBACK OFF
COLUMN intdom FORMAT A25 HEADING denumire|domeniu
COLUMN titlu FORMAT A30 HEADING titlu|carte
COLUMN nrex FORMAT 99999 HEADING numar|carti
BREAK ON intdom SKIP 2 ON REPORT SKIP 1
COMPUTE SUM OF nrex ON intdom
COMPUTE SUM OF nrex ON REPORT
TTITLE CENTER Raport carti SKIP 1 LINE
SELECT intdom, titlu, nrex
FROM
WHERE
carte c, domeniu d
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
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 non-procedural, 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:
Alte tipuri de date scalare furnizate de SQL sunt NCHAR i NVARCHAR2, folosite
pentru reprezentarea caracterelor limbilor naionale.
Informaii relative la timp sau dat calendaristic se obin utiliznd tipul DATE.
Pentru fiecare dat de tip DATE sunt depuse: secolul, anul, luna, ziua, ora, minutul,
secunda. Pentru o coloan de tip DATE sistemul rezerv 7 bytes, indiferent dac se
memoreaz doar timpul, sau doar data calendaristic.
Formatul implicit al datei se definete cu ajutorul parametrului de
iniializare NLS_DATE_FORMAT. n general, acest parametru este setat la forma
DD-MON-YY. 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.).
CREATE TABLE
carte
(codel
CHAR(5) PRIMARY KEY,
titlu VARCHAR2(30),
autor
VARCHAR2(30),
pret
NUMBER(8,2),
nrex
NUMBER(3),
coded
CHAR(5) NOT NULL
REFERENCES domeniu(coded)
ON DELETE CASCADE);
Opiunea ON DELETE CASCADE specific c suprimarea oricrui domeniu de
carte din tabelul domeniu este autorizat i implic suprimarea automat a tuturor crilor
din domeniul respectiv care se gsesc n tabelul carte.
3. Crearea structurii unui tabel indicnd cheile la nivel de tabel:
CREATE TABLE
carte
(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
AS SELECT
FROM
WHERE
carte_info
codel, titlu, autor
carte
coded = I;
Constrngerile pot fi create o dat cu tabelul sau dup ce acesta a fost creat.
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.
dac a fost definit o cheie primar pentru tabelul referit de cheia extern;
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 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
ENABLE
nume_tabel
nume_constrangere;
Observaii
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;
carte
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);
cititor
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
(OWNER
(TABLE_NAME
(CONSTRAINT
ROWID
VARCHAR2(30),
VARCHAR2(30),
VARCHAR2(30))
Din punct de vedere fizic, comanda ALTER TABLE permite schimbarea parametrilor
PCTFREE i PCTUSED i a parametrilor din clauza STORAGE.
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
NUM_ROWS
BLOCKS
EMPTY_BLOCKS
AVG_SPACE
AVG_ROW_LEN
TABLE_LOCK
PARTITIONED
TEMPORARY
NESTED
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:
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]
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:
index partiionat folosit n cazul tabelelor mari pentru a stoca valorile coloanei
indexate n mai multe segmente;
index cu cheie invers sunt B* arbori, dar care stocheaz datele n mod invers;
indexai coloanele folosite frecvent n clauza WHERE sau n clauza ORDER BY;
indexai coloanele care sunt utilizate pentru a face legtura dintre tabele.
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
PARTITIONED
GENERATED
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;
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}]
subinterogare;
valoarea DEFAULT a unei coloane ntr-o comand CREATE TABLE sau ALTER
TABLE;
Comentarii
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
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:
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.
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;
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
vederea2
AS SELECT nume, prenume, job
FROM
salariat;
Nu se pot face inserari deoarece view-ul nu conine cheia primar!
INSERT INTO
VALUES
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
SET
WHERE
SELECT
FROM
vederea2
job = 'programator'
nume = 'Popescu';
nume, prenume, job
salariat;
vederea2
nume = 'Popescun';
vederea4
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
vederea3 (nr, job, salmed)
AS SELECT COUNT(*), job, AVG(salariu)
FROM
salariat
GROUP BY
job;
Nu se pot face inserri, actualizri sau tergeri ntr-un view ce conine funcii
grup. Dup oricare din aceste operaii apare acelai mesaj:
ORA-01732: data manipulation operation not legal on this view
Exemplu:
S se creeze o vizualizare care s conin coloanele cod_contractant, adresa,
telefon din tabelul contractant i coloanele nr_contract, tip_contract, data_incheiere din
tabelul contract. S se insereze o nregistrare n vizualizare.
CREATE VIEW
vederea44
AS SELECT c.cod_contractant, adresa, telefon,
co.nr_contract, tip_contract,
data_incheiere
contractant c, contract co
c.cod_contractant=co.cod_contractant;
FROM
WHERE
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 one-tomany, 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);
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 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-
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!
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));
coded
CHAR(1) NOT NULL)
CLUSTER cdoml(coded);
Pentru a scoate un tabel dintr-un cluster sunt parcurse urmtoarele etape: se
creeaz un nou tabel, n afara cluster-ului, prin duplicarea celui vechi; se distruge tabelul
din cluster; se suprim cluster-ul.
CREATE TABLE alfa
AS SELECT * FROM domeniu;
DROP TABLE domeniu;
RENAME alfa TO domeniu;
CREATE TABLE beta
AS SELECT * FROM carte;
DROP TABLE carte;
RENAME beta TO carte;
DROP CLUSTER cdoml;
Un alt tip de cluster oferit de Oracle este cluster-ul hash. n acest caz, pentru a
accesa o nregistrare, cluster-ul hash nu folosete un index, ci o funcie numeric, numit
funcia hash. Funcia are ca parametru cheia cluster-ului i returneaz o anumit valoare
(valoare hash). Aceast valoare corespunde blocului de date din cluster pe care Oracle l
va citi sau scrie pe baza comenzii executate.
De exemplu, apelurile telefonice efectuate de un client ntr-o lun vor fi facturate
mpreun. Apelurile pot fi depozitate ntr-un cluster hash a crui cheie este format din
coloanele ce conin numrul telefonului, anul i luna n care a avut loc convorbirea.
Suprimarea unui cluster din baza de date se face prin comanda:
DROP CLUSTER nume_cluster
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;
definite de un utilizator particular. Acest tabel poate fi referit i prin sinonimul su public
CAT.
Comanda INSERT
INSERT INTO nume_tabel / nume_view [(col1[, col2[,]])]
VALUES (expresia1[, expresia2[,]]) / subcerere;
Observaii:
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 dintrun tabel n altul pe attea linii cte au rezultat din cerere.
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 carte
SELECT
FROM
*
carte_info;
(c34,algebra,null,null,500,null);
Exemplu:
INSERT INTO carte(codel, nrex)
VALUES ('c25', 25);
INSERT INTO domeniu
VALUES ('&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
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
AND
AND
DELETE
[WHERE
Observaii:
Exemplu:
S se elimine cititorii care au numele Popai cei care au restituit astzi cel puin
o carte.
DELETE FROM cititor
WHERE
OR
nume=Popa
codec IN (SELECT codec
FROM
imprumuta
WHERE data_ef=SYSDATE);
Exemplu:
S se tearg toi tehnoredactorii care colaboreaz la mai puin de trei publicaii.
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:
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
carte
SET
pret = (SELECT
FROM
MAX(pret)
carte
WHERE
WHERE
coded = I)
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.
Soluie:
UPDATE
carte
SET
pret = (SELECT
WHERE
SUM(pret)
FROM
carte
WHERE
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 salariat
SET salariu = 0,9*salariu
WHERE cod_salariat IN
(SELECT cod_salariat
FROM redactor_sef
WHERE cod_salariat NOT IN
(SELECT cod_salariat
FROM publicatie));
Comanda SELECT
SELECT
[ALL | DISTINCT]
{* | list de atribute selectate | expr AS alias}
FROM
{ [schema.]{tabel [PARTITION (partition_name)] |
[THE] (subquery)} [alias_tabel] }
[WHERE
condiie]
[START WITH
condiie]
[CONNECT BY
condiie]
[GROUP BY
list de expresii
[HAVING
condiie]]
[ORDER BY
{expresie | poziie | c_alias} [ASC | DESC]]
[FOR UPDATE
[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:
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,
Exemplu:
n ce interogri este necesar utilizarea cuvntului cheie HAVING?
A.
B.
C.
D.
Exemplu:
SELECT
FROM
Exemplu:
SELECT
FROM
WHERE
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%;
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
FROM
WHERE
mgr IS NULL;
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
FROM
GROUP BY
codel, COUNT(*)
imprumuta
codel;
Exemplu:
Pentru fiecare domeniu de carte s se obin numrul crilor din domeniu, media
preurilor i numrul total de exemplare.
SELECT
FROM
GROUP BY
coded,COUNT(*),AVG(pret),SUM(nrex)
carte
coded;
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
FROM
GROUP BY
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
deptno, MAX(sal)
FROM
GROUP BY
HAVING
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.
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
GROUP BY
HAVING
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.
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
salariat
Exemplu:
S se obin, utiliznd aceste dou forme, codurile i titlurile crilor mprumutate.
a) Forma procedural (imbricare de comenzi SELECT):
SELECT
codel, titlu
FROM
carte
WHERE
codel IN (SELECT
FROM
codel
imprumuta);
b) Forma relaional:
SELECT carte.codel, titlu
FROM
carte, imprumuta
dimensiunea coloanei implicit este cea mai mare dintre cele dou coloane;
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 codec
FROM
cititor
MINUS
SELECT DISTINCT codec
FROM
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
emp e, salgrade s
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
AND
y.autor = Oszu;
carte x
WHERE EXISTS
(SELECT
FROM
carte
WHERE
carte.titlu=Baze de date
AND
carte.autor=Oszu
AND
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
codec
FROM
WHERE
cititor
nume=&nume1);
b) Forma relaional:
SELECT c2.*
FROM
carte, domeniu
emp
deptno
dname
empno deptno
algebra
101
null
analiza
102
null
103
null
105
1
106
dept a, emp b
a.dname
b.empno
101
b.deptno
102
103
1
algebra105
algebra106
dept a, emp b
a.dname
b.empno
algebra105
algebra106
analiza null
null
b.deptno
dept a, emp b
dept a, emp b
nume_dep
***
analiza
101
***
102
***
103
***
105
algebra
106
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
FROM
emp
emp);
Exemplu:
S se obin job-ul i salariul minim.
SELECT job, AVG(sal)
FROM
emp
GROUP BY
job
HAVING AVG(sal)=(SELECT
MIN(AVG(sal))
FROM
emp
GROUP BY job);
Exemplu:
S se gseasc salariaii din fiecare departament, care au salariul minim n
departamentul respectiv.
SELECT ename, sal, deptno
FROM
emp
MIN(sal)
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:
S se obin salariaii al cror salariu este mai mare ca salariile medii din toate
departamentele.
SELECT ename, job
FROM
emp
AVG(sal)
FROM
GROUP BY
emp
deptno);
tabel
col,col,
FROM
WHERE
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 ename, deptno, sal, com
FROM
emp
WHERE (sal,NVL(com,-1)) IN
(SELECT
sal,NVL(com,-1)
FROM
emp
WHERE
deptno = 7);
emp
AND
sal
FROM
emp
WHERE
deptno=7)
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 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
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
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
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 DISTINCT autor
FROM
carte
AVG(nrex)
FROM
carte);
Exemplu:
S se obin informaii despre crile al cror pre depete media preurilor
crilor ce aparin aceluiai domeniu
SELECT *
FROM
carte c
AVG(pret)
FROM
WHERE
carte
coded = c.coded);
Exemplu:
S se obin lista cititorilor care au mprumutat cel puin o carte.
SELECT nume
FROM
cititor
imprumuta);
Exemplu:
S se obin codurile cititorilor care nu au mprumutat niciodat cri.
SELECT codec
FROM
cititor
DISTINCT codec
FROM
imprumuta);
Exemplu:
S se obin lista cititorilor care sunt n ntrziere cu predarea crilor.
SELECT nume
FROM
cititor
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
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 nume
FROM
cititor
imprumuta
WHERE 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
FROM
carte
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
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
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
AVG(pret)
FROM
WHERE
carte
coded = c.coded);
Exemplu:
S se obin codurile cititorilor i codul ultimei cri mprumutate.
SELECT codec, codel
FROM
imprumuta i
dataim
FROM
WHERE
imprumuta
codec=i.codec);
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
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);
carte
WHERE EXISTS
(SELECT
FROM
imprumuta
WHERE
codel = carte.codel
AND
dataef IS NULL);
carte
WHERE codel IN
(SELECT
DISTINCT codel
FROM
imprumuta
WHERE
dataef IS NULL);
Exemplu:
S se obin codurile crilor care nu au fost mprumutate niciodat.
Soluia 1 (cu sincronizare)
SELECT codel
FROM
carte
codel
FROM
imprumuta
WHERE
codel = carte.codel);
carte
imprumuta);
Exemplu:
S se obin lista salariailor avnd salariul minim n departamentul n care
lucreaz.
SELECT ename,sal
FROM
emp e
emp
WHERE
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
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 nume
FROM
cititor
imprumuta
WHERE codec=C19
MINUS
SELECT codel
FROM
imprumuta
imprumuta i
codel
FROM
imprumuta
WHERE
codec=i.codec
MINUS
AND
SELECT
codel
FROM
imprumuta
WHERE
codec=&ccc)
NOT EXISTS
(SELECT
codel
FROM
imprumuta
WHERE
codec=&ccc
MINUS
AND
SELECT
codel
FROM
imprumuta
WHERE
codec=i.codec)
codec!=&ccc);
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.
cititor, imprumuta
WHERE cititor.codec=imprumuta.codec
GROUP BY
nume
HAVING COUNT(*)>1;
Soluia 2 (forma procedural):
SELECT nume
FROM
cititor
WHERE codec IN
(SELECT codec
FROM
imprumuta
GROUP BY codec
HAVING
COUNT(*)>1);
Exemplu:
S se obin numele cititorilor i titlurile crilor de informatic mprumutate de
aceti cititori.
SELECT nume, titlu
FROM
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
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 de conversie
Conversiile pot fi fcute:
Conversii implicite
n cazul atribuirilor, sistemul poate converti automat:
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).
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;
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:
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.
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;
returneaz
ora
din
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.
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
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
Rezultat
Descriere
Data + numr
Data
Data - numr
Data
Data - data
Numr zile
Data + numar/24
Data
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.
SELECT pret,editura,
DECODE(editura, ALL,pret*2,
UNIVERS,pret*3,
XXX,pret/2,
pret) pret_revizuit
FROM
carte;
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).
Tranzacia ncepe:
Tranzacia se termin:
nregistrrile afectate sunt blocate i, prin urmare, ali utilizatori nu pot face
schimbri n datele acestor nregistrri.
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.
Blocrile asupra liniilor afectate sunt eliberate; liniile pot fi folosite de ali
utilizatori pentru a face schimbri n date.
Exemplu:
Ce efect are urmtoarea secven de instruciuni?
(a)
SELECT
FROM
*
salariat;
(b)
SAVEPOINT a;
(c)
(d)
(e)
ROLLBACK TO b;
SELECT
FROM
(f)
AVG(salariu)
salariat;
ROLLBACK TO a;
INSERT INTO salariat
VALUES (18,Ion,Mihai,5,580,redr_sef);
COMMIT;
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).
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 SRX (se obine prin comanda LOCK TABLE cu opiunea
SHARE ROW EXCLUSIVE) permite altor tranzacii doar interogarea tabelului
i blocarea sa n modul RS.
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?
SELECT
ROLLBACK
UPDATE
DELETE
CREATE TABLE
Powered by http://www.referat.ro/
cel mai tare site cu referate