Sunteți pe pagina 1din 10

CREAREA I UTILIZAREA VEDERILOR.

UTILIZAREA OBIECTELOR DE TIP SECVEN PENTRU GENERARE AUTOMAT DE VALORI

Obiective
O vedere este un tabel logic bazat pe un alt tabel sau pe o alt vedere i nu conine date proprii. Tabelele pe baza crora sunt create vederile se numesc tabele de baz. La nivelul bazei de date o vedere este stocat sub forma unei instruciuni SELECT n dicionarul de date. Prin parcurgerea acestui referat studentul va dobndi cunotinele necesare pentru: descrierea unei vederi; crearea unui obiect de tip vedere; extragerea datelor dintr-o vedere; modificarea structurii unei vederi; inserarea, actualizarea i tergerea datelor dintr-o vedere; tergerea unei vederi; crearea i utilizarea generatoarelor de secvene.

Avantajele utilizrii vederilor restricioneaz accesul la baza de date deoarece o vedere pune la dispoziia utilizatorilor doar o parte a datelor din baza de date; permit utilizatorilor s apeleze la interogri simple pentru a obine rezultatele unor interogri complexe. De exemplu, vederile permit utilizatorilor s extrag informaii din mai multe tabele fr a cunoate modul de realizare a jonciunilor.. asigur independena datelor pentru utilizatori i aplicaii. O singur vedere poate fi utilizat pentru a obine date din mai multe tabele; furnizeaz grupurilor de utilizatori accesul la date n conformitate cu anumite criterii, stabilite de administratorul bazei de date.

Vederile se clasific n dou grupe: simple i complexe. Diferena de baz ntre cele dou grupe este legat de operaiile LMD (inserare, actualizare i tergere). Caracteristici Numr de tabele Conine funcii Conine grupuri de date Operaii LMD Vederi simple 1 Nu Nu Da Vederi complexe 1 sau mai multe Da Da Nu ntotdeauna

O vedere simpl este o vedere care: furnizeaz date dintr-un singur tabel; nu conine funcii sau grupuri de date; permite execuia unor operaii LMD.

O vedere complex este o vedere care : extrage date din mai multe tabele; conine funcii sau grupuri de date; nu permite ntotdeauna operaii LMD.
1

Crearea unei vederi Instruciunea ce permite crearea unei vederi este CREATE VIEW, avnd urmtoarea sintax.
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nume_vedere [(alias[, alias...])] AS subinterogare [WITH CHECK OPTION [CONSTRAINT nume_constr]] [WITH READ ONLY]

unde: OR REPLACE FORCE NOFORCE nume_vedere alias - recreeaz vederea dac aceasta exist deja - creeaz vederea indiferent daca exist sau nu tabelele de baz - creeaz vederea numai dac exist tabelele de baz; este opiunea implicit - este numele vederii - specific noul nume pentru o coloan a vederii; numrul de alias-uri trebuie s corespund numrului de expresii selectate de vedere - este o instruciune SELECT; se pot utiliza alias-uri pentru coloanele din clauza SELECT - specific faptul c pot fi actualizate doar liniile accesibile vederii - este numele constrngerii - interzice execuia unei instruciuni LMD pe vedere.

subinterogare WITH CHECK OPTION nume_constr WITH READ ONLY

Pentru a crea o vedere numit EMPVU10 care conine detalii despre angajaii din departamentul 10 se va executa urmtoarea instruciune: CREATE VIEW empvu10 AS SELECT empno, ename, job FROM emp WHERE deptno=10; Observaii: subinterogarea care definete o vedere poate conine o instruciune SELECT complex (inclusiv jonciuni, grupuri i subinterogri); subinterogarea care definete o vedere nu poate conine clauza ORDER BY. Aceast clauz va fi specificat n momentul interogrii vederii; opiunea OR REPLACE poate fi utilizat pentru a putea modifica vederea fr a o terge i recrea.

Redenumirea coloanelor ce apar n vedere se poate face n dou moduri: 1. se includ alias-urilor de coloan n subinterogare: CREATE VIEW AS SELECT FROM WHERE salvu30 empno EMPLOYEE_NUMBER, ename NAME, sal SALARY emp deptno=30;
2

