P. 1
Comenzi SQL

Comenzi SQL

|Views: 7,322|Likes:
Published by ciobanu2

More info:

Published by: ciobanu2 on Aug 28, 2009
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

07/18/2013

pdf

text

original

Constrangeri de integritate

Oracle permite constrangerilor de integritate sa fie definite pentru ta- bele si coloanelor sa forteze reguli sigure, inauntrul unei tabele sau intre tabele. Constrangerile sunt folosite: • de serverul Oracle sa forteze reguli la nivelul tabelei oricand este inserata o linie, actualizata sau stearsa din acea tabela. Constrangerea trebuie sa fie satisfacuta pentru ca operatiile sa reuseasca. • pentru a preveni stergerea unei tabele daca sunt posesiuni din alte tabele. • prin unelte Oracle, ca Oracle Forms, pentru a furniza reguli pentru utilizarea intr-o aplicatie. Constrangerile sunt clasate dupa cum urmeaza: Constrangeri de tabela Acestea pot referi una sau mai multe coloane si sunt definite SEPARAT de definitiile coloanelor din tabela. Constrangeri de coloana Acestea refera o singura coloana si sunt definite INAUNTRUL specificatiei pentru coloana posesoare. Constrangerile pot fi adaugate unei tabele dupa crearea ei si deasemenea temporar dezactivate (vezi comanda ALTER TABLE in capitolul urmator).Toate detaliile despre constrangeri sunt stocate in Dictionarul de Date. Fiecarei constrangeri ii este repartizat un nume. Iti este mai usor sa suplimentezi una tu singur, astfel ca poate fi mai usor referita mai tarziu, dar daca nu, atunci un nume este generat automat pe forma:
SYS_Cn

unde n este un numar unic. Cuvantul cheie CONSTRAINT iti permite sa numesti o noua constrangere tu insuti. Tipuri de constrangeri Puteti defini urmatoarele tipuri de constrangeri: • NULL/NOT NULL • UNIQUE • PRIMARY KEY • FOREIGN KEY(integritatea de referinta) • CHECK
Constrangerea UNIQUE

Aceasta desemneaza o coloana sau o combinatie de coloane ca o cheie uni- ca.Doua linii in aceeasi tabela nu pot avea aceeasi valoare pentru aceasta cheie.NULL-urile sunt permise daca cheia unica este bazata pe o singura co- loana. Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] UNIQUE (Coloana, Coloana, ...)

Sintaxa constrangerii de coloana :
[CONSTRAINT nume constrangere] UNIQUE

De exemplu, pentru a va asigura ca nu sunt 2 nume de departamente identice la o singura locatie:
CREATE TABLE DEPT (DEPTNO NUMBER, DNAME VARCHAR2(9), LOC VARCHAR2(10),

CONSTRAINT UNQ_DEPT_LOC UNIQUE(DNAME,LOC))

In exemplul de mai sus, constrangerea UNQ_DEPT_LOC este o constrangere de ta- bela. Notati ca virgula precede detaliile. O constrangere unica il face pe ORACLE sa creeze un singur index pentru a manui regula. Indecsii sunt discu- tati mai tarziu.
Constrangere de cheie primara

Ca si la cheile unice, o cheie primara forteaza unicitatea unei coloane sau combinatii de coloane implicate si un index unic este creat pentru a conduce aceasta. Totusi poate fi o singura cheie primara pe o tabela, si aceasta este cunoscuta ca fiind cheia definitiva prin care liniile in tabela sunt i- dentificate individul. NULL-urile nu sunt permise in coloanele de chei primare. Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] PRIMARY KEY (Coloana, Coloana, ...) [CONSTRAINT nume constrangere] PRIMARY KEY

Sintaxa constrangerii de coloana : Notati ca aceeasi combinatie de coloane nu poate fi folosita si pentru o cheie primara si pentru una unica. Urmatorul exempludefineste DEPTNO ca o cheie primara folosind o constrangere de coloana:
CREATE TABLE DEPT (DEPTNO NUMBER(2) CONSTRAINT DEPT_PRIM PRIMARY KEY, ...) Constrangere de cheie externa

Cheile externe furnizeaza reguli de integritate de referinta inauntrul unei tabele sau intre tabele. O cheie exeterna este folosita intr-o relatie cu fiecare cheie primara sau unica oriunde si poate fi folosita, de exemplu, pentru a preveni stergerea unui departament in DEPT daca angajatii exista cu acelasi numar de departament in EMP. Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] FOREIGN KEY (Coloana, Coloana, ...) REFERENCES tabela (Coloana, Coloana, ...)

Sintaxa constrangerii de coloana :

[CONSTRAINT nume constrangere] REFERENCES tabela (Coloana)

Notati ca, cuvintele 'FOREIGN KEY' nu sunt folosite versiunea constrangerii de coloana a sintaxei.
Exemplul 1 -----------| DEPT | (parinte) -----------| | /|\ DEPTNO -----------| EMP | (fiu) ------------

Pentru a stabili relatia dintre EMP si DEPT astfel incat EMP.DEPTNO este cheia externa, si fiecare angajat trebuie sa aiba un numar valid de departament care este cunoscut in DEPT:
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)

Optiunea ON DELETE CASCADE Ca rezultat al constrangerii de tabela de mai sus, (care ar fi putut la fel de bine sa fie definita ca o constrangere de coloana), un departament in DEPT nu ar fi putut fi sters daca liniile exista in EMP cu aceeasi valoare DEPTNO. Alternativ, puteti cere ca angajatii corespunzatori sa fie

stersi a- utomat daca departamentul parinte in DEPT este sters. Aceasta este realizata adaugand clauza ON DELETE CASCADE.
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) ON DELETE CASCADE Exemplul 2 -------------EMPNO | EMP | . . -------------. \|/ . . . . . MGR . . . .

