Sunteți pe pagina 1din 4

I. (0.

5p) In ce consta dictionarul de date si care este deosebirea intre tabelele prefixate cu ALL_,
respectiv _USER?

Dictionarul de date Oracle este una din componentele principale ale Serverului. El consta dintr-o
multime de tabele si view-uri ce constituie o referinta read-only a bazei de date.
Dictionarul de date (Data Dictionary) furnizeaza informatii despre:
-structuri logice sau fizice
-nume, definitii, spatii alocate obiectelor
-restrictii de integritate
-monitorizare
Tabelele prefixate cu ALL_ ofera informatii despre obiectele care pot fi accessate de utilizator, in timp
ce tabelele prefixate cu USER_ ofera informatii despre obiecte aflate in proprietatea utilizatorului.

II. (0.5p) Ce este jurnalul de tranzactii si care este utilitatea lui?

Jurnalul tranzacţiilor este un fişier special întreţinut de SGBD, în care sunt memorate informaţiile
despre tranzacţiile efectuate asupra bazei de date cum sunt:
-identificatorul sau codul tranzacţiei;
-momentul începerii execuţiei tranzacţiei;
-numărul terminalului sau identificatorul utilizatorului care a iniţiat tranzacţia;
-datele introduse; înregistrările modificate şi tipul modificării.
Jurnalul de tranzactii e util pentru ca in momentul in care apare o anomalie care ar putea distruge
baza de date, pe baza jurnalului de tranzactii (si nu numai) se poate reface baza de date in forma
initiala.

III. (0.5p) In ce situatii se creeaza automat un index?


Un index unic (unique) se creeaza automat cand se defineste o restrictie de integritate de tip
PRIMARY KEY sau UNIQUE.

IV. Se da urmatoarea baza de date relationala:


CLIENT[Codcl, Nume, Pren, Datan, Adresa]
CONT[Nrcont, Tipcont, Datacre, Sold_la_zi, Codcl]
OPERATIUNE[Nrcont, Tipop, Data, Suma, Operator]
1. (1p+1p) Exprimati urmatoarea interogare in unul din limbajele studiate in teoria bazelor de date,
precum si in SQL.
Care sunt conturile pentru care nu s-a facut operatiune de tip "extragere"?

In limbaj algebric:
R1=SE Tipop="extragere" OPERATIUNE
R1[Nrcont, Tipop, Data, Suma, Operator]
R2=SJN(CONT, R1)
R2[Nrcont, Tipcont, Datacre, Sold_la_zi, Codcl]
R3=DIF(CONT,R2)
R3=[Nrcont, Tipcont, Datacre, Sold_la_zi, Codcl]
R4=JN(CLIENT,R3)
R4=[Codcl, Nume, Pren, Datan, Adresa, Nrcont, Tipcont, Datacre, Sold_la_zi]

In SQL:
SELECT cl.Nume, cl.Pren, c.Tipcont, c.Sold_la_zi, o.Nrcont
FROM client cl, cont c, operatiune o
WHERE cl.Codcl=c.Codcl and c.Nrcont=o.Nrcont and cl.Codcl NOT IN
(SELECT cl.Codcl
FROM client cl, cont c
WHERE cl.Codcl=c.Codcl and Tipop="extragere");

2. (1p) Creati o tabela virtuala care sa contina toate operatiunile efectuate pe conturi de tip "la vedere":
numele clientului, numarul contului, data operatiei si numele operatorului:
CARD[Numele, Prenumele, Nrcont, Data_op, Operator]

CREATE OR REPLACE VIEW card (Numele, Prenumele, Nrcont, Data_op, Operator)


AS SELECT cl.Nume, cl.Pren, c.Nrcont, o.Data, o.Operator
FROM client cl, cont c, operatiune o
WHERE cl.Codcl=c.Codcl and c.Nrcont=o.Nrcont and c.Tipcont="la vedere";

3. (1.5p) Formulati urmatoarea prelucrare in SQL sau SQLPlus: Sa se stearga toate conturile cu sold 0
ale unui client,ale carui nume si prenume sunt introduse prin dialog.