Exemplul anterior creeaz o vedere care conine numrul, numele i salariul angajailor din departamentul 30. Coloanele acestei vederi au numele EMPLOYEE_NUMBER, NAME i SALARY. 2. se includ alias-uri de coloan n clauza CREATE VIEW. CREATE VIEW AS SELECT FROM WHERE salvu30 (EMPLOYEE_NUMBER, NAME, SALARY) empno, ename, sal emp deptno=30;

Interogarea vederilor Extragerea datelor din vederi se face n acelai mod ca n cazul tabelelor. SQL> SELECT * 2 FROM salvu30; EMPLOYEE_NUMBER ---------------7698 7654 7499 7844 7900 7521 NAME SALARY ------- ------BLAKE 2850 MARTIN 1250 ALLEN 1600 TURNER 1500 JAMES 950 WARD 1250

Odat creat vederea, se poate interoga tabelul USER_VIEWS din dicionarul de date pentru a obine numele i definiia vederii. Textul instruciunii SELECT care implementeaz vederea este memorat ntr-o coloan de tip LONG (ir de caractere). Accesarea datelor din baza de date corespunztoare unei vederi presupune execuia urmtoarelor operaii de ctre serverul Oracle: 1. extrage definiia vederii din dicionarul de date (mai exact din tabelul USER_VIEWS); 2. verific privilegiile de acces pentru tabelele de baz; 3. convertete interogarea vederii ntr-o operaie echivalent asupra tabelului (tabelelor) de baz. Cu alte cuvinte, datele sunt extrase din, sau actualizate n tabelul (tabelele) de baz.

Modificarea unei vederi Opiunea OR REPLACE permite crearea unei vederi, chiar dac exist deja o vedere cu acelai nume, nlocuindu-se astfel vechea versiune a vederii cu cea nou. Aceasta nseamn c o vedere poate fi modificat fr a fi necesar tergerea i recrearea ei. Urmtorul exemplu modific vederea EMPVU10 utiliznd clauza CREATE OR REPLACE VIEW. Suplimentar se adaug un alias pentru fiecare coloan. SQL> 2 3 4 5 CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT empno, ename, job FROM emp WHERE deptno=10;
3

Not: Cnd se furnizeaz nume alternative (alias-uri) coloanelor n clauza CREATE VIEW, alias-urile trebuie listate n aceeai ordine ca i coloanele din subinterogare.

Crearea unei vederi complexe


SQL> 2 3 4 5 6 CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.dname, MIN(e.sal), MAX(e.sal), AVG(e.sal) FROM emp e, dept d WHERE e.deptno=d.deptno GROUP BY d.dname;

Exemplul anterior creeaz o vedere complex care conine numele, salariul minim, salariul maxim i salariul mediu pentru fiecare departament. De notat c au fost specificate alias-uri pentru vedere. Acest lucru este necesar dac una din coloanele vederii rezult din evaluarea unei funcii sau expresii.

Reguli pentru executarea operaiilor LMD asupra unei vederi Pentru a putea executa operaii LMD asupra datelor din baza de date prin intermediul vederii trebuie avute n vedere o serie de reguli. 1. 2. Nu se poate terge o linie aparinnd unei vederi dac definiia vederii conine : funcii grup; clauz GROUP BY; cuvntul cheie DISTINCT. Nu se pot modifica datele dintr-o vedere dac vederea conine: oricare din elementele de la punctul 1; coloane definite prin expresii (de exemplu, SALARY*12); pseudocoloana ROWNUM.

3. Nu pot fi inserate date ntr-o vedere dac: - vederea conine oricare din elementele de la punctul 1 i 2; - exist coloane NOT NULL fr valoare implicit n tabelul de baz i care nu au fost selectate n vedere.

Utilizarea clauzei WITH CHECK OPTION Exist posibilitatea ca, prin intermediul vederilor, s se efectueze verificri de integritate referenial asupra datelor. Se pot, de asemenea, fora constrngeri la nivelul bazei de date. O vedere poate fi utilizat pentru a asigura integritatea datelor, dar ntr-o manier destul de limitat. Clauza WITH CHECK OPTION specific faptul c instruciunile INSERT i UPDATE executate asupra vederii nu pot crea linii noi pe care vederea nu le poate selecta. Prin urmare, vederile pot fora verificri asupra datelor ce vor fi inserate sau actualizate. Dac se ncearc