Pentru a va asigura ca fiecarei linii de angajat in EMP ii este dat un numar de manager (MGR) pentru un angajat existent valid: CREATE TABLE EMP (EMPNO NUMBER(4) PRIMARY KEY, ... MGR NUMBER(4) CONSTRAINT EMP_MGR REFERENCES EMP(EMPNO), ... Constrangerea de verificare (CHECK) Constrangerea CHECK defineste explicit o conditie pe care fiecare linie trebuie sa o satisfaca(sau sa o faca necunoscuta datorita unui NULL). Conditia poate folosi aceleasi constructii ca acelea intr-o restrictie de cerere, cu urmatoarele exceptii: • subcererile nu sunt permise • referirile la pseudo-coloane ca SYSDATE nu sunt permise Sintaxa: [CONSTRAINT nume constrangere] CHECK (conditie) Alte optiuni ale constrangerilor DISABLE Adaugand inseamna poate fi construi posibila DISABLE unei definitii de constrangere ca ORACLE nu o forteaza. Constrangerea inca citita de uneltele ORACLE pentru a reguli intr-o aplicatie si puteti face constrangerea mai tarziu prin comanda

ALTER

TABLE. CREATE TABLE EMP ( . . . . . , ENAME VARCHAR2(10) CONSTRAINT CHK_UPP_NAM CHECK(ENAME-UPPER(ENAME)) DISABLE, . . . . . . . ) ; Identifica o tabela existenta unde este plasata informatia despre liniile care incalca constrangerea.

EXCEPTIONS INTO nume tabela

CREATE TABLE EMP ( . . . . . , ENAME VARCHAR2(10) CONSTRAINT CHK_UPP_NAM CHECK(ENAME-UPPER(ENAME)) EXCEPTIONS INTO CON_VIOLATE, . . . . . . . ) ; In final, notati ca tabelele referite intr-o constrangere trebuie sa existe in aceeasi baza de date. Daca ele apartin unui utilizator diferit atunci po- sesorul trebuie specificat ca un prefix.

Iata un exemplu complet al constructiei tabelei EMP cu constrangeri : CREATE TABLE EMP (EMPNO NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(10), MGR NUMBER(4) CONSTRAINT EMP_PRIM PRIMARY KEY, CONSTRAINT ENAME_CONS CHECK(ENAME=UPPER(ENAME)),

CONSTRAINT EMP_MGR REFERENCES EMP(EMPNO), HIREDATE DATE DEFAULT SYSDATE, SAL NUMBER(7,2) CONSTRAINT SAL_CONS NOT NULL, COMM NUMBER(7,2), DEPTNO NUMBER(2) CONSTRAINT DEPTNO_CONS NOT NULL, CONSTRAINT EMP_DEPT FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO))

Crearea unei tabele cu linii din alta tabela
Exista o a doua forma a declaratiei CREATE TABLE in care tabela este creata cu linii potrivite, derivate din alta tabela: CREATE TABLE DEPT [(nume-coloana ,. . . .)] AS SELECT declaratie Tabela va fi creata cu coloane specificate si linii recuperate din declaratia SELECT inserata. • Numai constrangerile NULL/NOT NULL sunt mostenite din tabela selectata. • Daca toata coloanele in declaratia SELECT au nume bine definite (nu sunt expresii s.a.m.d.) specificatiile coloanei pot fi omise. • Daca sunt date specificatiile coloanei, atunci numarul de coloane trebuie sa fie egal cu numarul de articole in lista SELECT. Pentru a crea o tabela DEPT30 care tine numerele angajatilor, nume, job-uri si salariile angajatilor din departamentul 30, introduceti: CREATE TABLE DEPT30 AS SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE DEPTNO = 30; Table created. Pentru a vedea descrierea lui DEPT30, introduceti: DESC DEPT30 Pentru a crea o tabela tinand numele angajatului, salariul si detalii de grad, introduceti: CREATE TABLE EMP_SALS (NAME,SALARY,GRADE) AS SELECT ENAME, SAL, GRADE FROM EMP, SALGRADE WHERE EMP.SAL BETWEEN LOSAL AND HISAL; Table created. •

DESC EMP_SALS; Pentru a afisa continutul tabelei EMP SALS, introduceti: SELECT FROM Exercitii 1. Creati o tabela numita PROJECTS, cu coloanele specificate ca mai jos.Pe langa aceasta , definiti PROJID ca, coloana de CHEIE PRIMARA , si asigurati-va ca datele P_END_DATE nu sunt mai recente decat datele P_START_DATE. Creati o a doua tabela, ASSIGNMENTS, ca cea de mai jos. Definiti-i coloana PROJID ca o cheie externa care refera tabela PROJECTS. Coloana EMPNO a tabelei dumneavoastra este o viitoare cheie externa a lui EMP. Aceste doua coloane nu ar trebui sa permita valori NULL (PROJID si EMPNO). Sunt alte constrangeri pe care ar trebui sa le angajam in aceste tabele. 3. Folositi comanda DESCRIBE pentru a verifica definitiile coloanelor. * EMP_SALS;

2.

Solutii
Fiecare din constrangerile aratate mai jos ar fi putut fi definite ca oricare constrangere de tabela sau constrangere de coloana. 1. CREATE TABLE PROJECTS ( PROJID NUMBER(4) CONSTRAINT PROJ_PRIM PRIMARY KEY, P_DESC VARCHAR2(20), P_START_DATE DATE, P_END_DATE DATE, BUDGET_AMOUNT NUMBER(7,2), MAX_NO_STAFF NUMBER(2), CONSTRAINT P_DATE_RULE CHECK(P_START_DATE <= P_END_DATE)) CREATE TABLE ASSIGNMENTS (PROJID NUMBER(4) NOT NULL REFERENCES PROJECTS (PROJID), EMPNO NUMBER(4) NOT NULL REFERENCES EMP (EMPNO), A_START_DATE DATE, A_END_DATE DATE, BILL_RATE NUMBER(4,2), ASSIGN_TYPE VARCHAR2(2))

2.

Management-ul de tabela si Dictionarul de Date
In continuare vom vedea comenzile pentru modificarea si mutarea tabelelor si constrangerilor lor. Deasemenea, vom vedea cum informatii despre baza de date pot fi extrase din Dictionarul de Date.

Modificarea unei tabele
Folositi comanda ALTER TABLE pentru a schimba definitia unei tabele. Sintaxa:
ALTER TABLE nume-tabela [ ADD ](specificator coloana[constrangere de coloana])[ENABLE clauza ] [MODIFY ][DISABLE clauza] [DROP optiuni]

