Sunteți pe pagina 1din 42

Programarea sistemelor

de masura I

Laborator
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

2.16 FUNCTII PL/SQL. CALCULAREA MEDIEI PONDERATE PENTRU UN STUDENT....................................................29


2.17 CURSOARE PL/SQL..........................................................................................................................................31
2.18 EXERCITII..........................................................................................................................................................32
2.19 TRIGGERI DEFINITI IN BAZA DE DATE...............................................................................................................32
2.19.1 Exemplu: trigger pentru completarea automata a coloanei pk_imprumut..............................................33
2.19.2 Exercitii....................................................................................................................................................34
7. EXERCITII DE TIP SELECT PE BAZA DE DATE “STUD”.........................................................................35
2.20 INTREBARI.........................................................................................................................................................35
2.21 Raspunsuri........................................................................................................................................................36

Page 3 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

1. Introducere

Prezentul indrumar de laborator se adreseaza studentilor de la Facultatea de Inginerie Electrica, Energetica


si Informatica Aplicata ce studiaza disciplina " Programarea sistemelor de masura I".
Scopul laboratorului este de da studentului posibiltatea sa lucreze efectiv pe calculator pentru a verifica si
aprofunda cunostintele invatate in orele de curs. In principal, laboratorul se axeaza pe studiul instructiunilor
SQL (Structured Query Language) de conectare si gestionare a bazelor de date, baze de date ce se
intalnesc in orice aplicatie majora de programare:
 interogarea bazelor de date (instructiunea SELECT)
 introducerea datelor (instructiunea INSERT)
 modificarea si stergerea datelor (UPDATE, DELETE)
 limbajul PL/SQL, functii si proceduri stocate
 triggeri definiti in baza de date

Page 4 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

2. Laborator 1: Studiul posibilitatilor de conectare la o baza


de date. Creare useri, sesiuni, utilizarea programului SQL
Navigator

1.1 Startarea programului SQL Navigator, introducere cont si parola

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.

 Lansare program: Start\All programs\Quest Software\SQL Navigator 4\SQL Navigator 4


 Conectare la baza de date: orice conectare la o baza de date presupune introducerea unei
conexiuni la baza de date si a unui cont cu parola corespunzatoare:
o Nume_baza: stud
o Cont: nume_student, parola: nume_student

1.2 Schimbarea conexiunii la baza de date, fisierul tnsnames.ora

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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.

1.2.1 Studiul fisierului tnsnames.ora

Se deschide fisierul tnsnames.ora din folderul Oracle (C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN):


cu un editor de tip text (Notepad.exe) si se analizeaza definitia conexiunii "Stud_local" la baza de date
"stud":

Stud_local =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.6)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stud)
)
)

Conexiunea numita "Stud_local" defineste urmatoarele:


 Host = 192.168.1.6 : este adresa calculatorului pe care s-a instalat baza de date. Acest "Host"
poate fi dat si sub forma de nume de calculator (de exemplu "statia01") sau, daca baza de date
este instalata pe calculatorul curent, putem gasi adresa sub forma HOST = localhost.
 PROTOCOL = TCP: reprezinta protocolul de comunicatie in retea intre baza de date si client. In
general, acest protocol se alege de tipul TCP
 PORT = 1521: este portul unde baza de date primeste cererile de conexiune de la clienti. In
realitate sunt doua servicii independente care implementeaza functionalitatea unei baze de date.
Aceste servicii se regasesc in fereastra "Services" din sectiunea Control Panel/Administrative
Tools:
o OracleServiceNumeBazaDeDate (ex OracleServiceStud daca baza de ate se numeste
"Stud"), este serviciul Windows ce ruleaza efectiv baza de date
o Oracle…Listener: este alt serviciu Windows ce asculta cererile de conectare la portul
precizat in tnsnames.ora si transfera aceste comenzi catre serviciul "OracleServiceStud".
Serviciul bazei de date ruleaza intern si nu poate primi cereri din afara. Singurul care

