Documente Academic
Documente Profesional
Documente Cultură
de masura I
Laborator
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Cuprins
1. INTRODUCERE........................................................................................................................................................4
2. LABORATOR 1: STUDIUL POSIBILITATILOR DE CONECTARE LA O BAZA DE DATE. CREARE
USERI, SESIUNI, UTILIZAREA PROGRAMULUI SQL NAVIGATOR................................................................5
2.1 STARTAREA PROGRAMULUI SQL NAVIGATOR, INTRODUCERE CONT SI PAROLA...............................................5
2.2 SCHIMBAREA CONEXIUNII LA BAZA DE DATE, FISIERUL TNSNAMES.ORA...........................................................5
2.2.1 Studiul fisierului tnsnames.ora...................................................................................................................6
2.2.2 Exercitii......................................................................................................................................................7
2.3 USERUL SYS.......................................................................................................................................................7
2.4 CONECTAREA LA BAZA DE DATE CU AJUTORUL PROGRAMULUI SQL PLUS........................................................7
2.4.1 Exercitii......................................................................................................................................................8
2.4.2 Fortarea stergerii unui user cu sesiuni deschise in baza de date..............................................................9
2.5 UTILIZARE PROGRAM SQL NAVIGATOR.............................................................................................................9
2.5.1 Exercitii....................................................................................................................................................10
3. APLICATIA "E-LIBRARY". DEFINIREA OBIECTELOR IN BAZA DE DATE.......................................12
2.6 DESCRIEREA APLICATIEI "E-LIBRARY".............................................................................................................12
2.7 USERI................................................................................................................................................................12
2.8 TABELE CE TREBUIE DEFINITE IN BAZA DE DATE..............................................................................................12
2.9 CONSTRANGERI DEFINITE INTRE TABELE..........................................................................................................13
2.10 INTRODUCEREA DATELOR DE LUCRU................................................................................................................15
4. APLICATIA "E-LIBRARY". DEZVOLTAREA RAPOARTELOR...............................................................16
2.11 DESCRIEREA COMENZII SELECT.....................................................................................................................16
2.11.1 Afisarea tuturor datelor dintr-o tabela....................................................................................................16
2.11.2 Afisarea selectiva a coloanelor din tabela...............................................................................................16
2.11.3 Filtrarea datelor afisate:..........................................................................................................................17
2.11.4 Selectarea informaţiilor din mai multe tabele simultan...........................................................................18
2.11.5 Afişarea liniilor ce nu respectă condiţia de legătură dintre tabele.........................................................19
2.11.6 Operatori logici........................................................................................................................................19
2.11.7 Clauza ORDER BY...................................................................................................................................23
2.12 EXERCITII..........................................................................................................................................................24
2.12.1 Afisarea datelor dintr-o tabela.................................................................................................................24
2.12.2 Afisarea datelor din mai multe tabele......................................................................................................24
5. COMENZILE UPDATE SI DELETE..................................................................................................................26
2.13 COMANDA UPDATE...........................................................................................................................................26
2.13.1 Sintaxa comenzii Update..........................................................................................................................26
2.13.2 Exercitii....................................................................................................................................................26
2.14 COMANDA DELETE...........................................................................................................................................27
2.14.1 Sintaxa comenzii Delete...........................................................................................................................27
2.14.2 Exercitii....................................................................................................................................................27
6. PL/SQL....................................................................................................................................................................28
2.15 SINTAXA LIMBAJULUI PL/SQL.........................................................................................................................28
Page 2 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Page 3 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
1. Introducere
Page 4 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Aplicatia SQL Navigator realizeaza o interfata grafica intre utilizator si baza de date. Programul afiseaza
mai multe ferestre prin care utilizatorul poate analiza si modifica structura bazei de date. Este o aplicatie de
tip Windows ce furnizeaza un set de meniuri si comenzi grafice ce usureaza foarte mult interactiunea cu
baza de date.
In acest laborator sunt prezentate principalele caracteristici ale aplicatiei si modul de utilizare pentru
gestionarea bazelor de date.
Definitia conexiunilor la o baza de date se pastreaza intr-un fisier dedicat numit "tnsnames.ora". Prin
editarea acestui fisier se pot defini conexiuni la o baza de date sau mai multe instalate pe diverse servere
din retea.
In principal, o conexiune la o baza de date trebuie sa defineasca urmatoarele elemente:
Numele conexiunii
Adresa serverului si protocolul de comunicare cu acesta
Portul la care serverul raspunde cerintelor de interogare a bazei de date
Numele bazei de date
Page 5 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Fisierul tnsnames.ora se creeaza automat cand se intaleaza baza de date server sau client si de regula se
gaseste in subfolderul "...\Network\Admin" din directorul unnde s-a instalat Oracle.
Stud_local =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.6)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stud)
)
)
Page 6 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
raspunde la cererile de conectare este Listener-ul. Acesta la randul lui comunica intern cu
baza de date.
SERVER = DEDICATED: stabileste modul cum raspunde serverul la o noua cerere de conectare,
daca se defineste o noua sesiune dedicata noii cereri sau se "share-uieste" o alta sesiune de lucru
deja deschisa.
SERVICE_NAME = stud : aici este numele bazei de date (acelasi nume ce se regaseste in
serviciul intern care ruleaza baza de date).
1.2.2 Exercitii
Orice baza de date are creat userul implicit numit SYS. Acesta este userul cu cele mai mari drepturi si este
utilizat pentru administrarea bazei de date si crearea celorlalti utilizatori. Nu se lucreaza pe user-ul sys,
acesta este folosit doar pentru administrare baza, imediat dupa instalarea bazei de date se intra cu acest
user si se creeaza un alt user de lucru in schema caruia se vor crea tabelele bazei de date.
Userul SYS se conecteaza cu o comanda particulara (“ as sysdba “): conn sys/parola@stud as sysdba
Instalarea bazei de date server sau client pe calculator creeaza un folder in "All Programs" ce include si un
utilitar de conectare si lucru cu baza de date. Acesta se reaseste in general in Application Development /
Page 7 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
SQL Plus. In figurile ce urmeaza se prezinta modul de lansare a programului SQL Plus si fereastra de
conectare la baza de date.
Figura 2: Conectarea prin SQL Plus la baza de date "stud_local" folosind user-ul "sys"
1.4.1 Exercitii
conectati-va la baza stud_local prin intermediul programului SQL plus cu userul SYS si creati un
nou utilizator care sa aiba acelasi nume cu numele studentului:
create user nume_utilizator identified by parola ;
Dati drepturi de conectare utilizatorului :
o grant connect to user …
o incercati crearea unui tabel: create table …
Page 8 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
o drepturi de creare tabele, view, select, create trigger, constrangeri (cautare pe internet
sintaxa acestor comenzi)…
Conectati-va la baza de date folosind noul user (sintxa comenzii de conectare este data in figura ce
urmeaza).
Creati o noua sesiune cu userul SYS si incercati sa stergeti userul nou creat. Sintaxa comenzii
este:
o drop user nume_user cascade;.
Observatie: Daca userul este in continuare logat la baza de date, stergerea userului esueaza. Inchideti
sesiunea userului curent si apoi incercati din nou sa stergeti userul.
In cazul cand userul este conectat la o baza acesta nu poate fi sters. Multe conexiuni raman blocate din alte
sesiuni de lucru care nu s-au inchis corespunzator. De aceea, este necesar sa fortam inchiderea unei
sesiuni de lucru prin intermediul userului SYS:
o Se listeaza toate sesiunile de lucru la baza de date:
select * from v$session;
o Se inchide fortat sesiunea de lucru a userului ce trebuie sters:
ALTER SYSTEM KILL SESSION 'sid, SERIAL#' IMMEDIATE ;
ALTER SYSTEM KILL SESSION '15,2203' IMMEDIATE ;
Page 9 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Un alt utilitar pentru gestionarea obiectelor dintr-o baza de date este SQL Navigator. Acesta permite intr-o
maniera grafica accesul la baza de date, vizualizarea si modificarea obiectelor, scrierea si executia
instructiunilor SQL, exportul datelor in diverse formate text, etc.
1.5.1 Exercitii
Page 10 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Figura 6: Butonul din Tool Bar pentru deschiderea unei ferestre de editare cod SQL
o Scrieti mai multe comenzi SQL (comenzile le obtineti prin facilitatea “Extract DDL”) si
executati-le prin comanda F8 (plasati cursorul pe linia comenzii si apasati tasta F8).
o Urmariti fereastra “Output” pentru vizualizarea erorilor de executie.
Utilizati meniul View/preferences pentru setarea direcorului de lucru implicit: cautati pe hard
disc direcorul in care aveti drepturi de lucru , creati in acel director un nou folder numit
Page 11 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
6403_2008_2009 si setati noul folder ca “default” pentru lucru cu programul SQL Navigator.
Creati o pagine de lucru SQL , scrieti cateva comenzi si salvati pagina pe hard disc. Verificati
ca s-a salvat pe directorul implicit. Deschideti o pagina SQL si dati comanda “Open”. Verificati
ca programul deschide automat folderul implicit.
Page 12 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Aplicatia “E-library” trebuie sa tina evidenta cartilor dintr-o biblioteca si situatia imprumuturilor. Sunt
necesare urmatoarele situatii :
lista autorilor
lista cartilor din biblioteca
lista cititorilor
situatia imprumuturilor de carte
1.7 Useri
Fiecare grup de lucru dintre studenti creeaza un cont propriu in schema caruia va dezvolta obiectele bazei
de date proprii.
Contul se formeaza prin concatenarea urmatoarelor date: cod_grupa, nr_semigrupa,
nr_grupa_de _lucru.
o Ex: 6403/I-1 -> grupa 6403, semigrupa I, grupa 1 de lucru.
Parola are acelasi text ca si contul grupului de lucru
Page 13 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
o pk_autor1 : number
o pk_autor2
o pk_autor3
Cititori:
o pk_cititor
o Nume_cititor : varchar2(50)
o Varsta :number(2)
o Sex :varchar2(1) (M sau F)
o Calificativ : varchar2(50): un text care sa caracterizeze comportamentul cititorului
relativ la disciplina returnarii in termen a cartilor
Imprumuturi:
o Pk_imprumut
o Pk_carte
o Pk_cititor
o Data_start : date
o Data_end : date
o Data_return : date
o Observatii : varchar2(50)
Exemplu:
Page 14 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
-- 1. Autori
CREATE TABLE autori
(pk_autor NUMBER NOT NULL,
nume_autor VARCHAR2(50) NOT NULL
);
ALTER TABLE autori ADD CONSTRAINT pk_autor PRIMARY KEY (pk_autor);
ALTER TABLE autori ADD CONSTRAINT uk_nume_autor UNIQUE (nume_autor);
--2. Cititori
CREATE TABLE cititori
(pk_cititor NUMBER NOT NULL,
nume_cititor VARCHAR2(50),
varsta NUMBER(2,0),
sex VARCHAR2(1),
calificativ VARCHAR2(50));
-- 3. Carti:
-- Start of DDL Script for Table LUCI.CARTI
-- Generated 17-Nov-2010 11:40:22 from LUCI@statia1_scoala
--4. Imprumuturi:
CREATE TABLE imprumuturi
(pk_imprumut NUMBER NOT NULL,
pk_carte NUMBER NOT NULL,
pk_cititor NUMBER NOT NULL,
data_start DATE NOT NULL,
data_end DATE NOT NULL,
data_return DATE,
observatii VARCHAR2(50));
Page 15 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Sa se insereze in fiecare tabela cate 5 linii de informatii (5 autori, 5 cititori, 5 imprumuturi, etc).
--1. Autori
insert into autori values(1, 'Autor_1');
insert into autori values(2, 'Autor_2');
insert into autori values(3, 'Autor_3');
insert into autori values(4, 'Autor_4');
insert into autori values(5, 'Autor_5');
insert into autori values(6, 'Autor_6');
--2.Cititori
insert into cititori values(1, 'Cititor_1', 25,'M','FB');
insert into cititori values(2, 'Cititor_2', 20,'F','B');
insert into cititori values(3, 'Cititor_3', 21,'M','S');
insert into cititori values(4, 'Cititor_4', 19,'F','NS');
insert into cititori values(5, 'Cititor_5', 27,'M','NS');
--3. Carti
insert into carti values(1,'Beletristica','Titlu_1',2,5,null);
insert into carti values(2,'Beletristica','Titlu_2',4,null,null);
insert into carti values(3,'Stiinte','Titlu_3',1,4,5);
insert into carti values(4,'Stiinte','Titlu_4',2,3,1);
insert into carti values(5,'Stiinte','Titlu_5',1,null,null);
insert into carti values(6,'Stiinte','Titlu_6',1,3,null);
insert into carti values(7,'Divertisment','Titlu_7',6,null,null);
insert into carti values(8,'Divertisment','Titlu_8',6,1,null);
--4. Imprumuturi
insert into imprumuturi values(1, 1, 2, sysdate-5,sysdate+5, null,null);
insert into imprumuturi values(2, 2, 2, sysdate-5,sysdate+5, sysdate+3,null);
insert into imprumuturi values(3, 5, 2, sysdate-5,sysdate+5, sysdate+2,'a rupt
coperta');
insert into imprumuturi values(4, 5, 1, sysdate-2,sysdate+7, null,null);
insert into imprumuturi values(5, 3, 1, sysdate-2,sysdate+7, sysdate+4,null);
insert into imprumuturi values(6, 3, 3, sysdate-1,sysdate+9, null,null);
insert into imprumuturi values(7, 5, 3, sysdate-1,sysdate+9, sysdate+8,null);
insert into imprumuturi values(8, 2, 3, sysdate-1,sysdate+9, sysdate+4,'a rupt
coperta');
insert into imprumuturi values(9, 5, 4, sysdate,sysdate+10, null,null);
insert into imprumuturi values(10, 3, 4, sysdate,sysdate+10, sysdate+4,null);
Page 16 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Page 17 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
In acest capitol se vor dezvolta diverse rapoarte din baza de date care sa reflecte situatia cartilor si a
imprumuturilor din biblioteca.
Pentru afisarea informatiilor din diverse tabele ale bazei de date se foloseste comanda SQL SELECT.
Comanda permite afisarea datelor dintr-o singura tabela sau mai multe, legate prin intermediul
constrangerilor Foreign Key, contine campuri pentru filtrarea datelor cu ajutorul operatorilor logici, precum si
facilitati de ordonare a datelor.
Daca nu se doresc sa afisez toate coloanele, ci doar cele care prezinta interes intr-un anumit context,
putem folosi alta sintaxa a comenzii select:
Page 18 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Prin adaugarea clauzei where se restrange informatia afisata, vor fi extrase doar datele ce respecta
anumite criterii stabilite in aceasta clauza:
select nume_stud,cod_grupa
from studenti
where cod_grupa = '6303';
Din cele prezentate până acum putem reţine sintaxa de bază a instrucţiunii SELECT:
select nume_coloane from nume_tabel where condiţii de selecţie.
După cuvântul "select" se introduc numele coloanelor din tabela care vrem sa fie afişate. Dacă sunt mai
multe coloane, se despart prin virgulă, după ultima coloană nu se pune virgulă. Dorim toate coloanele din
tabelă? punem direct * (select *). Urmează clauza "from" după care punem numele tabelei din care
extragem acele informaţii. Nu dorim toate liniile din tabel? atunci trebuie să adăugăm clauza "where" unde
introducem condiţiile pe care trebuie să le îndeplinească liniile din tabel ce se doresc afişate.
Page 19 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Dar dacă trebuie să ştiu şi specializarea studenţilor din grupa 6303? In acest caz datele se regăsesc în
tabele diferite: tabela studenti conţine numele studenţilor, iar tabela grupe conţine codul specializării.
select studenti.nume_stud ,studenti.cod_grupa ,grupe.cod_spec
from studenti,grupe
where studenti.cod_grupa = grupe.cod_grupa
and studenti.pk_an_scolar = 1
and grupe.cod_grupa = '6303';
Instrucţiunea select permite extragerea informaţiilor din mai multe tabele simultan. Pot vizualiza atât numele
studentului, cât şi specializarea acestuia, chiar dacă cele două informaţii sunt în tabele diferite. Important
este să existe o legătură între cele două tabele astfel încât unei linii dintr-o tabelă sa-i corespundă una sau
mai multe linii din cealaltă tabelă. Când fraza select lucrează cu două tabele (sau mai multe), întotdeauna
trebuie să existe clauza where în care se specifică legătura între tabele. In selectul de mai sus legătura se
realizează prin coloana "cod_grupa" comună celor două tabele (where studenti.cod_grupa =
grupe.cod_grupa).
Cum lucrează selectul în acest caz? Se aduce numele studentului şi codul grupei din tabela
"studenti" şi apoi se caută specializarea pentru acea grupă. Cum găsim specializarea? se merge în tabela
"grupe" şi se aduce valoarea coloanei "cod_spec" din linia care are codul grupei egal cu cel din tabela
"studenti". Deci, pentru studentul "Chiruta Marcel" am găsit codul grupei 6303 şi cu acest cod am mers în
tabela "grupe" şi am căutat specializarea corespunzătoare. Am găsit că acea specializare este
"informatică".
Ce se întâmplă dacă în tabela "grupe" găsim două specializări corespunzătoare acelei grupe?
(binenţeles că nu-i voie, o grupă face parte dintr-o singură specializare, dar dacă se întâmplă ? ) In acest
caz selectul îmi va aduce două linii pentru studentul "Chiruta Marcel" : o linie cu specializarea "informatica"
şi o linie în plus cu cea de-a doua specializare.
Ce se întâmplă dacă uit pur şi simplu să pun în clauza "where" legătura dintre tabele? Atunci e
grav, se umple ecranul cu zeci de rânduri fără nici o noimă. Fraza select face produsul cartezian între cele
două tabele şi afişează rezultatul (adică pentru fiecare linie din tabela "studenti" parcurge toate liniile din
tabela "grupe").
Page 20 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Concluzia? să nu uităm niciodată să punem în clauza "where" condiţia de legătură dintre tabele
atunci când selectăm coloane din mai multe tabele simultan.
Daca exista un student in baza de date care nu are cod_grupa completat, atunci acest student nu este
afisat de comanda select. Acest student este eliminat de clauza where prin conditia :
studenti.cod_grupa = grupe.cod_grupa
Totuşi, daca vreau să vad toţi studenţii, cei care au grupe asociate să li se afişeze grupa, cei care nu au, să
apară fără grupă, dar să apară, trebuie să utilizez operatorul (+):
select studenti.nume_stud , grupe.cod_grupa, grupe.descriere_grupa
from studenti, grupe
where studenti.cod_grupa = grupe.cod_grupa(+);
Operatorul (+) pus în dreapta tabelului ce nu are corespondent pentru fiecare linie din primul tabel, are ca
efect afişarea tuturor liniilor selectate din primul tabel, indiferent dacă au sau nu legătură cu cel de-al doilea.
In general, tabelele au mii de linii, milioane chiar, clauza where este cea care ne ajută să sortăm aceste linii
şi să scoatem numai informaţia de care avem nevoie. In această clauză sunt scrise expresii logice ce
returnează doar două valori: valoarea "adevărat" (true) sau valoarea "fals" (false). Expresiile logice sunt
construite cu ajutorul operatorilor de comparaţie:
Operator Explicaţie
= Egal cu
> Mai mare decât
>= Mai mare sau egal
< Mai mic decât
<= Mai mic sau egal
<> != Diferit de
Exemple:
1. sa se listeze toţi studenţii care au note mai mari de 8:
select studenti.nume_stud ,studenti.cod_grupa ,sit_finala.cod_disciplina ,sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
Page 21 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Clauza "where" poate conţine mai multe fraze care împreună să construiască valoarea de adevăr finală.
Frazele sunt legate prin trei termeni cheie:
- "and" : returnează "true" numai dacă toate frazele din compoziţie sunt "true"
- "or" : returneaza "true" dacă cel puţin o frază este "true".
- "not" : inversează valoarea de adevăr a frazei la care se aplică
Exemple:
1. afişează studenţii care au obţinut la disciplina ME nota 7 si cei cu nota 8:
select studenti.nume_stud ,studenti.cod_grupa ,sit_finala.cod_disciplina ,sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
and (nota_finala = 7 or nota_finala = 8)
;
Nu trebuie uitata paranateza rotunda care grupeaza conditiile de filtrare, altfel se ajunge la un produs
cartezian :
select studenti.nume_stud ,studenti.cod_grupa ,sit_finala.cod_disciplina ,sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
and nota_finala = 7 or nota_finala = 8
order by nume_stud
;
Page 22 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Mai sunt disponibili şi alţi operatori de relaţie care ne ajută la construirea clauzei "where":
operatorul "like": este operatorul care ne scoate din încurcătură când nu ştim ce căutăm,
ci doar bănuim.
select nume_stud from studenti
where nume_stud like 'An%' ;
Fraza select anterioară se traduce: adu-mi toţi studenţii al căror nume începe cu literele "An".
Nu mai ştiu, studenţii erau scrişi cu litere mari, litere mici , cred că s-au folosit litere mari:
select nume_stud from studenti
where nume_stud like 'AN%'
;
Selectul anterior nu aduce nici un rând, deoarece operatorul "like" este case sensitive, adică face distincţie
între literele mari şi cele mici (pentru el litera "n" este diferită de litera "N").
Ca să nu căutăm în zadar, utilizăm funcţia "upper" ce transformă toate literele în majuscule:
select nume_stud from studenti
where upper(nume_stud) like 'AN%'
;
Page 23 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Mă mai pot juca cu operatorul "like"; vreau toţi studentii care au în componenţa numelui şirul de caractere
"ut":
select nume_stud from studenti
where nume_stud like '%ut%'
;
Clauza distinct : daca un select aduce mai multe linii cu aceeasi informatie (de exemplu, aduce un nume
de student de mai multe ori datorita faptului ca acel student se gaseste in mai multe grupe simultan), atunci
se pot elimina liniile identice folosind clauza distinct :
select distinct nume_stud from studenti
where nume_stud like '%ut%'
;
Directiva "distinct" înlătură informaţia care se repetă în rezultatul frazei select. In acest fel, studenţii vor fi
afişaţi o singură dată, indiferent de numărul de înregistrări găsite în tabela studenti.
In afara caracterului "%" se mai poate utiliza în clauza "like" caracterul "_". Acesta înlocuieşte un singur
caracter din şirul căutat:
select nume_stud from studenti where nume_stud like '_h%' ;
Selectul de mai sus aduce toţi studenţii al căror nume au în a doua poziţie litera "h".
Evident, nu aduce nici o linie deoarece am pus null într-o expresie care intotdeauna returneaza fals.
Verificarea coloanelor care au valoarea null se face cu operatorul “is null”.
select * from studenti where cod_grupa is null;
Page 24 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Clauza "order by" se foloseşte pentru a ordona liniile aduse de fraza select. Intotdeauna aceasta clauză se
pune ultima într-o frază select. Liniile aduse de select nu sunt ordonate, de aceea e posibil ca acelaşi select
rulat de mai multe ori să aducă liniile în ordine diferite. Order by rezolvă această problemă, prin ordonare,
aceeaşi linie va fi tot timpul la locul ei.
Să vedem studenţii în ordinea mediilor:
select studenti.nume_stud , sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
order by nota_finala
;
Implicit order by lucrează ascendent, adică de la valoare mică spre valoare mare. Daca dorim schimbarea
ordinii implicite se foloseste clauza “desc”:
select studenti.nume_stud , sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
order by nota_finala desc
;
Clauza "desc" (de la descendent) ordoneaza lista de la mare la mic, in sens descrescator. Pentru ordinea
ascendentă folosesc cuvântul "asc" (dar acesta este implicit, nu trebuie scris neapărat).
Pot face ordonarea după mai multe coloane, îi pun în ordinea mediilor, dar la aceeaşi medie, să fie în
ordinea alfabetică:
select studenti.nume_stud , sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
order by nota_finala desc, nume_stud asc
;
La prima vedere pare ilogic să pun order by după nume_stud, deoarece această coloană nu este de tip
number, ca s-o poţi ordona. Dar să ne amintim că, toată informaţia din calculator este sub formă de
numere, deci are sens ordonarea. Literele din cadrul numelui studentului sunt memorate sub forma unor
Page 25 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
numere ce corespund codurilor ASCII ale acelor litere. Nu întâmplător, codurile ASCII ale literelor
corespund ordinii din alfabet (litera "a" are codul ASCII mai mic decât litera "b").
1.12 Exercitii
Se deschide o sesiune de lucru pentru aplicatia de biblioteca folosind userul si parola definite in lucrarea
anterioara.
Sa se scrie fraze select care sa afiseze urmatoarele:
Nume autor
Titlu carte, domeniu
Nume cititor, varsta, sex, calificativ
Page 26 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Page 27 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
In acest capitol se vor studia comenzile de modificare a unei informatii existente in baza de date:
Update: modificarea valorilor din tabele
Delete: stergerea liniilor din tabele
Aceasta comanda se foloseste pentru modificarea informatiilor existenta in baza de date. Formatul
comenzii este urmatorul:
Update nume_tabel
set nume_coloana1 = valoare1,
nume_coloana2 = valoare2,
….
Where conditie;
Se specifica numele tabelului care trebuie modificat si coloanele separate prin virgula cu noile valori pentru
fiecare coloana in parte. La sfarsit se introduce clauze “where” care sa defineasca in mod clar liniile din
tabel care vor fi modificate. Daca se uita clauza where, atunci toate liniile din tabel vor fi modificate si vor
primi aceeasi valoare (valoare1, valoare2,…).
1.13.2 Exercitii
1. Sa se scrie instructiuni update care modifica numele unui autor si titlul unei carti.
2. Sa se scrie instructiunea update care trece toate impumuturile de la un cititor pe numele
altui cititor.
3. Completeaza cu data curenta campul “data_return” din tabela”imprumuturi” pentru un cititor
dat si o carte data (cititorul a returnat cartea la biblioteca).
4. Prelungeste perioada imprumutului cu 3 saptamani pentru toate cartile din domeniul
“stiinte”.
5. Toate titlurile cartilor sa fie scrise cu majuscule
Page 28 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Comanda delete se foloseste pentru stergerea datelor din tabela. Formatul instructiunii este:
Delete from nume_tabel where conditie;
Se sterg toate informatiile din liniile care respecta conditia din clauza “where”. Nu se pot sterge numai
anumite valori din anumite coloane, comanda delete sterge toata linia in intregul ei. Pentru stergerea doar a
anumitor coloane se foloseste comanda “update”.
1.14.2 Exercitii
Page 29 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
6. PL/SQL
PL/SQL inseamna SQL inclus intr-o structura de programare. SQL-ul este un limbaj performant de
introducere, modificare si citire a datelor din baza. Dar daca aceste date necesita a fi prelucrate inainte de
afisare, atunci este necesar un limbaj care sa includa tehnicile specifice de analiza si prelucrare a datelor:
- instructiuni de selectie (if, switch);
- bucle de programare (for, while);
- variabile pentru stocarea datelor;
- etc.
Baza de date Oracle accepta secvente de cod care sa fie stocate pe server si executate printr-un simplu
apel intr-o instructiune SQL. Rularea codului PL/SQL direct pe baza de date este avantajoasa din punct de
vedere al incarcarii traficului de retea. Astfel, clientul nu mai este nevoit sa transfere prin retea un volum
imens de date care apoi sa fie prelucrate prin metode specifice programarii, ci aceasta prelucrare are loc pe
server si doar rezultatele sunt apoi transmise la client.
Programele PL/SQL pot fi funcţii , proceduri, sau blocuri anonime de cod. Diferenţa între funcţii şi
proceduri? Funcţia întoarce o valoare, procedura nu întoarce nimic, prin codul ei modifică un obiect din
baza de date sau valoarea unui parametru.
Indiferent dacă este funcţie sau procedură sintaxa este aceeaşi:
declare
nume_variabile tip;
begin
instructiuni;
RETURN return_value ; (numai pentru functii)
exception
WHEN exception_name THEN
instructiuni tratare exceptii ;
END;
Prima parte din program este rezervată declaraţiilor de variabile. Urmează blocul de instrucţiuni care se
termină cu instrucţiunea "end". Intre "begin" si "end" se poate include eventual clauza "exception" unde se
Page 30 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
introduc instrucţiuni de tratare a erorilor apărute în blocul de instrucţiuni. Structura respectă arhitectura
oricărui limbaj de programare: declaraţie variabile, instrucţiuni, tratare erori (construcţia begin ....
exception ... end poate fi privită ca un bloc try ... catch din limbajele de programare moderne).
Lucrând pe o bază de date care ne poate surprinde oricând cu date invalide sau lipsă, este
obligatorie tratarea erorilor printr-o clauză de tip exception, altfel eroarea se transmite mai departe şi apare
la interfaţa utilizator cu tot felul de mesaje Oracle pe care utilizatorul final nustie sa le traduca.
In continuare se da ca exemplu o functie de calcul a mediei ponderate pentru un student. In acest scop,
functia trebuie sa parcurga urmatorii pasi:
Creeaza o structura de date ( numita cursor in PL/SQL) care stocheaza toate materiile pe care le
studiaza studentul dat. Disciplina de "educatie fizica" nu trebuie sa participe la elaborarea mediei
finale. Sunt salvate in memorie atat codul materiilor studiate, cat si numarul de credite asociate
fiecarei discipline.
Pentru fiecare disciplina asociata studentului, trebuie gasita nota finala obtinuta. Studentul poate da
de mai multe ori examen pana sa obtine nota finala (ori pica la prima examinare, ori doreste la a
doua sesiune de examinare sa obtina o nota mai mare). De aceea, notele trebuie cautate pornind
cu sesiunea a III-a, apoi cu sesiunea a II-a si in sfarsit, daca nu gaseste note in acel sesiuni, atunci
se foloseste nota din sesiunea I de examinare. Daca nu se gaseste nota la nici una din sesiuni,
atunci algoritmul de cautare returneaza nota -1 ceea ce are semnificatia "nota inexistenta".
Daca nota obtinuta la o materie este mai mare sau egala decat nota minima 5, atunci media
ponderata se calculeaza conform formulei:
N
C i Ni
Medie i 1
N
Ci 1
i
CREATE OR REPLACE
FUNCTION calcul_medie( p_pk_link in number) RETURN number IS
v_medie number;
-- acest cursor aduce toate disciplinele asociate unui student
cursor c_materii is
Page 31 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
BEGIN
v_sum_note_credite := 0;
v_sum_credite := 0;
Page 32 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
end loop;
RETURN round(v_medie,3) ;
EXCEPTION WHEN others THEN
return -1;
END;
/
In exemplul de mai sus, structura de date cu materiile studiate, ca dealtfel si notele obtinute de student la o
disciplina, sunt create cu ajutorul cursoarelor PL/SQL. Cursorul reprezinta o instructiune select care in loc
sa afiseze datele la consola, le salveaza in memorie intr-o structura de date. Sintaxa cursorului este
urmatoarea:
cursor nume_cursor is
select …
Avand aceasta structura de date in memorie, ea poate fi baleiata si accesata fiecare linie din rezultatul
selectului prin constructia:
for curr_record in c_materii loop
--- instructiuni PL/SQL ce folosesc datele din linia curenta
"curr_record"
end loop;
Sau, un cursor poate fi accesat prin constructia:
open nume_cursor(parametri intrare cursor);
fetch nume_cursor into curr_record;
close nume_cursor ;
Page 33 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
1.18 Exercitii
1. Verifica daca o carte este disponibila sau imprumutata: returneaza 0 daca este disponibila
in biblioteca, 1 in caz ca este imprumutata:
CREATE OR REPLACE
FUNCTION carte_disponibila(titlu_carte in varchar2) return number is
begin
…
return …;
end;
/
CREATE OR REPLACE
FUNCTION nr_carti_per_autor(nume_autor in varchar2) return number is
begin
…
return …;
end;
/
TRIGER-ul este o secţiune de cod ce se execută automat la un anumit eveniment. Odată definit acel
eveniment, baza de date are grijă să lanseze în execuţie trigger-ul corespunzător ori de câte ori are loc
evenimentul.
Sintaxa unui trigger este aceeasi cu a unui bloc PL/SQL cu diferenta ca, in cazul triggerului avem acces la
valorile vechi si noi din linia de tabel care tocmai se modifica.
Page 34 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
In header-ul triggerului se defineste si conditiile de rulare care fac sa se aprinda triggerul. De exemplu, daca
dorim ca un trigger sa se execute inaintea unui insert sau update in tabela note, atunci in definitia acestuia
trebuie sa punem conditia:
BEFORE
INSERT OR UPDATE
ON Imprumuturi
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
Ceea ce se traduce prin urmatoarele:
- Triggerul se executa inainte de a introduce sau modifica datele (before insert or update)
- Se aplica la tabela "Imprumuturi" (ON Imprumuturi)
- Informatiile care sunt inlocuite sunt accesibile prin constructia "OLD", iar cele noi prin
constructia "NEW". Exemplu: "old:cod_disciplina" aduce codul disciplinei ce este in prezent in
tabela pe linia curenta, iar "new:cod_disciplina" aduce codul disciplinei care tocmai se
doreste a se introduce in linia curenta. Avand acces la ambele valori, putem face comparatii
si analiza care sa hotarasca daca operatia de modificare este corecta sau nu.
- Triggerul se va executa pentru fiecare linie afecata de operatia in desfasurare din tabela
(FOR EACH ROW).
Gestionarea valorilor din coloanele de tip primary key reprezinta un task relativ complex deoarece este
dificil de gasit un numar unic care sa fie inserat in linia curenta a tabelei. Daca tabela contine doar cateva
linii, atunci valorile de PK pot fi usor gestionate, dar daca tabela are mii de linii, atunci aceste pk-uri trebuie
calculate automat.
Pentru aceasta, se defineste mai intai un generator de numere crescatoare care sa furnizeze in orice
moment un numar nou luat dintr-o secventa si apoi trebuie definit un trigger care sa citeasca numarul din
secventa si sa-l insereze automat in pk-ul randului nouintrodus in tabel.
Page 35 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
MINVALUE 1
MAXVALUE 9999999999999
;
1.19.2 Exercitii
Sa se scrie triggerul din exemplu si sa se verifice functionalitatea la inserarea unei noi linii in
tabela imprumuturi.
Pe baza modelului sa se scrie un trigger care sa completeze automat coloana pk_carte la
inserarea unei carti in tabela "carti".
Sa se scrie un trigger care completeaza automat data_start si data_end pentru un nou
imprumut (data_start = sysdate, data_end = data_start + 3 saptamani)
Page 36 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
In acest capitol sunt date sub forma de exercitii o serie de rapoarte (selecturi) create pe baza de date "stud"
studiata in cadrul orelor de curs. Aceste rapoarte ofera un suport pentru aprofundarea cunostintelor legate
de fraza select, reprezentand in acelasi timp un exercitiu util in vederea pregatirii examenului de verificare
de la sfarsitul cursului.
Mai jos este data o lista de intrebari la care studentii sunt invitati sa raspunda, iar in cazul intampinarii unor
obstacole mai dificile, pot consulta lista de raspunsuri atasata la sfarsit.
1.20 Intrebari
Page 37 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
1.21 Raspunsuri
1. select nume_student, prenume_student from studenti;
2. -- studenti si grupe
Page 38 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Page 39 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Page 40 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
Page 41 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010
13. Nume student, cod grupa, medie generala, in ordinea descrescatoare a mediilor
Page 42 of 42