Clauza ADD Folositi cuvantul cheie ADD pentru a adauga o coloana si/sau constrangeri pentru o tabela existenta. Pentru a adauga o coloana tabelei EMP care va tine numele sotului angajatului, introduceti:
ALTER TABLE EMP ADD (SPOUSES_NAME CHAR (10));

Table altered. Pentru a vedea descrierea tabelei revizuite, introduceti:
DESCRIBE EMP;

Pentru a adauga o constrangere de tabela unei tabele existente, care specifi- ca daca salariul lunar nu trebuie sa depaseasca 5000$, introduceti:
ALTER TABLE EMP ADD(CHECK(SAL <=5000));

Clauza MODIFY
Folositi cuvantul cheie MODIFY pentru a modifica definitia unei coloane existente. ALTER TABLE nume MODIFY (tip coloana [NULL]) Pentru a schimba lungimea lui ENAME la 25 de caractere, introduceti : ALTER TABLE EMP MODIFY (ENAME CHAR (25)); Table altered. DESCRIBE EMP; Sunt 4 schimbari pe care nu le puteti face 1. Nu puteti schimba o coloana continand null-uri din NULL in NOT NULL. 2. Nu puteti adauga o noua coloana care este NOT NULL. Faceti-o null, umpleti-o complet si apoi schimbati-o in NOT NULL. (de verificat!) 3. Nu puteti sa scadeti dimensiunea unei coloane sau sa-i schimbati tipul de date, numai daca nu contine date. (de verificat!) 4. Nu puteti folosi optiunea MODIFY pentru a defini constrangeri pe o coloana exceptand NULL/NOT NULL. Pentru a modifica alte constrangeri trebuie sa le eliminati si apoi sa le adaugati specificand modificarile.

Clauza DROP
Folositi clauza DROP pentru a muta o constrangere din alta tabela. Sintaxa: ALTER TABLE nume tabela DROP [CONSTRAINT nume constrangere ] [CASCADE] [PRIMARY KEY ] [UNIQUE (coloana, coloana, ...)]

De exemplu: ALTER TABLE EMP DROP CONSTRAINT EMP_MGR; ALTER TABLE EMP DROP PRIMARY KEY; Optiunea CASCADE (in clauza DROP) Optiunea CASCADE a clauzei DROP face ca orice constrangere dependenta sa fie deasemenea eliminata. De exemplu: ALTER TABLE DEPT DROP PRIMARY KEY CASCADE; ar putea deasemenea sa faca ca constrangerea chaii exetrne din EMP>DEPTNO sa fie eliminata.

Clauza ENABLE/DISABLE
Aceasta clauza a comenzii ALTER TABLE permite constrangerilor sa fie facute posibile sau dezactivate fara a le elimina sau recrea. Sintaxa: [DISABLE] [ UNIQUE (coloana, coloana, ...) ] [CASCADE] [ENABLE ] [ PRIMARY KEY ] [ CONSTRAINT nume constrangere ] Ca si la clauza DROP, adaugarea cuvantului cheie CASCADE semnifica ca constrangerile dependente sunt deasemenea afectate. De exemplu: ALTER TABLE DEPT DISABLE CONSTRAINT DEPT_PRIM CASCADE;

Alte comenzi LDD
Eliminarea unei tabele
Pentru a sterge definitia unei tabele ORACLE, folositi comanda DROP TABLE. Sintaxa: DROP TABLE nume tabela [CASCADE CONSTRAINTS] De exemplu: DROP TABLE EMP; Stergerea unei tabele duce la pierderea tuturor datelor din ea si a tuturor indecsilor asociati ei. Optiunea CASCADE CONSTRAINTS va sterge deaseme- nea referirile la constrangerile de integritate dependente.
Note:

• • • •

Toate Orice Orice Numai

datele vor fi deasemenea sterse din tabela. VIEWS sau SYNONYMS vor ramane, dar vor deveni invalide. tranzactii nerezolvate sunt realizate. creatorul tabelei sau DBA poate sa o stearga.

Comanda COMMENT
Folositi comanda COMMENT pentru a insera un comentariu pana la 255 de caractere, despre o tabela sau coloana, in dictionarul de date. Pentru a adauga un comentariu unei tabele numita EMP, introduceti: COMMENT ON TABLE EMP IS 'Employee Information'; Pentru a adauga un comentariu pe coloana EMPNO in tabela EMP, introduceti: COMMENT ON COLUMN EMP.EMPNO IS 'Unique employee number';

Pentru a sterge un comentariu, emiteti comanda COMMENT fara un comentariu: COMMENT ON COLUMN EMP.EMPNO IS ''; ,/pre> Pentru a vedea comentariul, selectati coloana COMMENTS din una din vederile dictionarului:ALL_COL_COMMENTS sau USER_COL_COMMENTS. Dictionarul de Date este acoperit mai tarziu in acest capitol.

Comanda RENAME
Comanda RENAME este folosita de creatorul lui TABLES, VIEWS si SYNONYMS pentru a scimba numele obiectului bazei de date. Pentru a redenumi un obiect al bazei de date sintaxa este: RENAME vechi TO nou; Pentru a redenumi tabela EMP in EMPLOYEE, introduceti: RENAME EMP TO EMPLOYEE; Pentru a redenumi tabela SALGRADE, introduceti: RENAME SALGRADE TO EMPLOYEE_GRADES; Este important de notat ca orice aplicatii/programe/rapoarte care se refera la obiecte ce au fost redenumite, trebuie amendate.

Comanda TRUNCATE TABLE
Aceasta comanda va permite sa stergeti toate liniile dintr-o tabela. Notati ca comanda DELETE poate deasemenea realiza aceasta ca o parte a tranzactiei de manipulare a datelor (acoperita in capitolul urmator), dar comanda TRUNCATE TABLE umple o tabela mai eficient ca o actiune de definire de date, pana cand nu este retinuta nici o informatie de rollback. Sintaxa: TRUNCATE TABLE nume tabela [REUSE STORAGE]

Optiunea REUSE STORAGE pastreaza spatiul din liniile sterse pentru reutiliza- rea tabelei. Implicit, acest spatiu este eliberat.