execuia unei operaii LMD pe linii care nu au fost selectate de vedere se va afia un mesaj de eroare, mpreun cu numele constrngerii (dac acesta a fost specificat). Pentru exemplificare s considerm vederea SQL> 2 3 4 5 CREATE OR REPLACE VIEW empvu20 AS SELECT * FROM emp WHERE deptno=20 WITH CHECK OPTION CONSTRAINT empvu20_ck;

Orice ncercare de a modifica numrul departamentului pentru orice linie din vedere va eua deoarece nu respect constrngerea WITH CHECK OPTION. SQL> UPDATE empvu20 2 SET deptno=10 3 WHERE empno=7788; update empvu20 * ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation Nici o linie nu este actualizat pentru c, dac numrul departamentului ar deveni 10, vederea nu ar mai putea selecta acel angajat. Datorit faptului c vederea poate vedea doar angajaii din departamentul 20, utilizarea clauzei WITH CHECK OPTION nu permite ca numrul departamentului pentru aceti angajai sa fie schimbat prin intermediul vederii.

Interzicerea operaiilor LMD Dac se dorete ca asupra vederii s nu poat fi executat nici o operaie LMD, la crearea vederii trebuie specificat opiunea WITH READ ONLY. SQL> 2 3 4 5 6 CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT empno, ename, job FROM emp WHERE deptno=10 WITH READ ONLY;

Exemplul de mai sus modific vederea EMPVU10 pentru a mpiedica orice operaie LMD asupra vederii. Orice ncercare de tergere a unei linii din vedere va genera o eroare. SQL> DELETE FROM empvu10 2 WHERE employee_number=7782; DELETE FROM empvu10 * ERROR at line 1: ORA_01752: Cannot delete from view without exactly one key-preserved table
5

tergerea definiiei unei vederi Pentru a terge o vedere se va utiliza instruciunea: DROP VIEW nume_vedere; Exemplu: DROP VIEW empvu10; Aceast instruciune elimin definiia vederii din baza de date. tergerea vederilor nu are nici un efect asupra tabelelor pe care se bazeaz vederea. Vederile sau aplicaiile bazate pe o vedere tears devin invalide. tergerea unei vederi poate fi efectuat fie de creatorul vederii fie de un utilizator ce deine privilegiul DROP ANY VIEW.

Obiecte de tip secven


Multe aplicaii necesit folosirea de valori distincte pentru o cheie primar. Pentru a ndeplini aceast cerin fie se scriu linii de cod, fie se recurge la utilizarea obiectelor de tip secven pentru a genera automat aceste numere distincte. O secven este un obiect creat de un utilizator i poate fi folosit de mai muli utilizatori. Secvena este generat i incrementat (sau decrementat) de o rutin intern Oracle. Numerele secvenei sunt stocate i generate independent de tabel. Prin urmare, aceeai secven poate fi folosit n mai multe tabele.

Crearea unui obiect de tip secven Instruciunea CREATE SEQUENCE definete o secven ce va genera automat numere secveniale. Sintaxa acestei instruciuni este urmtoarea: CREATE SEQUENCE secventa [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]; unde: secventa INCREMENT BY n este numele generatorului de secven; specific intervalul dintre dou numere consecutive ale secvenei, unde n este un ntreg. Dac aceast clauza lipsete, n este implicit 1; specific primul numr al secvenei. Dac aceast clauz lipsete, implicit n = 1; specific valoarea maxim pe care secvena o poate genera;

START WITH n MAXVALUE n

NOMAXVALUE

specific o valoare maxim de 1027 pentru o secven cresctoare i 1 pentru o secven descresctoare. Aceste valori sunt implicite; specific valoarea minim a secvenei; specific o valoare minim de 1 pentru o secven cresctoare i (1027) pentru una descresctoare. Aceste valori sunt implicite; specific dac secvena continu s genereze valori dup ce a fost atins valoarea maxim / minim, sau dac nu mai genereaz nici o valoare. Opiunea NOCYCLE este implicit; specific serverului Oracle pentru cte valori s aloce spaiu n memorie. Implicit n are valoarea 20.

MINVALUE n NOMINVALUE

CYCLE | NOCYCLE

CACHE n | NOCACHE

Exemplul urmtor creeaz secvena DEPT_DEPTNO, folosit pentru coloana DEPTNO din tabelul DEPT. Secvena ncepe cu valoarea 91, nu permite alocare de memorie i nu permite cicluri de generare. SQL> 2 3 4 5 6 CREATE SEQUENCE dept_deptno INCREMENT BY 1 START WITH 91 MAXVALUE 100 NOCACHE NOCYCLE;