Page 6 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

 Sa se defineasca o noua conexiune la aceeasi baza de date "stud", dar conexiunea sa se


numeasca "stud" sau "stud_statia1"
 Sa se schimbe in conexiunea definita mai sus adresa HOST-ului: sa se introduca sub forma
numelui calculatorului si sa se verifice corectitudinea definitiei prin conectarea la baza de date
folosind aceasta noua conexiune.

1.3 Userul SYS

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

1.4 Conectarea la baza de date cu ajutorul programului SQL plus

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

SQL Plus. In figurile ce urmeaza se prezinta modul de lansare a programului SQL Plus si fereastra de
conectare la baza de date.

Figura 1: Lansarea programului SQL Plus

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

Figura 3: Sintaxa comenzii CONN

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

1.4.2 Fortarea stergerii unui user cu sesiuni deschise in baza de date

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 ;

1.5 Utilizare program SQL Navigator.

Page 9 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

In continuare se vor experimenta functionalitatile puse la dispozitie de programul SQL Navigator:


 Conectare la baza de date

Figura 4: Fereastra de conectare la baza de date a programului SQL Navigator

 Vizualizarea obiectelor din baza utilizand fereastra “Object Navigator”:

Page 10 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

Figura 5: Fereastra de vizualizare a obiectelor

Se deschide fereastra de vizualizare a obiectelor si se analizeaza urmatoarele obiecte: tabele,


constrangeri, indecsi, view-uri, trigeri, proceduri, functii, useri, tablespace-uri, etc.
 Extragerea codului SQL de creare a unui obiect din baza de date folosind facilitatea “Extract
DDL”:
o Vizualizare cod SQL pentru tabele, constrangeri, trigeri, etc…
 Crearea de noi obiecte in baza folosind Wizard-ul din SQL Navigator (creare tabele,
constrangeri).
 Facilitatea “Search”: utilizati meniul “Search” pentru gasirea obiectelor din baza cu anumite
proprietati (obiecte ce contin un anumit cod, obiecte invalide, etc..)
 Deschiderea unei pagini de editare SQL:

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

3. Aplicatia "E-library". Definirea obiectelor in baza de date

1.6 Descrierea aplicatiei "E-library"

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

1.8 Tabele ce trebuie definite in baza de date.

Datele de lucru sunt stocate in urmatoarele tabele:


 Autori:
o pk_autor : number
o nume_autor : varchar2(50)
 Carti:
o pk_carte : number
o domeniu :varchar2(50)
o titlu_carte :varchar2(100)

Page 13 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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)

1.9 Constrangeri definite intre tabele

 Primary key: fiecare tabela contine o constrangere de tip primary_key


 Foreign key:
o carti  autori
o imprumuturi  carti
o imprumuturi  cititori
 Check:
o Carti.domeniu in (beletristica, stiinte, divertisment)
 Unique:
o Carti: nume_carte
o Autori:nume_autor
 Not Null: nume_autor, titlu_carte, imprumuturi(pk_cititor, pk_carte,data_start, data_end)

Exemplu:

Page 14 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

--0. Sterg toate tabelele in ordinea copii -> parinti


drop table imprumuturi;
drop table carti;
drop table autori;
drop table cititori;

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

ALTER TABLE cititori ADD CONSTRAINT pk_cititor PRIMARY KEY (pk_cititor);

-- 3. Carti:
-- Start of DDL Script for Table LUCI.CARTI
-- Generated 17-Nov-2010 11:40:22 from LUCI@statia1_scoala

CREATE TABLE carti