Limbajul de manipulare a datelor
In continuare vom explica cum se fac schimbari liniilor intr-o tabela, cum se adauga noi linii sau cum se sterg.

Inserarea de noi linii intr-o tabela
Comanda INSERT este folosita pentru a adauga linii unei tabele Sintaxa comenzii INSERT este:
INSERT INTO nume tabela [ (coloana,coloana,....)] VALUES (valoare,valoare,....);

Este posibila inserarea unei noi linii cu valori in fiecare coloana, in care caz lista de coloane nu este ceruta. Este recomandat ca COLUMN LIST sa fie intotdeauna specificata. Daca lista nu este specificata, software-ul va cere modificari oriunde definitia tabelei este modificata. Pentru a insera un nou departament, introduceti:
INSERT VALUES INTO DEPT (DEPTNO,DNAME,LOC) (50,'MARKETING','SAN JOSE');

Nota aceasta comanda adauga o singura linie unei tabele. Pentru a intra intr-un departament nou, omitand numele departamentului, lista de coloane trebuie specificata:

INSERT VALUES

INTO DEPT (DEPTNO,LOC) (50,'SAN JOSE');

Alternativ, daca numele departamentului nu este cunoscut, un NULL ar putea fi specificat:
INSERT VALUES INTO DEPT (DEPTNO,DNAME,LOC) (50,NULL,'SAN JOSE');

Valorile CHARACTER si DATE trebuie puse in ghilimele simple.
Folosirea Variabilelor de Substitutie pentru a insera linii

Dupa cum am mentionat anterior, INSERT este o comanda pentru o singura lini- e. Folosind variabile de substitutie este posibil sa se mareasca viteza de intrare.
INSERT VALUES INTO DEPT (DEPTNO,DNAME,LOC) (&D_NUMBER, '&D_NAME', '&LOCATION');