Sequence created. Not: Nu se recomand folosirea clauzei CYCLE atunci cnd secvena este folosit pentru a genera valorile unei chei primare, excepie fcnd cazul cnd se dispune de un mecanism sigur de ndeprtare a vechilor nregistrri i mai rapid dect ciclurile secvenei.

Confirmarea existenei obiectelor de tip secven Odat creat o secven, ea este nscris n dicionarul de date i poate fi identificat cu ajutorul tabelului USER_OBJECTS. De asemenea, se pot confirma setrile unei secvene prin interogarea tabelului USER_SEQUENCES. SQL> SELECT sequence_name, min_value, max_value, 2 increment_by, last_number 3 FROM user_sequences; Coloana LAST_NUMBER conine urmtorul numr disponibil al secvenei.
SEQUENCE_NAME MIN_VALUE -------------- ---------CUSTID 1 DEPT_DEPTNO 1 ORDID 1 PRODID 1 MAX_VALUE ---------1.000E+27 100 1.000E+27 1.000E+27
7

INCREMENT_BY -----------1 1 1 1

LAST_NUMBER ----------109 91 622 200381

Pseudocoloanele NEXTVAL i CURRVAL Odat creat secvena, ea poate fi folosit pentru a genera numere ce vor fi utilizate ulterior n tabele. Referirea urmtoarei valori din secven i a valorii curente se face cu ajutorul pseudocoloanelor NEXTVAL i CURRVAL. Pseudocoloana NEXTVAL este folosit pentru a extrage numere succesive dintr-o anumit secven. Referirea la NEXTVAL se face mpreun cu numele secvenei. Atunci cnd se face referire la secventa.NEXTVAL se genereaz un nou numr al secvenei, ce va fi memorat n CURRVAL. Pseudocoloana CURRVAL este folosit pentru a referi numrul unei secvene ce tocmai a fost generat. nainte de a se face referire la CURRVAL trebuie utilizat NEXTVAL pentru a genera un nou numr. Referirea lui CURRVAL se face mpreun cu numele secvenei. Cnd sequence.CURRVAL este referit, va fi afiat ultima valoare generat de secven.

Reguli pentru utilizarea pseudocoloanelor NEXTVAL i CURRVAL Folosirea pseudocoloanelor NEXTVAL i CURRVAL este permis n urmtoarele situaii: n clauza SELECT a unei instruciuni SELECT ce nu face parte dintr-o subinterogare; n clauza SELECT a unei subinterogri dintr-o instruciune INSERT; n clauza VALUES a unei instruciuni INSERT; n clauza SET a unei instruciuni UPDATE.

Nu este permis utilizarea pseudocoloanelor NEXTVAL i CURRVAL n urmtoarele situaii: n clauza SELECT a unei vederi; ntr-o instruciune SELECT ce conine cuvntul cheie DISTINCT; ntr-o instruciune SELECT ce conine clauzele GROUP BY, HAVING sau ORDER BY; ntr-o subinterogare din instruciuni SELECT, DELETE sau UPDATE; ntr-o expresie DEFAULT n instruciuni CREATE TABLE sau ALTER TABLE.

Utilizarea unei secvene Exemplul urmtor insereaz un nou departament n tabelul DEPT. Se utilizeaz secvena DEPT_DEPTNO pentru generarea unui nou numr pentru departament. SQL> INSERT INTO dept(deptno, dname, loc) 2 VALUES(dept_deptno.NEXTVAL, 3 MARKETING, SAN DIEGO); 1 row created. Pentru vizualizarea valorii curente pentru secvena DEPT_DEPTNO se va executa urmtoarea instruciune: SQL> SELECT dept_deptno.CURRVAL 2 FROM dual; CURRVAL -------91
8

Stocarea secvenelor n memorie permite o accesare mai rapid a valorilor secvenei, stocarea realizndu-se la prima referire a secvenei. Dup ce a fost utilizat ultima valoare din secven, urmtoarea cerere de generare determin o alt stocare a secvenei n memorie. Dei generatorul de secvene furnizeaz numere consecutive fr goluri, aceast aciune se petrece independent de un commit sau un rollback. De aceea, dac se execut un rollback pe o instruciune ce utilizeaz o valoare dintr-o secven, acea valoare este pierdut. Un alt eveniment ce poate provoca goluri n secven este o cdere a sistemului. Dac valorile secvenei sunt stocate n memorie, acestea se pierd n cazul unei cderi de sistem. Este posibil vizualizarea urmtoarei valori disponibile din secven fr a o incrementa, doar dac secvena a fost creat cu opiunea NOCACHE, prin interogarea tabelului USER_SEQUENCES.