(pk_carte NUMBER NOT NULL,
domeniu VARCHAR2(50),
titlu_carte VARCHAR2(100) NOT NULL,
pk_autor1 NUMBER,
pk_autor2 NUMBER,
pk_autor3 NUMBER);
ALTER TABLE carti ADD CONSTRAINT pk_carte PRIMARY KEY (pk_carte);
ALTER TABLE carti ADD CONSTRAINT ck_carti_domeniu CHECK (domeniu in
('Beletristica','Stiinte','Divertisment'));
ALTER TABLE carti ADD CONSTRAINT uk_nume_carte UNIQUE (titlu_carte);
ALTER TABLE carti ADD CONSTRAINT fk_carti_autori FOREIGN KEY (pk_autor1)
REFERENCES autori (pk_autor);

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

ALTER TABLE imprumuturi ADD CONSTRAINT pk_imprumut PRIMARY KEY (pk_imprumut);

Page 15 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

ALTER TABLE imprumuturi ADD CONSTRAINT fk_imprumuturi_carti FOREIGN KEY


(pk_carte) REFERENCES carti (pk_carte);
ALTER TABLE imprumuturi ADD CONSTRAINT fk_imprumuturi_cititori FOREIGN KEY
(pk_cititor) REFERENCES cititori (pk_cititor);

1.10 Introducerea datelor de lucru

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

Page 17 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

4. Aplicatia "E-library". Dezvoltarea rapoartelor

In acest capitol se vor dezvolta diverse rapoarte din baza de date care sa reflecte situatia cartilor si a
imprumuturilor din biblioteca.

1.11 Descrierea comenzii SELECT

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.

In continuare sunt prezentate cateva formate acceptate de comanda SELECT.

1.11.1 Afisarea tuturor datelor dintr-o tabela


select * from studenti;

Figura 7: afisarea tuturor coloanelor din tabel

1.11.2 Afisarea selectiva a coloanelor din tabela

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:

select nume_stud, cod_grupa from studenti;

Page 18 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

Figura 8: Afisarea selectiva a coloanelor din tabel

1.11.3 Filtrarea datelor afisate:

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

o Clauza where cu mai multe conditii de filtrare (utilizarea operatorului AND).


select nume_stud,cod_grupa
from studenti
where cod_grupa = '6303' and pk_an_scolar = 1;

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

1.11.4 Selectarea informaţiilor din mai multe tabele simultan

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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.

1.11.5 Afişarea liniilor ce nu respectă condiţia de legătură dintre tabele

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.

1.11.6 Operatori logici

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

and nota_finala > 8


;

2. sa se listeze toţi studenţii care au luat nota 7:


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
;

Operatori AND , OR, NOT

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

Mai sunt disponibili şi alţi operatori de relaţie care ne ajută la construirea clauzei "where":

 operatorul "between": stabileşte un interval în care se află informaţia selectată:


Ex: afişează studenţii cu notele cuprinse în intervalul [5, 8]:
select studenti.nume_stud , sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
and nota_finala between 5 and 8
;

 operatorul "in" : stabileşte o listă de valori în care se află informaţia selectată:


Ex: afişează studenţii cu notele incluse în mulţimea { 3, 4, 6, 8} :
select studenti.nume_stud , sit_finala.nota_finala
from studenti,sit_finala
where studenti.pk_student = sit_finala.pk_student
and nota_finala in (3,4,6,8)
;

 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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

 operatorul "is null":


Am vorbit de valoarea null. O valoare nulă e o valoare care nu e disponibilă, neatribuită, necunoscută sau
neaplicabilă, ca să fim înţeleşi. Adică, oriunde folosim null într-o expresie, toată expresia devine null. Nu pot
folosi expresii de tipul =null, sau <>null.
De exemplu, mă interesează dacă mai sunt studenţi fără grupă asociată, ca să-i introduc la grupa care
trebuie. Să incercăm cu fraza:
select * from studenti where cod_grupa = null;

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

Vrem să vedem studenţii care au grupă asociată?


select * from studenti where cod_grupa is not null;

1.11.7 Clauza ORDER BY

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

1.12.1 Afisarea datelor dintr-o tabela.

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

1.12.2 Afisarea datelor din mai multe tabele

Sa se scrie fraze select pentru afisarea urmatoarelor informatii:

1. Titlu carte, nume autori:


2. Toate imprumuturile de carti din biblioteca (titlu_carte, nume_cititor, data_start,
data_end, data_return)
3. Toate imprumuturile care nu au fost returnate pana in ziua de azi. Ziua curenta se afla
cu ajutorul comenzii sysdate.
4. Toate imprumuturile care nu au fost returnate pana in ziua de azi si numarul de zile de
cand au fost imprumutate, numarul de zile de intarziere.
5. Toate imprumuturile mai vechi de 2 saptamani
6. Numarul de carti care trebuie sa fie returnate in urmatoarea saptamana: selectul
afiseaza ziua si numarul de carti care trebuie sa fie returnate.
7. Toate cartile care exista in mod fizic in biblioteca (nu sunt imprumutate in acest
moment). Aici intra cartile care nu au fost imprumutate niciodata plus cartile care au fost
imprumutate si returnate pana in ziua curenta. Selectul trebuie sa trateze si cazul cand o
carte a fost imprumutata de mai multe ori (a fost returnata si apoi imprumtata catre alt
cititor).

Page 26 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

8. Toate imprumuturile pentru un cititor dat


9. Toate imprumuturile care nu au fost returnate la termen de catre un cititor dat
(data_return > data_end or data_return is null and sysdate>data_end)
10. Cititorii care au mai mult de un imprumut in ziua curenta: nume cititor, titlu_carte,
data_start, data_end -Stop
11. Numele cititorilor si numarul de imprumuturi efectuate de acel cititor in decursul timpului:
nume_autor, numar_imprumuturi
12. Lista cu primii 3 cititori in ordinea numarului de imprumuturi
13. Lista cu primii 3 cititori care au cele mai multe intarzieri la returnarea cartilor
14. Lista primilor 3 cititori cu calificative negative. Calificativul unui cititor este dat de raportul
dintre numarul de carti imprumutate si numarul de intarzieri la returnare. Este posibil ca
un cititor sa aiba multe intarzieri (deci este in capul listei la numar de intarzieri), dar si
multe imprumuturi, deci calificativul acestui cititor este mai bun decat al unui alt cititor cu
o singura intarziere dar si un singur imprumut.
15. Cartile cele mai solicitate pentru imprumut (cu numarul cel mai mare de imprumuturi)
16. Cei mai bine cititi autori (autorii ai caror carti au fost cel mai mult solicitate)

Page 27 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

5. Comenzile Update si Delete

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

1.13 Comanda Update

1.13.1 Sintaxa comenzii Update

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

6. Titlurile cartilor scrise de un autor (prim_autor) sa inceapa cu majuscula si apoi sa continue


cu litera mica

1.14 Comanda Delete

1.14.1 Sintaxa comenzii Delete

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

Sa se scrie instructiuni “delete” care sa stearga urmatoarele informatii:


1. Imprumuturile pentru un anumit cititor
2. Un cititor din baza de date. Se folosesc 2 metode:
o Se sterg toate informatiile din tabele copil care tin de tabela “cititori”. (Ex: tabela
“imprumuturi”). Apoi se sterge informatia din tabela parinte. In caz contrar la executia
instructiunii delete din tabela parinte apare eroare datorata constrangerilor de tip “foreign key”
care leaga cititorul de imprumuturi.
o Se executa comanda delete cu optiunea “on delete cascade”: in acest caz se sterg
toate informatiile din tabelele copil care sunt legate prin constrangeri “foreign key” de tabela
parinte.

Page 29 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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.

1.15 Sintaxa limbajului PL/SQL

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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.

1.16 Functii PL/SQL. Calcularea mediei ponderate pentru un student

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

Unde Ci si Ni reprezinta numarul de credite si respectiv nota pentru disciplina numarul i.


Codul functie este listat in continuare avand incluse comentariile necesare intelegerii algoritmului de calcul:

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