Cand comanda este rulata, valorile sunt afisate de fiecare data. Inserarea informatiilor de data si timp Cand se insereaza o valoare DATE, formatul DD-MON-YY este de obicei folosit. Data deasemenea contine informatii de timp, care daca nu sunt specificate, implicit devin miezul noptii (00:00:00). Daca o data trebuie introdusa in alt secol si un timp specific este cerut deasemenea, folositi functia TO_DATE:
INSERT VALUES INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) (7658, 'MASON', 'ANALYST', 7566, TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'), 3000, NULL, 20);

Copierea de linii din alta tabela
INSERT INTO tabela [(coloana, coloana, ....)] SELECT lista-select FROM tabela(e)

Aceasta forma a declaratiei INSERT va permite sa inserati cateva linii intr-o tabela unde valorile sunt derivate din continutul tabelelor existente in baza de date. Pentru a copia toate informatiile din departamentul 10 in tabela D10HISTORY, introduceti:
INSERT INTO D10HISTORY (EMPNO,ENAME,SAL,JOB,HIREDATE FROM EMP WHERE DEPTNO=10;

Notati ca cuvantul cheie 'VALUES' nu este folosit aici. Actualizarea liniilor Declaratia UPDATE va permite sa schimbati valori in liniile unei tabele.
UPDATE SET [WHERE

tabela[alias] coloana [, coloana...] = {expresie, subcerere} conditie];

De exemplu:

Pentru a actualiza linia lui Scott, introduceti:
UPDATE SET WHERE EMP JOB='SALESMAN', HIREDATE = SYSDATE, SAL = SAL*1.1 ENAME = 'SCOTT';

1 record updated.

Daca clauza WHERE este omisa, toate liniile din tabela vor fi actualizate. Este posibil sa folositi subcereri inlantuite si subcereri corelate in decla- ratia UPDATE. Sa presupunem ca ati avut o cifra noua de comisioane pentru angajati siguri. De exemplu, tabela COMMISSION de mai jos este folosita pentru a actualiza li- nii sigure ale tabelei EMP:
COMMISSION EMPNO -----7499 7654 7844 7844 7844 COMM ---1100 500 3500 2000 1500 EMP EMPNO ----7499 7654 7844 COMM ----300 1400 0

Schimbarile listate in tabela COMMISSION pot fi aplicate tabelei EMP, folosind o subcerere corelata si o subcerere inlantuita, ca mai jos: Exemplul 1:
UPDATE EMP SET COMM = (SELECT COMM FROM COMMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMMISSION); 3 records updated.

Tabela COMMISSION poate contine mai mult decat o intrare pentru fiecare angajat, ca in exemplul de mai jos :
EMPNO ----7499 7654 7654 7844 7844 COMISSION COMM ---1100 500 100 2000 1500

Daca doriti sa inlocuiti (REPLACE) valorile din tabela EMP pentru comision cu comisionul TOTAL pentru fiecare angajat listat in tabela COMISSION, atunci puteti utiliza urmatorul SQL : Exemplul 2:
UPDATE EMP SET COMM = ( SELECT SUM(COMM) FROM COMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMISSION); 3 inregistrari modificate. Tabela EMP reflecta comisioanele modificate : EMPNO ----7499 7654 EMP COMM ---1100 600

7844

3500

O alta posibilitate este cea de a adauga (ADD) la valorile comisionului in tabela COMISSION la comisioanele existente in tabela EMP mai mult decat inlocuirea lor. Exemplul 3 realizeaza acest lucru : Exemplul 3:
UPDATE EMP SET COMM = ( SELECT SUM(COMM) + EMP.COMM FROM COMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMISSION); Tabela EMP reflecta comisioanele schimbate : EMP EMPNO ----7844 7499 7654 COMM ---3500 1400 2000

Stergerea Coloanelor dintr-o Tabela Comanda DELETE permite stergerea unei sau mai multor linii dintr-o tabela.
DELETE [WHERE FROM tabela conditie];

Pentru a sterge toate informatiile despre departamentul 10 din tabela EMP, introduceti :
DELETE WHERE FROM EMP DEPTNO = 10;

Daca clauza WHERE este omisa, atunci toate liniile vor fi sterse.

IMAGINI (VIEWS)
Ce este o Imagine ? • • • • • • • O imagine este ca o fereastra prin intermediul careia datele din tebele pot fi vizualizate sau schimbate. O imagine este derivata dintr-o alta imagine sau tabela la care este referita ca tabela de baza a imaginii - o tabela 'reala' cu date care sunt stocate fizic. O imagine este stocata doar ca o secventa SELECT. Este o tabela virtuala - adica este o tabela care nu exista fizic, dar ii apare utilizatorului ca si cum ar exista. O imagine nu are date proprii. Ea manipuleaza datele din tabela de baza asociata. Ingradirea accesului la o baza de date. Selectand dintr-o imagine (VIEW) putem afisa o parte restransa din baza de date. Permite utilizatorilor sa faca cereri simple pentru obtinerea de rezultate din cereri complicate. De exemplu, imaginile permit utili- zatorilor sa selecteze informatii din tabele multiple fara cunoas- terea mecanismelor instructiunii JOIN. Furnizeaza independenta datelor pentru useri ad-hoc si programele aplicatiilor. O imagine poate fi utilizata pentru a extrage trans- parent date din mai multe tebele. De

Imaginile sunt utile pentru urmatoarele scopuri :

asemenea imaginile permit ca aceleasi date sa fie vazute de utilizatori diferiti in feluri dife- rite. Imagini Simple vs. Imagini Complexe Clasificarea unei imagini simple : • furnizeaza date dintr-o singura tabela • nu contine functii sau grupuri (GROUP) de date. O imagine complexa poate fi compusa din date care sunt : • furnizate din mai multe tabele • contine functii sau grupuri de date.
Comanda CREATE VIEW CREATE AS SELECT [ OR REPLACE ] [FORCE] VIEW nume-view [(coloana1, coloana2, ...)] secventa-select [WITH CHECK OPTION [CONSTRAINT nume_constr]]

Coloana1, coloana2, etc. sunt numele date coloanelor in imaginesi trebiue sa corespunda elementelor din lista selectata. Pentru a crea o imagine simpla numita D10EMP, care contine unele detalii ale angajatilor din Departamentul 10, introduceti :
CREATE AS SELECT FROM WHERE VIEW D10EMP EMPNO,ENAME,SAL EMP DEPTNO = 10;

Cand o imagine este creata, un mesaj este afisat : "View created." Imaginea poate fi utilizata ca orice tabela :
SELECT FROM ODRER BY * D10EMP ENAME;

Pentru a crea o imagine complexa numita DEPT_SUMMARY, care contine functii de grup si date din doua tabele :
CREATE AS SELECT FROM WHERE GROUP VIEW DEPT_SUMMARY ( NAME, MINSAL, MAXSAL, AVSAL ) DNAME, MIN(SAL), MAX(SAL), AVG(SAL) EMP,DEPT EMP.DEPTNO = DEPT.DEPTNO BY DNAME;

De notat faptul ca numele coloanelor alternative au fost specificate pentru imagine. Aceasta este o cerinta pentru cazul cand elementele SELECTate nu sunt conforme cu conventia denumirilor din tabele / coloane, sau daca orice coloana din imagine este derivata dintr-o functie sau expresie. De notat si faptul ca daca o coloana este utilizata intr-o cerere (ANNSAL), o imagine a unui alias al coloanei ( nume alternativ pentru coloana in imagine ) nu e necesar. De exemplu :
CREATE AS SELECT VIEW DEPT20 ENAME, SAL*12 ANNSAL

FROM WHERE

EMP DEPTNO = 20;

O imagine nu poate contine clauza ORDER BY. Clauza ORDER BY este specificata cand se executa SELECT din imagine.
Optiunea OR REPLACE

Aceasta optiune permite ca o imagine sa fie creata chiar daca exista una cu acelasi nume, astfel inlociundu-se vechea varianta a imaginii pentru proprietarul ei. Aceasta inseamna ca o imagine poate fi alterata fara a fi abandonata, recreandu-se si redand privilegiile obiectului.
Optiunea FORCE

Aceasta optiune creaza o imagine chiar daca tabela de baza nu exista, sau sunt prea putine drepturi pentru tabela respectiva. Oricum, tabela trebiue sa existe inainte ca imaginea sa poata fi utilizata. Utilizarea unei Imagini cu Operatii DML Imaginile sunt facilitati puternice deoarece ele ne permit sa executam verificari de integritate referentiale asupra datelor modificate prin utilizarea imaginilor. Clauza WITH CHECK OPTION specifica faptul ca INSERT si UPDATE executate pein intermediul imaginii nu permit crearea de linii noi pe care imaginea nu le poate selecta, si de aceea mermite constrangerile de integritate si vreificarile validarilor de date sa fie fortate asupra datelor ce vor fi inserate sau actualizate. In urmatorul exeplu, o imagine numita D10EMP este creata cu WITH CHECK OPTION. Aceasta inseamna ca doar linii care au DEPTNO = 10 pot fi inserate, actualizate sau sterse. Adica nici o secventa DML nu poate sa adreseze imaginea decat daca conditiile clauzei imaginii sunt indepli- nite.
CREATE AS SELECT FROM WHERE WITH VIEW D10EMP EMPNO, ENAME, DEPTNO EMP DEPTNO = 10 CHECK OPTION;

Daca exista o incercare de a executa actiuni DML asupra liniilor pe care imaginea nu le poate selecta intr-o clauza WHERE, se afiseaza eroare :
"ORA_01402 VIEW WITH CHECK OPTION WHERE_Clause voilation."

Urmatorul exemplu va valida intratea oricarei comenzi INSERT/UPDATE astfel incat numarul SAL sa fie intre 1000 si 2000, MGR va trebui sa aibe campul EMPNO valid, si DEPTNO sa existe in tabela DEPT.
CREATE AS SELECT FROM WHERE AND AND WITH VIEW EMP_DATA EMPNO, ENAME, JOB, MGR, SAL, DEPTNO EMP SAL BETWEEN 1000 AND 2000 MGR IN ( SELECT DISTINCT EMPNO FROM EMP ) DEPTNO IN ( SELECT DEPTNO FROM DEPT ) CHECK OPTION;

Pentru a crea o imagine care sa restranga accesul la detaliile personale ale unui angajat valid in tabela EMP, si timpul de acces la orele de servici, atunci introduceti urmatoarea comanda :
CREATE AS SELECT FROM WHERE AND AND WITH VIEW EMP_DETAILS EMPNO, ENAME, JOB, DEPTNO EMP ENAME = USER TO_CHAR(SYSDATE,'HH24') BETWEEN 9 AND 17 TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6 CHECK OPTION;

Cand creati o imagine cu WITH CHECK OPTION, trebiue s-i atribuiti un nume restrictiei WITH CHECK OPTION.
CREATE VIEW EMPLOYEES( ID_NUMBER, NAME, DEPARTMENT) AS SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT) WITH CHECK OPTION CONSTRAINT DEPT_CHECK;

Aceasta restrictie previne inserarea unei coloane in tabela EMP cu un numar care nu exista in tabela DEPT. Cand comanda CREATE VIEW este executata in seventa SELECT care urmeaza AS nu e executata; in loc este doar depozitata in dictionarul de date. Cand accesati date, via o imagine, ORACLE executa urmatoarele operatii : • recupereaza definitia imaginii din dictionarul de date • verifica drepturile de acces • converteste cererea imaginii intr-o operatie echivalenta asupra tabelei sau tabelelor asociate. Cu alte cuvinte, datele sunt recuperate din, sau o actualizare este facuta asupra, tabelei(lor) de baza. Odata ca imaginea a fost creata, trebuie sa se execute o cerere la Tabela Dictionarului de Date numita USER_VIEWS ca sa se vada conanda view. Acesti parametrii SETabili vor influienta afisarea imaginii text : • Maxdata • Arraysize • Long Imaginea text este memorata intr-o coloana de tipul de date Long si ar trebui setat ARRAYSIZE la o valoare mica ( de ex. 1 ) pentru a vizualiza textul. Modificarea Datelor prin Imagini Dupa cum am discutat, restrictiile pot fi impuse cu ajutirul clauzei WITH CHECK OPTION cand o imagine este creata. Mai sunt si alte constrangeri de care trebiue sa fiti atenti. DELETE este interzis cand o imagine contine : 5. conditie Join 6. functii de grup 7. clauza GROUP BY 8. comanda DISTINCT 9. ROWNUM (nr de ordine al randului dupa ce acesta a fost adus din baza de date). UPDATE este interzis cand : 4. Oricare de mai sus 5. Coloane definite prin expresii ( de ex. SAL*12 )

INSERT este interzis cand : 3. Oricare de mai sus 4. Orice NOT NULL coloane nu sunt selectate de imagine ( ex. EMPNO )
Comanda DROP VIEW

Utilizati comanda DROP pentru a sterge o imagine. Aceasta comanda elimina definitia imaginii din baza de date. Coloanele si liniile nu sunt afectate deoarece sunt stocate in tabelele de unde a derivat fiecare ima- gine. Imaginile sau alte aplicatii bazate pe o imagine stearsa devin invalide. De notat ca o imagine poate fi derivata dintr-o tabela sau de fapt dintr-o alta imagine !
Sintaxa DROP este : DROP VIEW nume_imagine; Doar creatorul imaginii poate sa o stearga.

Exercitii - Crearea si Utilizarea Imaginilor 1. Definiti o imagine care sa produca urmatoarea iesire cand este referita intr-o cerere. Rulati o cerere pentru a testa imaginea.
DEPTNO AVERAGE ------ ---------10 2196.66667 20 2175 30 1566.66667 MAXIMUM ------5000 3000 2850 MINIMUM ------1300 800 950 SUM ----8750 10875 9400 NO_SALS -------3 5 6

NO_COMMS -------0 0 4

2. Utilizand imaginea de mai sus, extrageti urmatoarea informatie. Nuarul angajatului trebuie introdus la rulare.
EMPNO AVERAGE ----------7902 2175 ENAME --------FORD JOB ------ANALYST SAL ---3000 HIREDATE --------05-DEC-83 MINIMUM ------800 MAXIMUM ------3000

3. Creati o imagine care sa impuna urmatoarele restrictii la insrearea datelor in tabela ASSIGNMENTS. 1. Projid trebuie sa fie mai mic de 2000. 2. Data de sfarsit trebiue sa fie dupa data de inceput. 3. Tiputile valide pentru Assign_type sunt PF, WT sau ED. 4. Bill_rate trebuie sa fie mai mic decat 50.00 pentru Assign_type PF, mai mic de 60.00 pentru WT si mai mic de 70.00 pentru ED. 5. EMPNO trebuie sa fie valid. 6. Retineti clauza WITH CKECK OPTION. SOLUTII
1. CREATE AS SELECT VIEW AGGREGATES ( DEPTNO, AVERAGE, MAXIMUM, MINIMUM, SUM, NO_SALS, NO_COMMS ) DEPTNO, AVG(SAL), MAX(SAL), MIN(SAL), COUNT(SAL), COUNT(COMM), EMP BY DEPTNO; EMP.DEPTNO, ENAME,

2.

FROM GROUP SELECT

3.

FROM WHERE AND CREATE AS SELECT

JOB, SAL, HIREDATE, MINIMUM, MAXIMUM, AVERAGE EMP, AGGREGATES AGG EMP.DEPTNO = AGG.DEPTNO EMP.EMPNO = & EMPNO; VIEW ASG_VAL

PROJID, EMPNO, A_START_DATE, A_END_DATE, BILL_RATE, ASSIGN_TYPE, HOURS, FROM ASSIGNMENTS WHERE A_START_DATE < A_END_DATE AND PROJID < 2000 AND BILL_RATE <= DECODE( ASSIGN_TYPE,'PF',50,'WT',60,70) AND EMPNO IN ( SELECT EMPNO FROM EMP ) WITH CHECK OPTION;

Procedurile stocate In urmatoarele randuri vom trece in revista "filozofia" si avantajele utilizarii procedurilor stocate pe serverul de baze de date. De asemenea, vom prezenta o serie de elemente privind modalitatile de folosire si respectiv privind integrarea procedurilor stocate in cadrul diverselor aplicatii realizate. In plus vor mai fi expuse cateva exemple practice de utilizare si implementare a acestei tehnologii. Dezvoltarea aplicatiilor de baze de date presupune gasirea de solutii care sa permita constructia eficienta si posibilitatea de modificare a procedurilor care realizeaza operatiunile asupra informatiei incluse in bazele de date. Procedurile stocate pe serverul de baze de date sunt solutia principala pentru crearea unor aplicatii performante, constituind in acelasi timp modalitatea cea mai eficienta de implementare a operatiunilor asupra bazelor de date in sistemele client/server. Ce sunt procedurile stocate? Procedurile stocate reprezinta o colectie precompilata de instructiuni SQL salvate pe serverul de baze de date sub un nume si procesate unitar. Ele permit utilizatorului sa realizeze operatiuni complexe asupra bazei de date prin intermediul unui singur apel transmis de aplicatia sursa. De asemenea, utilizatorul are posibilitatea de a folosi variabilele declarate, instructiunile conditionale si alte elemente puternice de programare. Procedurile stocate sunt o componenta omniprezenta in cazul sistemelor de baze de date relationale bazate pe tehnologia client/server (MS SQL Server sau Oracle). Avantajele utilizarii procedurilor stocate: Prezentam cateva dintre avantajele fundamentale care rezulta din folosirea acestei tehnologii: - Procedurile stocate sunt salvate intr-o forma compilata, deci prezinta o viteza de executie mai mare decat a unor interogari SQL realizate ad-hoc.

-

-

Exista posibilitatea de a executa o succesiune de instructiuni SQL in cadrul unei singure proceduri stocate. In cadrul unei proceduri stocate exista posibilitatea de a face referinta la alte proceduri stocate, ceea ce determina posibilitatea de executie inlantuita a acestora. Facilitatea de a folosi un set suplimentar de instructiuni fata de standardul SQL, determina cresterea flexibilitatii acestui instrument. De asemenea, instructiunile conditionale sau repetitive permit constructia unor adevarate programe de manipulare a bazelor de date. Posibilitatea de utilizare a variabilelor determina, printre altele, facilitatea de a construi interogari SQL parametrizabile. Asupra procedurilor stocate pot fi setate drepturi de acces, independent de cele care au fost asupra celorlalte elemente ale bazei de date (tabele, indecsi, vizualizari etc.). - De asemenea, prin intermediul procedurilor stocate este posibila "ruperea" nivelului aplicatiei de baze de date si a elementelor de interfata ale acesteia de nivelul propriu-zis al bazei de date. In acest mod, modificarile ce vor afecta procedurile de manipulare a datelor se vor realiza direct la nivelul bazei de date, neafectand sursele propriu-zise ale aplicatiile (aplicatia nu va include decat instructiunile de executie a procedurilor stocate).

Modul de constructie a procedurilor stocate:

Sa creem tabela: CREATE TABLE repere (cod number(5) primary key, denumire varchar2(15), explicatii varchar2(25)) Inserati citeva inregistrari in acesta tabela. Exemplu 1: Dorim sa creem o procedura stocata care sa stearga un anumit articol din tabela repere: CREATE OR REPLACE PROCEDURE stergrepere (codrep IN NUMBER) IS BEGIN Delete From repere Where cod = codrep; End stergrepere; Exemplu 2: Dorim sa creem o procedura care sa insereze un anumit numar de articole in aceasta tabela: PROCEDURE inserez_produse (numar in number) AS BEGIN declare denumire varchar2(15); begin for cnt in 1 .. numar loop denumire := 'prod'||to_char(cnt,'99999'); insert into produse values (cnt,denumire,’’); end loop; END; end; Putem folosi declaratia EXECUTE pentru a rula o procedura stocata. Procedurile stocate sunt diferite de functii deoarece nu pot returna valori in locul numelui lor si nu pot fi folosite direct intr-o expresie. Pentru a insera 150 de articole in tabela produse vom scrie:

1.In SQL*Plus: EXECUTE inserez_produse(150); 2. In SQL Navigator: begin inserez_produse(150); end; Modificati acesta procedura in sensul inserarii unui anumit numar de articole incepand cu un cod initial. Exemplul 3: In continuare dorim sa actualizam campul explicatii cu valoarea ‘nou’ la toate articolele cu un cod mai mare decat o valoare data: PROCEDURE actualizez_produse (numar in number) AS BEGIN declare codp number; denumire varchar2(15); explicatii varchar2(25); cursor mycur is select cod, denumire, explicatii from repere where cod>=numar; begin open mycur; loop fetch mycur into codp, denumire, explicatii; exit when mycur%notfound; if mycur%found then update repere set explicatii='nou' where cod=codp; else null; end if; end loop; close mycur; end; end; Exemplul 4: PROCEDURE acordare_bonus (sel_marca NUMBER) IS bonus REAL; eroare EXCEPTION; BEGIN SELECT sal * 0.15 INTO bonus FROM emp WHERE marca = sel_marca; IF bonus IS NULL THEN RAISE eroare; ELSE UPDATE plati SET plati = plati + bonus WHERE marca = sel_marca; END IF; EXCEPTION WHEN eroare THEN dbms_output.put_line('marca inexistenta in baza de date’); END acordare_bonus;

Procedura acordare_bonus primeste ca argument la rulare marca salariatului pentru care se aplica bonificatia. Daca in urma rularii instructiunii Select nu este selectata nici o inregistrare din baza de date, executia codului va fi transmisa in sectiunea exceptiilor, afisandu-se un mesaj de eroare. In caz contrar se aplica instructiunea Update asupra tabelei Plati. Pentru acordarea drepturilor de executie a unei proceduri stocate se va utiliza instructiunea GRANT: Grant Execute on procedure_name to Public/User Instructiunea GRANT poate asigna dreptul de executie pentru procedura stocata, identificata prin intermediul Procedure_name, unui utilizator sau tuturor utilizatorilor bazei de date (identificatorul Public). Concluzii: Procedurile stocate constituie incontestabil, o cale pentru eficientizarea operatiunilor realizate asupra bazelor de date. Acest lucru se impune din cel putin doua elemente esentiale: primul consta in forma compilata a acestora, fapt ce determina rularea mai rapida; iar cel de-al doilea priveste elementele de programare in cazul aplicatiilor de baze de date, procedurile stocate determinand in acest sens o integrare mai fireasca a elementelor de limbaj SQL. Declansatorii (Triggeri) Declansatorii (Triggers) sunt un tip special de proceduri stocate care permit realizarea automata a unor actiuni (proceduri SQL) atunci cand datele sunt modificate prin intermediul unuia dintre operatorii standardului SQL: Update, Insert sau Delete. Declansatorii pot fi utilizati pentru constructia unor reguli complexe la nivelul bazei de date sau pentru pastrarea integritatii referentiale a acesteia. Printre avantajele utilizarii declansatorilor mentionam: - Declansatorii opereaza automat, imediat dupa ce au fost realizate modificarile asupra bazei de date. - Prin intermediul acestui instrument exista posibilitatea de a efectua modificari in cascada asupra mai multor tabele ale bazei de date. - Declansatorii permit constructia unor reguli stricte la nivelul bazei de date utilizand facilitatile oferite de limbajul SQL. Un element important care este necesar sa-l subliniem in legatura cu declansatorii il constituie faptul ca acestia nu pot fi aplicati decat la nivelul tabelelor bazei de date. Cand o instructiune SQL satisface conditia triggerului, Oracle automat executa corpul triggerului. Sintaxa este urmatoarea: CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
{BEFORE event | AFTER event | INSTEAD OF event} referencing_clause WHEN (condition) pl_sql_block

unde event poate fi unul din urmatoarele (sau mai multe separate prin OR):
DELETE event_ref INSERT event_ref UPDATE event_ref UPDATE OF column, column... event_ref ddl_statement ON [schema.] {table|view} ddl_statement ON DATABASE SERVERERROR LOGON LOGOFF STARTUP SHUTDOWN

event_ref: ON [schema.]table ON [schema.]view ON [NESTED TABLE nested_table_column OF] [schema.]view referencing_clause: FOR EACH ROW REFERENCING OLD [AS] old [FOR EACH ROW] REFERENCING NEW [AS] new [FOR EACH ROW] REFERENCING PARENT [AS] parent [FOR EACH ROW] Sintaxa intr-o forma mai simplificata arata astfel: CREATE [OR REPLACE] TRIGGER name { BEFORE | AFTER } { event [OR ...] } ON table FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE func ( arguments ) Exemplul 1: Pentru a crea un trigger care pentru fiecare client sters din tabela Customer creaza un articol in tabela CustomerHistory se procedeaza astfel: CREATE OR REPLACE TRIGGER DeleteCustomer BEFORE DELETE ON Customer FOR EACH ROW BEGIN INSERT INTO CustomerHistory VALUES(:Old.CUSTOMERID, :Old.LastName, :Old.FirstName); END DeleteCustomer;

Observatii: Daca printr-o instructiune SQL se sterg mai multi clienti, triggerul actioneaza la fiecare client sters. In corpul triggerului new si old trebuie precedate de “:”. Exemplul 2: Dorim sa inseram clienti in tabela Customer folosind un trigger si o secventa care sa genereze automat codul clientului (customerid):
create sequence secventa_customer start with 1 increment by 1 nomaxvalue;

Daca in tabela de clienti avem deja 120 de intrari (cu customerid 1-120) putem porni secventa folosind:
start with 121 Daca dorim ca numerele de clienti sa fie din 2 in 2 folosim: increment by 2 Acum se poate crea triggerul ce va insera automat urmatorul numar din secventa in coloana customerid: create trigger customer_trigger before insert on customer for each row begin select secventa_customer.nextval into :new.customerid from dual; end; / Modificarea unui trigger (in sensul dezactivarii sau a reactivarii) se face astfel: alter trigger nume_trigger disable; alter trigger nume_trigger enable; Stergerea unui trigger se face astfel:

drop trigger nume_trigger

Functii O clasa speciala de proceduri stocata este formata din functiile prin intermediul carora poate fi returnata o valoare. O functie stocata prezinta in plus fata de o procedura o clauza speciala Return, prin intermediul careia se realizeaza aceasta operatiune. Iata cum cream o functie simpla: create or replace function first_func (var) return varchar2 as begin return var ||’Parametru’; end; Exemplu2 : Pentru a crea o functie care sa primeasca ca parametru 2 numere si sa returneze –1 daca primul numar este mai mic, 0 daca sunt egale si 1 daca primul numar este mai mare se procedeaza astfel: CREATE or REPLACE function modul (x in number, y in number) return number is begin if (x < y) then return (-1); elsif ( x = y) then return (0); else return (1); end if; end;
O functie care retuneaza pozitia de la care incepe un sir in alt sir:

CREATE FUNCTION instr(s1 in VARCHAR,s2 in VARCHAR) RETURNS INTEGER IS 'DECLARE pos integer; BEGIN pos:= instr(s1,s2,1); RETURN pos; END;
Exemple:

PL/SQL

DECLARE cantitate_in_stoc NUMBER(5); BEGIN SELECT quantity INTO cantitate_ in_stoc FROM stocuri WHERE product = 'MINGI DE TENIS’ FOR UPDATE OF quantity; IF cantitate_in_stoc > 0 THEN UPDATE stocuri SET quantity = quantity - 1 WHERE product = 'MINGI DE TENIS’; INSERT INTO achizitii_record VALUES ('Mingi de tenis achizitionate’, SYSDATE); ELSE INSERT INTO purchase_record VALUES ('Stocul epuizat’, SYSDATE);

END IF; COMMIT; END; Procedura defineste o variabila (cantitate_in_stoc) care va prelua din baza de date stocul disponibil pentru un articol de stoc, urmand ca prin intermediul instructiunii IF sa se realizeze fie diminuarea stocului, fie includerea in tabela purchase_record a unui mesaj de avertizare privind epuizarea stocului. Concluzii: PL/SQL este limbajul care permite manipularea eficienta a elementelor bazei de date. Adaugarea elementelor procedurale alaturi de limbajul SQL constituie "cheia" care permite constructia unor proceduri complexe de prelucrare a bazei de date. Constructia procedurilor si functiilor stocate la nivelul bazei de date prezinta alaturi de viteza mare de executie (consecinta compilarii acestora), avantajul gestionarii unitare prin intermediul unor utilitare tip Schema Manager. Aceste instrumente constituie o modalitate de constructie, vizualizare sau modificare a ansamblului de elemente si obiecte ce compune baza de date Oracle.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->