Sunteți pe pagina 1din 6

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)); CREATE INDEX index_nume ON CLIENT (Nume ASC); 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;
4

-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