select distinct note.pk_materie , materii.credite , materii.nume_materie


from note,materii
where note.pk_materie = materii.pk_materie
and note.pk_link_stud = p_pk_link
and lower(materii.nume_materie) not like('educatie fizica%')
;

-- cursorul c_nota gaseste nota finala obtinuta de student la o anumita


disciplina si o anumita sesiune
cursor c_nota(p_pk_materie in number, p_sesiune in varchar2) is
select note.nota from note
where note.pk_materie = p_pk_materie
and note.pk_link_stud = p_pk_link
and note.sesiune = p_sesiune;
-- variabile interne pentru stocarea notei, suma produselor nota*credite, suma
creditelor
v_nota number;
v_sum_note_credite number;
v_sum_credite number;

BEGIN
v_sum_note_credite := 0;
v_sum_credite := 0;

-- parcurg cursorul cu materiile studiate


for rec_materii in c_materii loop
-- aflu nota obtinuta de studentul curent la materia curenta
-- incep cu nota obtinuta in Sesiunea III
open c_nota(rec_materii.pk_materie,'Sesiunea III');
fetch c_nota into v_nota;
if c_nota%found then
close c_nota;
else
-- nu am gasit nota in sesiunea III, caut in sesiunea II
close c_nota;
open c_nota(rec_materii.pk_materie,'Sesiunea II');
fetch c_nota into v_nota;
if c_nota%found then
close c_nota;
else
-- nu am gasit nota nici in sesiunea II, caut in sesiunea I
close c_nota;
open c_nota(rec_materii.pk_materie,'Sesiunea I');
fetch c_nota into v_nota;
if c_nota%found then
close c_nota;
else
-- nu am gasit nota nici in sesiunea I, pun by default valoarea
-1 (nota inexistenta)
close c_nota;
v_nota := -1;
end if;
end if;
end if;

Page 32 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

if v_nota > 4 then


v_sum_note_credite := v_sum_note_credite + v_nota *
rec_materii.credite;
v_sum_credite := v_sum_credite + rec_materii.credite;
end if;

end loop;

if v_sum_credite > 0 then


v_medie := nvl(v_sum_note_credite,0)/v_sum_credite;
else
v_medie := -1;
end if;

RETURN round(v_medie,3) ;
EXCEPTION WHEN others THEN
return -1;
END;
/

1.17 Cursoare PL/SQL

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

1.18 Exercitii

Sa se scrie functii PL/SQL care sa rezolve urmatoarele taskuri:

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

2. Calculeaza numarul de carti pentru un autor dat

CREATE OR REPLACE
FUNCTION nr_carti_per_autor(nume_autor in varchar2) return number is
begin

return …;
end;
/

1.19 Triggeri definiti in baza de date

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

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

1.19.1 Exemplu: trigger pentru completarea automata a coloanei


pk_imprumut

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.

1. Creare secventa PK_IMPRUMUT:

CREATE SEQUENCE pk_imprumut


INCREMENT BY 1
START WITH 1

Page 35 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

MINVALUE 1
MAXVALUE 9999999999999
;

2. Creare trigger ce completeaza automat coloana pk_imprumut:


CREATE OR REPLACE TRIGGER bef_imprumuturi
BEFORE INSERT ON imprumuturi REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_imprumut.NEXTVAL into :new.pk_imprumut from dual;
end;
/

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

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

7. Exercitii de tip select pe baza de date “stud”

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

Sa se scrie fraze select care sa afiseze urmatoarele informatii:


1. Toti studentii din facultate: nume, prenume
2. Toti studentii din facultate pe anul universitar in curs: nume, prenume, cod grupa
a. Toti studentii din anul scolar curent cu litera mare in ordine alfabetica
b. Toti studentii de la litera B; (B sau b)
c. Toti studentii al caror prenume este ‘Ion’ sau ‘ION’ sau ‘ion’, ‘ionica’…
d. Toate fetele din anul 4 (ultima litera este ‘a’ sau ‘A’, sau prenumele face parte din familia:
Gabi, Carmen…
e. Primele 3 caractere din numele studentilor
f. Primele 3 caractere din numele studentului si primele 3 caractere din prenume
g.
3. An universitar, cod grupa, nr studenti inscrisi la grupa respectiva pe fiecare an universitar
a. Numai grupele cu mai putin de 5 studenti inscrisi
4. An universitar, an studiu, nr studenti inscrisi la anul de studiu pe fiecare an universitar
5. Nume student, cod grupa, descriere grupa, cod specializare pe anul scolar curent
6. Cod specializare, anul de studiu, disciplinele aferente specializarii pe fiecare an de studiu
7. Disciplinele din anul 4 de studiu
8. Nume student, cod grupa, disciplinele (cod disciplina, descriere disciplina) pe care le studiaza
studentul curent (Balan Mitica) si anul scolar curent
9. Nume student, grupa, disciplina, cea mai mare nota obtinuta la acea disciplina
a. Sa se afiseze toate disciplinele studentului , chiar daca nu a obtinut note
b. Studentii care nu au obtinut note la toate disciplinele (au absentat la anumite examene)
10. Nume student, varsta (trebuie introdusa coloana “data_nasterii”)

Page 37 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

11. Disciplinele studiate in facultate si media notelor la fiecare disciplina


a. Disciplinele, anul universitar si media pe fiecare disciplina
b. Disciplinele studiate in facultate si media notelor la fiecare disciplina pe fiecare grupa si
fiecare an universitar
c.
12. Disciplinele la care media este mai mica decat 8
13. Nume student, cod grupa, medie generala, in ordinea descrescatoare a mediilor
14. Nume student , cod grupa, medie generala, numar credite obtinute
15. Media ponderata a studentilor -> sum(nota*credite)/sum(credite)
16. Studentii din anul 4 de studiu in ordinea alfabetica
17. Studentii din anul 4 de studiu, grupa 6403 in ordinea descrescatoare a mediilor
18. Cel mai bun student din facultate (media ponderata cea mai mare)
19. Lista cu studentii cei mai buni din fiecare grupa (are media ponderata cea mai mare din grupa
respectiva)
20. Numarul total de studenti care au fost inscrisi in facultate (cei care repeta se numara o singura
data)
21. Numarul de studenti din grupa 6403
22. Studentii care repeta anul (se regasesc in acelasi an de studiu pentru ani scolari diferiti)
23. Studentii din anul scolar curent care repeta anul de studiu
24. Lista studentilor care au restante (nume, grupa, materia la care are restanta). Se considera ca un
student are restante daca a obtinut nota sub 5 la o materie sau nu are nota la acea materie de
studiu.
25. Lista studentilor care nu s-au prezentat la examen (nume student, grupa, cod disciplina la care nu
are nota).

1.21 Raspunsuri
1. select nume_student, prenume_student from studenti;

2. -- studenti si grupe

select st.nume_student, st.prenume_student, g.cod_grupa, au.cod_an_universitar


from studenti st, grupe g, studenti_grupe stg, ani_universitari au
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
order by au.cod_an_universitar, g.cod_grupa;

select s.nume_student, s.prenume_student, g.cod_grupa

Page 38 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

from studenti s, studenti_grupe sg, ani_universitari au, grupe g


where s.pk_student = sg.pk_student
and sg.pk_an_universitar = au.pk_an_universitar
and sg.pk_grupa = g.pk_grupa
and au.cod_an_universitar = '2011-2012'
;

select s.nume_student, s.prenume_student, g.cod_grupa


from studenti s, studenti_grupe sg, ani_universitari au, grupe g
where s.pk_student = sg.pk_student
and sg.pk_an_universitar = au.pk_an_universitar
and sg.pk_grupa = g.pk_grupa
and au.cod_an_universitar = '2011-2012'
and upper(s.nume_student) like 'B%'
order by s.nume_student
;
 Toate fetele din anul 4 de studiu
select s.nume_student, s.prenume_student, g.cod_grupa
from studenti s, studenti_grupe sg, ani_universitari au, grupe g, ani_studiu
ast
where s.pk_student = sg.pk_student
and sg.pk_an_universitar = au.pk_an_universitar
and sg.pk_grupa = g.pk_grupa
and g.pk_an_studiu = ast.pk_an_studiu
and au.cod_an_universitar = '2011-2012'
and ast.cod_an_studiu = '4'
and (s.prenume_student like '%a'
or lower(s.prenume_student) in ('carmen', 'gabi'))
order by s.nume_student
;
 Primele 3 litere
select substr(s.nume_student,1,3), substr(s.prenume_student,1,3), g.cod_grupa
from studenti s, studenti_grupe sg, ani_universitari au, grupe g
where s.pk_student = sg.pk_student
and sg.pk_an_universitar = au.pk_an_universitar
and sg.pk_grupa = g.pk_grupa
and au.cod_an_universitar = '2011-2012'
order by s.nume_student
;

3. select au.cod_an_universitar, g.cod_grupa, count(sg.pk_student)


from studenti_grupe sg, ani_universitari au, grupe g
where sg.pk_an_universitar = au.pk_an_universitar
and sg.pk_grupa = g.pk_grupa
group by au.cod_an_universitar, g.cod_grupa
order by au.cod_an_universitar desc
;
3.a. select au.cod_an_universitar, g.cod_grupa, count(sg.pk_student)
from studenti_grupe sg, ani_universitari au, grupe g
where sg.pk_an_universitar = au.pk_an_universitar
and sg.pk_grupa = g.pk_grupa
group by au.cod_an_universitar, g.cod_grupa
having count(sg.pk_student) < 5

Page 39 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

order by au.cod_an_universitar desc


;

4. select au.cod_an_universitar, ast.cod_an_studiu, count(sg.pk_student)


from studenti_grupe sg, ani_universitari au, grupe g, ani_studiu ast
where sg.pk_an_universitar = au.pk_an_universitar
and sg.pk_grupa = g.pk_grupa
and g.pk_an_studiu = ast.pk_an_studiu
group by au.cod_an_universitar, ast.cod_an_studiu
order by au.cod_an_universitar desc
;
5. select st.nume_student, st.prenume_student, g.cod_grupa, sp.cod_specializare
from studenti st, grupe g, studenti_grupe stg,
ani_universitari au, specializari sp
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and g.pk_specializare = sp.pk_specializare
and au.cod_an_universitar = '2011-2012'
order by sp.cod_specializare;

6. select sp.cod_specializare, ast.cod_an_studiu, d.cod_disciplina


from specializari sp, discipline d, ani_studiu ast
where sp.pk_specializare = d.pk_specializare
and d.pk_an_studiu = ast.pk_an_studiu
order by ast.cod_an_studiu
;
7. select ast.cod_an_studiu, d.cod_disciplina
from discipline d, ani_studiu ast
where d.pk_an_studiu = ast.pk_an_studiu
and ast.cod_an_studiu = '4'
order by ast.cod_an_studiu
;
8. select s.nume_student, s.prenume_student, g.cod_grupa,
d.cod_disciplina
from studenti s, studenti_grupe stg, grupe g,
specializari sp, discipline d
where s.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = sp.pk_specializare
and sp.pk_specializare = d.pk_specializare
and s.nume_student like 'Anto%'
;
9. – studentii si notele obtinute
select s.nume_student, s.prenume_student, g.cod_grupa,
d.cod_disciplina, n.nota
from studenti s, studenti_grupe stg, grupe g,
specializari sp, discipline d, note n
where s.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = sp.pk_specializare
and sp.pk_specializare = d.pk_specializare
and n.pk_student_grupa = stg.pk_student_grupa

Page 40 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

and n.pk_disciplina = d.pk_disciplina


and s.nume_student like 'Anto%'
;

9.a. select s.nume_student, s.prenume_student, g.cod_grupa,


d.cod_disciplina,
(select max(nota) from note
where note.pk_disciplina = d.pk_disciplina
and note.pk_student_grupa = stg.pk_student_grupa) nota
from studenti s, studenti_grupe stg, grupe g,
specializari sp, discipline d
where s.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = sp.pk_specializare
and sp.pk_specializare = d.pk_specializare
-- and s.nume_student like 'Anto%'
order by g.cod_grupa, s.nume_student
;

9.b. – studentii care au absentat la anumite examene

select s.nume_student, s.prenume_student, g.cod_grupa,


d.cod_disciplina
from studenti s, studenti_grupe stg, grupe g,
specializari sp, discipline d
where s.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = sp.pk_specializare
and sp.pk_specializare = d.pk_specializare
and not exists
(select 1 from note
where note.pk_disciplina = d.pk_disciplina
and note.pk_student_grupa = stg.pk_student_grupa
)
order by g.cod_grupa, s.nume_student
;

11.a – disciplinele si mediile pe fiecare disciplina

select s.nume_student, s.prenume_student, g.cod_grupa,


d.cod_disciplina
from studenti s, studenti_grupe stg, grupe g,
specializari sp, discipline d
where s.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = sp.pk_specializare
and sp.pk_specializare = d.pk_specializare
and not exists
(select 1 from note
where note.pk_disciplina = d.pk_disciplina
and note.pk_student_grupa = stg.pk_student_grupa
)

Page 41 of 42
Baze de date
Facultatea IEEIA Product name: Programarea sistemelor de masura I – laborator Date: Feb - 2010

Document no. Version no.: 0.1 CR no.: Author: Lucian Nita

order by g.cod_grupa, s.nume_student


;

11.b -- Disciplinele, anul universitar si media pe fiecare disciplina

select au.cod_an_universitar,d.cod_disciplina, round(avg(n.nota),2) medie_disc


from discipline d, note n, ani_universitari au, studenti_grupe stg
where d.pk_disciplina = n.pk_disciplina
and n.pk_student_grupa = stg.pk_student_grupa
and stg.pk_an_universitar = au.pk_an_universitar
group by au.cod_an_universitar, d.cod_disciplina
order by au.cod_an_universitar,d.cod_disciplina;

11.c -- media pe fiecare disciplina si grupa: Disciplinele, anul universitar,


grupa, media

select au.cod_an_universitar,d.cod_disciplina, g.cod_grupa,


round(avg(n.nota),2) medie_disc
from discipline d, note n, ani_universitari au, studenti_grupe stg, grupe g
where d.pk_disciplina = n.pk_disciplina
and n.pk_student_grupa = stg.pk_student_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_grupa = g.pk_grupa
group by au.cod_an_universitar, d.cod_disciplina, g.cod_grupa
order by au.cod_an_universitar,d.cod_disciplina;

13. Nume student, cod grupa, medie generala, in ordinea descrescatoare a mediilor

select s.nume_student, s.prenume_student, au.cod_an_universitar,


round(avg(n.nota),2) medie_stud
from studenti s, studenti_grupe stg, note n, ani_universitari au
where s.pk_student = stg.pk_student
and n.pk_student_grupa = stg.pk_student_grupa
and au.pk_an_universitar = stg.pk_an_universitar
group by s.nume_student, s.prenume_student, au.cod_an_universitar
order by avg(n.nota) desc
;

 Medie calculata cu functie stocata in baza de date


select s.nume_student, s.prenume_student, au.cod_an_universitar,
calcul_medie(stg.pk_student_grupa) medie_stud
from studenti s, studenti_grupe stg,ani_universitari au
where s.pk_student = stg.pk_student
and au.pk_an_universitar = stg.pk_an_universitar
order by s.nume_student
;

Page 42 of 42

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