ACCEPT nume PROMPT "Introduceti numele clientului: "


ACCEPT prenume PROMPT "Introduceti prenumele clientului: "
DELETE FROM cont c, operatiune o
WHERE c.Nrcont=o.Nrcont and c.Sold_la_zi=0 and c.Codcl =
(SELECT Codcl
FROM client
WHERE nume=Nume and prenume=Pren);

4. (1.5p) Scrieti un trigger in PL/SQL care sa actualizeze soldul unui cont, de cate ori se efectueaza o
operatiune pe contul respectiv (in functie de tipul operatiunii, daca este de depunere sau de
extragere).

CREATE OR REPLACE TRIGGER act_sold


AFTER INSERT ON operatiune
DECLARE
s operatiune.Suma%Type;
BEGIN
IF Tipop="extragere"
THEN
SELECT Suma INTO s
FROM operatiune;
UPDATE cont SET Sold_la_zi=Sold_la_zi-s;
END IF;
IF Tipop="depunere"
THEN
SELECT Suma INTO s
FROM operatiune;
UPDATE cont SET Sold_la_zi=Sold_la_zi+s;
END IF;
END;

5. (2.5p) Concepeti un sistem de baze de date unde structura precedenta ocupa locul central.
Descrieti etapele implementarii acestui sistem, iar pentru fiecare etapa, formulati exemple de comenzi
si programe (valabile in sistemul Oracle) dintre cele care ar trebui folosite.

- Se creeaza tabelele CLIENT, CONT si OPERATIUNE impreuna cu restrictiile de integritate:

CREATE TABLE CLIENT (Codcl Number(5), Nume VARCHAR2(15), Pren VARCHAR2(15), Datan
Date, Adresa VARCHAR2(25),
CONSTRAINT Codcl_PK PRIMARY KEY(Codcl));

CREATE TABLE CONT (Nrcont NUMBER(5), Tipcont VARCHAR2(15), Datacre Date, Sold_la_zi
NUMBER(10), Codcl NUMBER(5),
CONSTRAINT Nrcont_PK PRIMARY KEY(Nrcont),
CONSTRAINT Codcl_FK FOREIGN KEY(Codcl) REFERENCES CLIENT(Codcl));

CREATE TABLE OPERATIUNE (Nrcont NUMBER(5), Tipop VARCHAR(15), Data Date, Suma
NUMBER(10), Operator VARCHAR2(25),
CONSTRAINT Nrcont_op_PK PRIMARY KEY(Nrcont),
CONSTRAINT Nrcont_op_FK FOREIGN KEY(Nrcont) REFERENCES CONT(Nrcont));
-Sistemul creeaza automat indecsi atunci cand se defineste o restrictie de integritate de tipul
PRIMARY KEY sau UNIQUE. Deci, in cazul de fata se creeaza automat indecsi pentru Codcl si
Nrcont.
Construim un index pentru coloana Nume din tabela CLIENT pentru gasirea rapida a unui client al
bancii. Deoarece presupunem ca avem un numar mare de clienti si acestia au in general numele de
familie diferit, cream un index de tip B-Tree.

CREATE INDEX index_nume ON CLIENT (Nume ASC);

Presupunem ca nu exista decat un numar redus de operatiuni ce se pot efectua pentru un anume cont
si deci vom crea un index dupa coloana Tipop din tabela OPERATIUNE, care va fi de tip BITMAP
(pentru ca avem un numar redus de valori distincte).

CREATE BITMAP INDEX index_tipop ON OPERATIUNE(Tipop ASC);

Pentru a adauga inregistrari in tabele folosim comanda INSERT:

INSERT INTO CLIENT values (100, "Popescu","Marin",05-FEB-1980,"Str. Brailei, Galati");

- In continuare, vom crea subprograme stocate, adica proceduri si/sau functii.


Creem o procedura care sa actualizeze numele unui client al bancii in cazul unei casatorii (sotia ia
numele sotului/sotul ia numele sotiei/unul din cei doi adauga la numele sau de familie si numele de
familie al celuilalt) sau divort:

CREATE OR REPLACE PROCEDURE schimba_nume(v_codcl NUMBER, v_nume VARCHAR(15))


IS
BEGIN
UPDATE CLIENT SET Nume=v_nume WHERE Codcl=v_codcl;
COMMIT;
END;

Procedura se poate apela:


- din program:
schimba_nume(100,"Ionescu");
-din SQL*Plus:
SQL>EXECUTE schimba_nume(100,"Ionescu");

In mod similar se mai poate crea o procedura care actualizeaza Adresa unui client.

Cream o functie care sa calculeze suma totala pe care o are un client intr-o banca (adica se
cumuleaza Sold_la_zi din toate conturile clientului - daca are mai multe):

CREATE OR REPLACE FUNCTION calculeaza_sold (v_codcl NUMBER(5))


RETURN NUMBER IS
v_sold NUMBER(6);
BEGIN
SELECT SUM(Sold_la_zi) INTO v_sold FROM CONT
WHERE Codcl=v_codcl GROUP BY Codcl;
RETURN v_sold;
END;

-Functia se apeleaza intr-o expresie:


SQL>set serveroutput on
begin
dbms_output.put_line(calculeaza_sold(100));
end;
/
In mod asemanator se poate crea o functie care sa calculeze suma depusa/extrasa in ultima
saptamana/luna pentru un anumit cont.
-Construim un pachet cu procedurile si functiile create:

CREATE OR REPLACE PACKAGE calcule IS


Procedure schimba_nume(v_Codcl NUMBER, v_nume VARCHAR(15));
Procedure schimba_adresa(v_Codcl NUMBER);
FUNCTION calculeaza_sold (v_codcl NUMBER(5)) RETURN NUMBER;
FUNCTION calculeaza_suma_extrasa_lunar (v_nrcont NUMBER(5), v_tipop VARCHAR2(15))
RETURN NUMBER;

CREATE OR REPLACE PACKAGE BOBY calcule IS


CREATE OR REPLACE PROCEDURE schimba_nume(v_codcl NUMBER, v_nume VARCHAR(15))
IS
BEGIN
UPDATE CLIENT SET Nume=v_nume WHERE Codcl=v_codcl;
COMMIT;
END;

CREATE OR REPLACE PROCEDURE schimba_adresa(v_Codcl NUMBER) IS


BEGIN
.....
END;

CREATE OR REPLACE FUNCTION calculeaza_sold (v_codcl NUMBER(5))


RETURN NUMBER IS
v_sold NUMBER(6);
BEGIN
SELECT SUM(Sold_la_zi) INTO v_sold FROM CONT
WHERE Codcl=v_codcl GROUP BY Codcl;
RETURN v_sold;
END;

CREATE OR REPLACE FUNCTION calculeaza_suma_extrasa_lunar (v_nrcont NUMBER(5), v_tipop


VARCHAR2(15))
RETURN NUMBER IS
BEGIN
.....
END;

END;

- Creem rolurile, utilizatorii

CREATE ROLE CASIER;


GRANT EXECUTE ON calcule, SELECT ON CLIENT, CONT, OPERATIUNE, UPDATE ON
OPERATIUNE TO CASIER;
CREATE USER maria IDENTIFIED BY abc;
GRANT CASIER TO maria;

- Putem crea sinonime pentru scurtarea numelor lungi

CREATE SYNONYM oper FRO operatiune;

-Se pot crea si tabele virtuale de genul celei de la punctul 2.:

CARD[Numele, Prenumele, Nrcont, Data_op, Operator]

CREATE OR REPLACE VIEW card (Numele, Prenumele, Nrcont, Data_op, Operator)


AS SELECT cl.Nume, cl.Pren, c.Nrcont, o.Data, o.Operator
FROM client cl, cont c, operatiune o
WHERE cl.Codcl=c.Codcl and c.Nrcont=o.Nrcont and c.Tipcont="la vedere";

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