Modificarea unei secvene Dac se atinge valoarea MAXVALUE ntr-o secven definit cu opiunea NOCYCLE nu va mai fi atribuit nici o valoare suplimentar i se va genera un mesaj de eroare ce indic faptul c secvena a atins valoarea maxim. Pentru a putea folosi n continuare aceast secven, va trebui s modificm definiia secvenei cu ajutorul instruciunii ALTER SEQUENCE. ALTER SEQUENCE nume_secv [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]; unde: nume_secv este numele generatorului de secvene

Exemplul urmtor modific valoarea incrementului, valoarea maxim i minim, opiunea de ciclare i de stocare pentru secvena DEPT_DEPTNO. SQL> 2 3 4 5 ALTER SEQUENCE dept_deptno INCREMENT BY 1 MAXVALUE 999999 NOCACHE NOCYCLE;

Sequence altered. Pentru verificare se vor afia informaiile din vederea USER_SEQUENCES. Observaii: o secven poate fi modificat doar de utilizatorul care a creat secvena sau de un utilizator ce deine privilegiul ALTER pentru secvena n cauz; sunt afectate doar numerele ce urmeaz s fie generate; secvena trebuie distrus i recreat pentru a ncepe secvena cu un alt numr (specificat n clauza START WITH).

tergerea unei secvene Pentru tergerea unei secvene din dicionarul de date se utilizeaz instruciunea DROP SEQUENCE. Aceast operaie poate fi realizat doar de proprietarul secvenei sau de utilizatorul cu privilegiul DROP ANY SEQUENCE. DROP SEQUENCE nume_secv; Exemplu: SQL> DROP SEQUENCE dept_deptno; Sequence dropped.

Probleme
1. Creai o vedere EMP_VU care s conin numrul, numele i departamentul angajailor din tabelul emp. Redenumii coloana corespunztoare numelui EMPLOYEE. Afiai coninutul vederii EMP_VU. 2. Vizualizai informaiile despre vederea creat la problema 1 din vederea USER_VIEWS (coloanele view_name i text). 3. Folosind vederea EMP_VU scriei o interogare pentru a afia numele tuturor angajailor, mpreun cu departamentele n care lucreaz. 4. Creai vederea DEPT20 care s conin urmtoarele informaii despre angajaii ce lucreaz n departamentul 20: numr angajat, nume angajat i numr departament. Etichetai coloanele vederii astfel: EMPLOYEE_ID, EMPLOYEE i DEPARTMENT_NO. Nu permitei ca unui angajat s i se poat modifica numrul departamentului prin intermediul vederii. 5. Afiai structura i coninutul vederii DEPT20. 6. ncercai s nlocuii numrul departamentului pentru angajatul Smith cu valoarea 30. Explicai cauza ce a condus la generarea erorii semnalat de server. 7. Creai vederea SALARY_VU care s conin numele angajatului, numele departamentului, salariul i gradul de salarizare pentru toi angajaii din emp. Etichetai coloanele astfel: Employee, Department, Salary i Grade. 8. S se creeze o secven ce va fi folosit mpreun cu cheia primar a tabelului DEPARTMENT. Secvena trebuie s nceap cu 60 i s aib o valoare maxim de 200. Incrementul secvenei este de 10. Numele secvenei va fi DEPT_ID_SEQ. 9. S se afieze urmtoarele informaii despre secvena de la problema 8: nume, valoarea maxim, mrimea incrementului i ultimul numr creat. 10. S se realizeze un program interactiv pentru a insera o nregistrare n tabelul DEPARTMENT. Pentru introducerea valorilor n coloana ID se va utiliza secvena creat la problema 8. Se va cere introducerea de la tastatur a numelui departamentului. S se adauge dou departamente numite Education i Administration. S se confirme adugarea celor dou nregistrri. Structura tabelului DEPARTMENT este urmtoarea: Column Name Nulls/Unique Datatype ID Number(7)
10

NAME Varchar2(25)