Sunteți pe pagina 1din 16

www.cartiaz.

ro Carti si articole online gratuite de la A la Z

ORACLE - NOIUNI GENERALE


Oracle nu este un program, ci o suit de programe i conine un DBMS (DataBase Management System), serverul Oracle. Din cadrul mulimii aplicaiilor Oracle vom utiliza pentru nceput SQL*Plus, un instrument care permite o utilizare direct i interactiv a limbajului SQL pentru a accesa serverul Oracle. Observaie: Oracle NU este Case Sensitive nu face diferen ntre litere mici i majuscule.

Instruciuni ORACLE
Principalele instruciuni (comenzi ORACLE) pot fi grupate astfel: Instruciuni pentru manipularea datelor SELECT selecia datelor din tabele INSERT adugarea unei nregistrri ntr-o tabel DELETE tergerea nregistrrilor dintr-o tabel UPDATE modificarea valorilor unor cmpuri dintr-o tabel Instruciuni pentru definirea bazei de date CREATE TABLE crearea structurii unei tabele i adugarea acesteia n baza de date DROP TABLE tergerea fizic a unei tabele dintr-o baz de date ALTER TABLE modificarea structurii unei tabele CREATE VIEW crearea unei tabele virtuale DROP VIEW tergerea unei tabele virtuale Instruciuni pentru accesul la baza de date GRANT acordarea unor drepturi pentru utilizatori REVOKE revocarea unor drepturi acordate unor utilizatori Instruciuni specifice tranzaciilor COMMIT marcheaz sfritul unei tranzacii ROLLBACK abandoneaz tranzacia n curs CREAREA TABELELOR O tabel poate avea pn la maxim 254 de coloane (cmpuri, atribute). Comanda care permite crearea unei tabele este: CREATE TABLE <nume_tabela> ( <camp1> <tip1> (<lung1> [,<zec1>]) [DEFAULT <val1>] [<regula1_camp1> []], ) CONSTRNGERI (REGULI) Regulile, pentru fi recunoscute (n special pentru fi activate, dezactivate) sunt prefixate astfel: pk_ PRIMARY KEY un_ UNIQUE
1

www.cartiaz.ro Carti si articole online gratuite de la A la Z nn_ ck_ fk_ NOT NULL CHECK FOREIGN KEY

1. REGULI DE VALIDARE La nivel de cmp constrngeri aplicate unei singure coloane [CONSTRAINT <nume>] NOT NULL UNIQUE|PRIMARY KEY|REFERENCES <tabela parinte> (<campi>) CHECK <conditie> La nivel de tabel constrngeri la nivel de mai multe coloane (cmpuri) [CONSTRAINT <nume>] UNIQUE|PRIMARY KEY|(<campi>) [, <campj>]) FOREIGN KEY (<campi [,]>) REFERENCES <tabela parinte> (<campk>) 2. INTEGRITATE REFERENIAL Se refer la operaiile principale efectuate asupra unei tabele din cele 2 aflate n legtur: Adugarea unei nregistrri n tabelul copil; tergerea unei nregistrri din tabela printe; Modificarea unor date din tabela printe. TIPURI DE DATE N ORACLE CHAR(n) iruri de caractere de lungime fix n, maxim 2000 octei. Ca s ajung la dimensiunea specificat, ntotdeauna este completat n partea din dreapta cu spaii, deci poate consuma din memorie; Exemplu: CHAR(15) iruri de caractere de lungime variabil pn la 4000 octei, nu se completeaz cu spaii nimic, se stocheaz doar ct a fost completat din ir; Exemplu: VARCHAR2(10)

VARCHAR2(n)

LONG NUMBER(n) NUMBER (n,m)

iruri de caractere de lungime variabil de pn la 2 GB; numere ntregi cu pn la 38 de cifre numere reale n virgul fix; pot conine date de tip ntreg sau real, n = numrul total de cifre, m= numrul de cifre la dreapta punctului zecimal. Valorile maxime pentru n =38, m de la 84 pn la +127. Exemple: NUMBER(8), NUMBER(5,2) Observaie: NUMBER(5,2) nu poate conine ceva mai mare dect 999.99 fr a aprea o eroare. Tipurile de date derivate din NUMBER sunt INT[EGER], DEC[IMAL], SMALLINT i REAL. NUMBER numere reale n virgul mobil; DATE date calendaristice. Formatul predefinit este: DD-MMM-YY. Exemple: 13-OCT-94, 07-JAN-98
2

www.cartiaz.ro Carti si articole online gratuite de la A la Z RAW(n) LOB(large object) stocheaz date binare de lungime variabil de maxim 2000 octei utilizate pentru obiecte create cu alte aplicaii obiecte de dimensiuni mari tehnologia OLE.

Observaii: Se prefer tipul NUMBER, dei pentru unele cmpuri, de exemplu un cod client, este preferabil utilizarea tipului INTEGER. n Oracle nu exist tipul de cmpuri Logical (doar n PL/SQL se poate declara o variabil ca fiind de tip Boolean). Aceasta poate fi simulat totui, utilizndu-se fie CHAR(1) utilizndu-se caracterele T, F fie NUMBER(1) utilizndu-se valorile 1, 0. Atta timp ct nu exist reguli care s restricioneze valorile posibile ale unui atribut, acesta poate avea valoarea special de NULL. Aceast valoare este diferit de numrul 0 i de irul nul . UNIQUE, n ORACLE specific faptul c nu pot exista dou valori ale aceluiai cmp. Dac nu este specificat condiia NOT NULL pentru o coloan, valoarea NULL a atributului este permis iar constrngerea UNIQUE nu este violat. Atenie, fa de constrngerea UNIQUE, un cmp pe care este creat PRIMARY KEY (o cheie primar) nu permite valoarea de NULL. Pentru a crea o tabel trebuie vute n vedere urmtoarele: Care sunt atributele fiecrei nregistrri? De ce tip de date vom alege cmpurile? Care cmp va fi ales pentru crea o cheie primar? Care coloane permit (sau nu) valori NULL? Care coloane permit (sau nu) duplicri ale valorilor? Exist valori predefinite pentru anumite coloane care permit valori NULL? Ce restricii vor fi setate pentru fiecare cmp n parte? Exemplu:
DROP TABLE facturi; DROP TABLE clienti; CREATE TABLE clienti ( Codcl NUMBER (4) CONSTRAINT pk_clienti_codcl PRIMARY KEY CONSTRAINT ck_clienti_codcl CHECK (codcl>1000), dencl VARCHAR2 (20) CONSTRAINT ck_clienti_dencl CHECK (SUBSTR(dencl,1,1)=UPPER(SUBSTR(dencl,1,1))), localitatea VARCHAR2(30) CONSTRAINT nn_clienti_localit NOT NULL); CREATE TABLE facturi ( nrfact NUMBER (8) CONSTRAINT pk_facturi_nrfact PRIMARY KEY CONSTRAINT ck_facturi_nrfact CHECK (nrfact>=10000000 AND nrfact<=99999999), datfact DATE DEFAULT sysdate, codcl NUMBER (4) CONSTRAINT ck_facturi_codcl CHECK (codcl>1000) CONSTRAINT fk_facturi_clienti REFERENCES clienti (codcl), observatii VARCHAR2(50));

Observaii: 1. Declararea unei chei strine se realizeaz prin clauza REFERENCES (se creeaz relaia ntre cele dou tabele). 2. Se pot folosi operatorii logici de AND, OR. 3. Se pot folosi funciile UPPER, INITCAP, LTRIM, STR, SUBSTR. LOWER(ir)- transform caracterele irului n litere mici;
3

www.cartiaz.ro Carti si articole online gratuite de la A la Z Exemple:


LOWER(Curs SQL) -> curs sql UPPER(Curs SQL) -> CURS SQL INITCASE(SQL) -> Sql CONCAT('Buna', 'Dimineata') -> BunaDimineata SUBSTR('Caractere',1,3) -> Car LENGTH('Sir') -> 3 INSTR('Complex', 'p') -> 4 LPAD(sal,10,'*') -> ******5000 ROUND(45.926, 2) -> 45.93 TRUNC(45.926, 2) -> 45.92 MOD(1600, 300) -> 100

UPPER(ir) - transform caracterele irului n majuscule; INITCAP(ir) transform primul caracter al fiecrui cuvnt din ir n majuscul ; CONCAT(ir1,ir2) concateneaz cele dou iruri; e echivalent cu operatorul de concatenare(||); SUBSTR(ir,m[,n]) extrage din irul de caractere un subir de lungime m ncepnd de la poziia n; LENGTH(ir) returneaz lungimea unui ir de caractere; INSTR(ir1,ir2[,n[,m]]) returneaz poziia celei de-a m-a apariii a lui ir2 n ir1 ncepnd cu poziia n (implicit m=n=1), iar dac nu se gsete ntoarce valoarea 0; REPLACE(ir,a[,b]) nlocuiete n irul de caractere secvena a prin secvena b, iar dac lipsete b, atunci are loc tergerea lui a; LTRIM(ir) / RTRIM(ir) terge spaiile libere din stnga irului de caractere, respectiv din dreapta lui; LPAD(ir1,n,ir2) / RPAD(ir1,n,ir2) ir1 este completat la stnga, respectiv la dreapta, pn la lungimea n, prin ir2; SOUNDEX(ir) reprezentarea fonetic a irului de caractere. ABS(n) valoarea absolut a numrului; CEIL(n) cel mai mic ntreg mai mare sau egal cu n; FLOOR(n) cel mai mare ntreg mai mic sau egal cu n; MOD(m,n) restul mpririi lui m prin n; SQRT(m) rdcin ptrat din m (null, dac m<0); ROUND(n[,m]) numrul n este rotunjit la m poziii zecimale; TRUNC(n[,m]) numrul n este trunchiat la m poziii zecimale; LN(x) implementeaz funcia logaritmic ln(x)(logaritm natural); EXP(x) implementeaz funcia exponenial; POWER(m,n) - implementeaz funcia putere (m la puterea n); SIGN(n) - implementeaz funcia semn asociat lui n; GREATEST(m,n) cel mai mare dintre numerele m i n; LEAST(m,n) cel mai mic dintre numerele m i n;

4. Se poate folosi operatorul IN n cazul unei condiii CHECK, (incluziune ntr-o mulime): Exemplu:
sex CHAR(1) DEFAULT B CONSTRAINT ck_sex CHECK (sex IN (F,B))

Sau:
4

www.cartiaz.ro Carti si articole online gratuite de la A la Z


regiune VARCHAR2(15) DEFAULT 'Banat' CONSTRAINT ck_regiune CHECK (regiune IN ('Banat', 'Transilvania', 'Dobrogea', 'Oltenia', 'Muntenia', 'Moldova'))

5. Pentru date calendaristice, pentru a transforma un ir de caractere ntr-o dat calendaristic vom utiliza funcia TO_DATE. Exemplu:
Datadoc>=TO_DATE(01/01/2006, Dd/Mmm/yyyy)

6. Pentru diferite modaliti de scriere a unui cmp folosind sau nu majuscule se folosete regula de validare CHECK: Majuscule, pentru cmpul Nume:
nume VARCHAR2(20) CONSTRAINT ck_nume CHECK (nume=RTRIM(UPPER(nume)))

Prima liter majuscul, restul litere mici, pentru cmpul Prenume:

prenume VARCHAR2(20) CONSTRAINT ck_prenume CHECK (prenume=LTRIM(INITCAP(prenume)))

Pentru a rezolva problema unicitii valorilor cmpului pe care s-a declarat un index de tip Primary Key se pot folosi secvenele. O secven este un obiect ORACLE care genereaz numere ntregi dup un model specificat. Secvenele de numere sunt utilizate se obicei pentru cmpurile pe care sunt setai indeci de tip primar key sau unique. Comportarea implicit a unei secvene este incrementarea valorii curente cu 1, pentru a trece la valoarea urmtoare. Vom crea n continuare o secven care va fi utilizat mai trziu pentru a aduga nregistrri n tabela Carti.
CREATE TABLE carti (idC INTEGER CONSTRAINT pk_carti_idc PRIMARY KEY,......); CREATE SEQUENCE carti_seq; SELECT carti_seq.CURRVAL FROM DUAL; SELECT carti_seq.NEXTVAL FROM DUAL; INSERT INTO carti VALUES (carti_seq.NEXTVAL, 'Oliver Twist', 'Charles Dickens', '12-SEP-1839');

Un alt exemplu:
CREATE SEQUENCE seq_marca INCREMENT BY 1 MINVALUE 1010 MAXVALUE 5555 NOCYCLE NOCACHE ORDER; CREATE TABLE PERSONAL ( MARCA INTEGER CONSTRAINT PK_PERSONAL_MARCA PRIMARY KEY CONSTRAINT NN_PERSONAL_MARCA NOT NULL, NUMEPREN VARCHAR2(40) CONSTRAINT UN_PERSONAL_NUMEPREN UNIQUE CONSTRAINT NN_PERSONAL_NUMEPREN NOT NULL, COMPART VARCHAR2(5) DEFAULT 'PROD' CONSTRAINT NN_PERSONAL_COMPART NOT NULL, DATASV DATE DEFAULT SYSDATE, SALARORAR NUMBER(16,2) DEFAULT 4.5, SALARORARCO NUMBER(16,2) DEFAULT 4, COLABORATOR CHAR(1) DEFAULT 'N' CONSTRAINT NN_PERSONAL_COLABORATOR NOT NULL ); INSERT INTO personal (marca, numepren,compart, datasv,salarorar,salarorarco) VALUES (seq_marca.NextVal,'Marin', 'Prod', date'2007-01-12', 3.4,2.5); INSERT INTO personal (marca, numepren, compart, datasv, salarorar, salarorarco) VALUES (seq_marca.NextVal,'Pop', 'Ion', date'2007-11-12', 6.7,2.1); INSERT INTO personal (marca, numepren, compart, datasv, salarorar, salarorarco) VALUES (seq_marca.NextVal,'Popescu', 'Diana', date'2008-03-18', 6.9,1.7);

www.cartiaz.ro Carti si articole online gratuite de la A la Z Pentru a vizualiza toate secvenele: Pentru a terge o secven: drop sequence seq_marca;
SELECT * FROM user_sequences;

NOIUNI GENERALE
Oracle nu este un program, ci o suit de programe i conine un DBMS (DataBase Management System), serverul Oracle. Din cadrul mulimii aplicaiilor Oracle vom utiliza pentru nceput SQL*Plus, un instrument care permite o utilizare direct i interactiv a limbajului SQL pentru a accesa serverul Oracle. Observaie: Oracle NU este Case Sensitive nu face diferen ntre litere mici i majuscule.

Instruciuni ORACLE
Principalele instruciuni (comenzi ORACLE) pot fi grupate astfel: Instruciuni pentru manipularea datelor SELECT selecia datelor din tabele INSERT adugarea unei nregistrri ntr-o tabel DELETE tergerea nregistrrilor dintr-o tabel UPDATE modificarea valorilor unor cmpuri dintr-o tabel Instruciuni pentru definirea bazei de date CREATE TABLE crearea structurii unei tabele i adugarea acesteia n baza de date DROP TABLE tergerea fizic a unei tabele dintr-o baz de date ALTER TABLE modificarea structurii unei tabele CREATE VIEW crearea unei tabele virtuale DROP VIEW tergerea unei tabele virtuale Instruciuni pentru accesul la baza de date GRANT acordarea unor drepturi pentru utilizatori REVOKE revocarea unor drepturi acordate unor utilizatori Instruciuni specifice tranzaciilor COMMIT marcheaz sfritul unei tranzacii ROLLBACK abandoneaz tranzacia n curs CREAREA TABELELOR O tabel poate avea pn la maxim 254 de coloane (cmpuri, atribute). Comanda care permite crearea unei tabele este: CREATE TABLE <nume_tabela> ( <camp1> <tip1> (<lung1> [,<zec1>]) [DEFAULT <val1>] [<regula1_camp1> []], ) CONSTRNGERI (REGULI) Regulile, pentru fi recunoscute (n special pentru fi activate, dezactivate) sunt prefixate astfel: pk_ PRIMARY KEY un_ UNIQUE nn_ NOT NULL ck_ CHECK
7

fk_

FOREIGN KEY

1. REGULI DE VALIDARE La nivel de cmp constrngeri aplicate unei singure coloane [CONSTRAINT <nume>] NOT NULL UNIQUE|PRIMARY KEY|REFERENCES <tabela parinte> (<campi>) CHECK <conditie> La nivel de tabel constrngeri la nivel de mai multe coloane (cmpuri) [CONSTRAINT <nume>] UNIQUE|PRIMARY KEY|(<campi>) [, <campj>]) FOREIGN KEY (<campi [,]>) REFERENCES <tabela parinte> (<campk>) 2. INTEGRITATE REFERENIAL Se refer la operaiile principale efectuate asupra unei tabele din cele 2 aflate n legtur: Adugarea unei nregistrri n tabelul copil; tergerea unei nregistrri din tabela printe; Modificarea unor date din tabela printe. TIPURI DE DATE N ORACLE CHAR(n) iruri de caractere de lungime fix n, maxim 2000 octei. Ca s ajung la dimensiunea specificat, ntotdeauna este completat n partea din dreapta cu spaii, deci poate consuma din memorie; Exemplu: CHAR(15) iruri de caractere de lungime variabil pn la 4000 octei, nu se completeaz cu spaii nimic, se stocheaz doar ct a fost completat din ir; Exemplu: VARCHAR2(10)

VARCHAR2(n)

LONG NUMBER(n) NUMBER (n,m)

iruri de caractere de lungime variabil de pn la 2 GB; numere ntregi cu pn la 38 de cifre numere reale n virgul fix; pot conine date de tip ntreg sau real, n = numrul total de cifre, m= numrul de cifre la dreapta punctului zecimal. Valorile maxime pentru n =38, m de la 84 pn la +127. Exemple: NUMBER(8), NUMBER(5,2) Observaie: NUMBER(5,2) nu poate conine ceva mai mare dect 999.99 fr a aprea o eroare. Tipurile de date derivate din NUMBER sunt INT[EGER], DEC[IMAL], SMALLINT i REAL. NUMBER numere reale n virgul mobil; DATE date calendaristice. Formatul predefinit este: DD-MMM-YY. Exemple: 13-OCT-94, 07-JAN-98 RAW(n) stocheaz date binare de lungime variabil de maxim 2000 octei utilizate pentru obiecte create cu alte aplicaii LOB(large object) obiecte de dimensiuni mari tehnologia OLE.
8

Observaii: Se prefer tipul NUMBER, dei pentru unele cmpuri, de exemplu un cod client, este preferabil utilizarea tipului INTEGER. n Oracle nu exist tipul de cmpuri Logical (doar n PL/SQL se poate declara o variabil ca fiind de tip Boolean). Aceasta poate fi simulat totui, utilizndu-se fie CHAR(1) utilizndu-se caracterele T, F fie NUMBER(1) utilizndu-se valorile 1, 0. Atta timp ct nu exist reguli care s restricioneze valorile posibile ale unui atribut, acesta poate avea valoarea special de NULL. Aceast valoare este diferit de numrul 0 i de irul nul . UNIQUE, n ORACLE specific faptul c nu pot exista dou valori ale aceluiai cmp. Dac nu este specificat condiia NOT NULL pentru o coloan, valoarea NULL a atributului este permis iar constrngerea UNIQUE nu este violat. Atenie, fa de constrngerea UNIQUE, un cmp pe care este creat PRIMARY KEY (o cheie primar) nu permite valoarea de NULL. Pentru a crea o tabel trebuie vute n vedere urmtoarele: Care sunt atributele fiecrei nregistrri? De ce tip de date vom alege cmpurile? Care cmp va fi ales pentru crea o cheie primar? Care coloane permit (sau nu) valori NULL? Care coloane permit (sau nu) duplicri ale valorilor? Exist valori predefinite pentru anumite coloane care permit valori NULL? Ce restricii vor fi setate pentru fiecare cmp n parte? Exemplu:
DROP TABLE facturi; DROP TABLE clienti; CREATE TABLE clienti ( Codcl NUMBER (4) CONSTRAINT pk_clienti_codcl PRIMARY KEY CONSTRAINT ck_clienti_codcl CHECK (codcl>1000), dencl VARCHAR2 (20) CONSTRAINT ck_clienti_dencl CHECK (SUBSTR(dencl,1,1)=UPPER(SUBSTR(dencl,1,1))), localitatea VARCHAR2(30) CONSTRAINT nn_clienti_localit NOT NULL); CREATE TABLE facturi ( nrfact NUMBER (8) CONSTRAINT pk_facturi_nrfact PRIMARY KEY CONSTRAINT ck_facturi_nrfact CHECK (nrfact>=10000000 AND nrfact<=99999999), datfact DATE DEFAULT sysdate, codcl NUMBER (4) CONSTRAINT ck_facturi_codcl CHECK (codcl>1000) CONSTRAINT fk_facturi_clienti REFERENCES clienti (codcl), observatii VARCHAR2(50));

Observaii: 1. Declararea unei chei strine se realizeaz prin clauza REFERENCES (se creeaz relaia ntre cele dou tabele). 2. Se pot folosi operatorii logici de AND, OR. 3. Se pot folosi funciile UPPER, INITCAP, LTRIM, STR, SUBSTR. LOWER(ir)- transform caracterele irului n litere mici; UPPER(ir) - transform caracterele irului n majuscule; INITCAP(ir) transform primul caracter al fiecrui cuvnt din ir n majuscul ; CONCAT(ir1,ir2) concateneaz cele dou iruri; e echivalent cu operatorul de concatenare(||); SUBSTR(ir,m[,n]) extrage din irul de caractere un subir de lungime m ncepnd de la poziia n;
9

Exemple:

LENGTH(ir) returneaz lungimea unui ir de caractere; INSTR(ir1,ir2[,n[,m]]) returneaz poziia celei de-a m-a apariii a lui ir2 n ir1 ncepnd cu poziia n (implicit m=n=1), iar dac nu se gsete ntoarce valoarea 0; REPLACE(ir,a[,b]) nlocuiete n irul de caractere secvena a prin secvena b, iar dac lipsete b, atunci are loc tergerea lui a; LTRIM(ir) / RTRIM(ir) terge spaiile libere din stnga irului de caractere, respectiv din dreapta lui; LPAD(ir1,n,ir2) / RPAD(ir1,n,ir2) ir1 este completat la stnga, respectiv la dreapta, pn la lungimea n, prin ir2; SOUNDEX(ir) reprezentarea fonetic a irului de caractere. ABS(n) valoarea absolut a numrului; CEIL(n) cel mai mic ntreg mai mare sau egal cu n; FLOOR(n) cel mai mare ntreg mai mic sau egal cu n; MOD(m,n) restul mpririi lui m prin n; SQRT(m) rdcin ptrat din m (null, dac m<0); ROUND(n[,m]) numrul n este rotunjit la m poziii zecimale; TRUNC(n[,m]) numrul n este trunchiat la m poziii zecimale; LN(x) implementeaz funcia logaritmic ln(x)(logaritm natural); EXP(x) implementeaz funcia exponenial; POWER(m,n) - implementeaz funcia putere (m la puterea n); SIGN(n) - implementeaz funcia semn asociat lui n; GREATEST(m,n) cel mai mare dintre numerele m i n; LEAST(m,n) cel mai mic dintre numerele m i n;
LOWER(Curs SQL) -> curs sql UPPER(Curs SQL) -> CURS SQL INITCASE(SQL) -> Sql CONCAT('Buna', 'Dimineata') -> BunaDimineata SUBSTR('Caractere',1,3) -> Car LENGTH('Sir') -> 3 INSTR('Complex', 'p') -> 4 LPAD(sal,10,'*') -> ******5000 ROUND(45.926, 2) -> 45.93 TRUNC(45.926, 2) -> 45.92 MOD(1600, 300) -> 100

4. Se poate folosi operatorul IN n cazul unei condiii CHECK, (incluziune ntr-o mulime): Exemplu:
sex CHAR(1) DEFAULT B CONSTRAINT ck_sex CHECK (sex IN (F,B))

Sau:

regiune VARCHAR2(15) DEFAULT 'Banat' CONSTRAINT ck_regiune CHECK (regiune IN ('Banat', 'Transilvania', 'Dobrogea', 'Oltenia', 'Muntenia', 'Moldova'))

5. Pentru date calendaristice, pentru a transforma un ir de caractere ntr-o dat calendaristic vom utiliza funcia TO_DATE. Exemplu:
Datadoc>=TO_DATE(01/01/2006, Dd/Mmm/yyyy)

6. Pentru diferite modaliti de scriere a unui cmp folosind sau nu majuscule se folosete regula de validare CHECK:
10

Majuscule, pentru cmpul Nume: Prima liter majuscul, restul litere mici, pentru cmpul Prenume:

nume VARCHAR2(20) CONSTRAINT ck_nume CHECK (nume=RTRIM(UPPER(nume))) prenume VARCHAR2(20) CONSTRAINT ck_prenume CHECK (prenume=LTRIM(INITCAP(prenume)))

Pentru a rezolva problema unicitii valorilor cmpului pe care s-a declarat un index de tip Primary Key se pot folosi secvenele. O secven este un obiect ORACLE care genereaz numere ntregi dup un model specificat. Secvenele de numere sunt utilizate se obicei pentru cmpurile pe care sunt setai indeci de tip primar key sau unique. Comportarea implicit a unei secvene este incrementarea valorii curente cu 1, pentru a trece la valoarea urmtoare. Vom crea n continuare o secven care va fi utilizat mai trziu pentru a aduga nregistrri n tabela Carti.
CREATE TABLE carti (idC INTEGER CONSTRAINT pk_carti_idc PRIMARY KEY,......); CREATE SEQUENCE carti_seq; SELECT carti_seq.CURRVAL FROM DUAL; SELECT carti_seq.NEXTVAL FROM DUAL; INSERT INTO carti VALUES (carti_seq.NEXTVAL, 'Oliver Twist', 'Charles Dickens', '12-SEP-1839');

Un alt exemplu:

CREATE SEQUENCE seq_marca INCREMENT BY 1 MINVALUE 1010 MAXVALUE 5555 NOCYCLE NOCACHE ORDER; CREATE TABLE PERSONAL ( MARCA INTEGER CONSTRAINT PK_PERSONAL_MARCA PRIMARY KEY CONSTRAINT NN_PERSONAL_MARCA NOT NULL, NUMEPREN VARCHAR2(40) CONSTRAINT UN_PERSONAL_NUMEPREN UNIQUE CONSTRAINT NN_PERSONAL_NUMEPREN NOT NULL, COMPART VARCHAR2(5) DEFAULT 'PROD' CONSTRAINT NN_PERSONAL_COMPART NOT NULL, DATASV DATE DEFAULT SYSDATE, SALARORAR NUMBER(16,2) DEFAULT 4.5, SALARORARCO NUMBER(16,2) DEFAULT 4, COLABORATOR CHAR(1) DEFAULT 'N' CONSTRAINT NN_PERSONAL_COLABORATOR NOT NULL ); INSERT INTO personal (marca, numepren,compart, datasv,salarorar,salarorarco) VALUES (seq_marca.NextVal,'Marin', 'Prod', date'2007-01-12', 3.4,2.5); INSERT INTO personal (marca, numepren, compart, datasv, salarorar, salarorarco) VALUES (seq_marca.NextVal,'Pop', 'Ion', date'2007-11-12', 6.7,2.1); INSERT INTO personal (marca, numepren, compart, datasv, salarorar, salarorarco) VALUES (seq_marca.NextVal,'Popescu', 'Diana', date'2008-03-18', 6.9,1.7);

Pentru a vizualiza toate secvenele:


SELECT * FROM user_sequences;

Pentru a terge o secven:

DROP SEQUENCE seq_marca;

TEM: S se scrie secvena de program pentru crearea bazei de date Bibliotec din laboratorul anterior.
11

Introducere n OLAP: Analize unidimensionale - ROLLUP


n cele ce urmeaz vom prezenta cteva din cele mai importante funcii analitice, care extind nucleul SQL ctre probleme legate destul de strns de ceea ce ndeobte este cunoscut sub titulatura depozite de date (Data Warehouses). Agregarea simultan a datelor dup mai muli parametrii (dimensiuni) nsoit de determinarea subtotalurilor aferente face obiectul aa-numitei analize multidimensionale. Aceasta se bazeaz pe utilizarea funciilor analitice dedicate procesrii analitice on-line (On Line Analytical Processing OLAP) i care au fost introduse n Oracle ncepnd cu versiunea 8i a acestuia. Pentru ilustrarea acestor funcii utilizm tabela VINZRI_CRI care, pentru o editur, conine informaii despre facturile emise - crile vndute librriilor i/sau distribuitorilor de carte i pres. Pentru simplificarea discuiei, tabela este denormalizat, iar singurul element care ne intereseaz despre fiecare carte este ISBN-ul. CREATE TABLE vinzari_carti ( NrFact DECIMAL(6) NOT NULL, DataFact DATE NOT NULL, Client VARCHAR(15), Loc VARCHAR(15), Jud CHAR(2), ISBN CHAR(14), Cantit DECIMAL (6), PretUn DECIMAL (8), ValTotala DECIMAL (14) ); Introducerea datelor n tabel: INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Pop Ion', 'Timisoara', 'TM', '973-585-547-x', 3, 45); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Pop Ion', 'Timisoara', 'TM', '973-585-456-x', 5, 55); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Pop Ion', 'Timisoara', 'TM', '973-5853-45-x', 1, 78); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Popescu Maria', 'Lugoj', 'TM', '973-585-234-x', 3, 33); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Popescu Maria', 'Lugoj', 'TM', '973-354-547-x', 3, 45); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Popescu Maria', 'Lugoj', 'TM', '973-585-456-x', 5, 55); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values

(123456,date'2008-03-03', 'Ana Mara', 'Jimbolia', 'TM', '973-585-547-x', 13, 45); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Tara Edgar', 'Jimbolia', 'TM', '973-487-547-x', 11, 15); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Meca Vasile', 'Jimbolia', 'TM', '973-585-547-x', 200, 45); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Bec Lavinia', 'Deva', 'HD', '927-345-547-x', 100, 45); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Werk Dacian', 'Deva', 'HD', '987-545-532-x', 400, 45); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Miodrag Ana', 'Hunedoara', 'HD', '978-534-523-x', 500, 45); INSERT INTO vinzari_carti (nrfact, datafact, client, loc, jud, isbn, cantit, pretun) values (123456,date'2008-03-03', 'Varga Teo', 'Hunedoara', 'HD', '922-123-549-x', 250, 45); Update vinzari_carti set valtotala=cantit*pretun;

ROLLUP
Prima funcie luat n discuie este ROLLUP. Se folosete pentru analiza datelor pe o singur dimensiune, dar la mai multe nivele de detaliere, atunci cnd n rapoarte sunt necesare subtotaluri incluse n alte subtotaluri, precum i un total general. ROLLUP este echivalentul opiunii SUBTOTALS din Excel i permite afiarea subtotalurilor, a unor funcii aplicate pe grupe de valori. Problema creia vrem s-i dm rspuns se formuleaz astfel: Care este totalul vnzrilor de carte, pe clieni, localiti i judee, precum i totalul general? Astfel de analize sunt ct se poate de frecvente i necesare pentru toate tipurile de firme. n lipsa unui operator de genul ROLLUP, soluia necesit reuniunea (UNION). Subtotaluri obinute prin reuniune: Grupare dup jude, localitate i client, calcul valoare total pe client: SELECT jud, loc, client, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc, client ; Grupare dup jude, localitate, calcul valoare total pe localitate: SELECT jud, loc, 'Total localitate', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc ;

Grupare dup jude, calcul valoare total pe jude: SELECT jud, 'Total judet', ' ', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud ; Total general: SELECT ' ', 'TOTAL GENERAL ', ' ', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti ; Realizarea subtotalurilor cu ajutorul operatorului UNION: SELECT jud, loc, client, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc, client UNION SELECT jud, loc, ' Subtotal LOCALITATE ' ||loc, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc UNION SELECT jud, ' Subtotal JUDET '||jud, ' ', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud UNION SELECT ' ', 'TOTAL GENERAL ', ' ', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti ; Cu operatorul ROLLUP asemenea operaiuni devin mult mai simple: Afiarea totalurilor la nivel de localitate i jude: SELECT jud, loc, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY ROLLUP(jud, loc) ; Afiarea totalurilor la nvel de localitate, jude i client: SELECT jud, loc, client, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY ROLLUP(jud, loc, client) ; Se calculeaz valoarea funciei SUM pentru atributul cel mai din dreapta al ROLLUP-ului Client (acesta se consider a fi primul subtotal), apoi cte un subtotal pentru Loc, pentru Jud i, n final, totalul general. n total sunt 3 + 1 = 4 nivele de (sub)totalizare, 3 pentru cele trei atribute plus totalul general. n cazul operatorului ROLLUP, un singur argument va determina calculul i afiarea unui total general. Dac se utilizeaz dou argumente, primul calculeaz totalul general iar al doilea calculeaz i afieaz un subtotal pentru fiecare valoare distinct a cmpului an. n cazul utilizrii a trei argumente, primul determina calcularea unui total general (Grand Total), al doilea calculeaz media pentru fiecare valoare distinct a cmpului an, iar al treilea efectueaz un subtotal pentru fiecare combinaie (an, grup).

Combinarea funciilor ROLLUP i GROUPING


Pentru un plus de claritate, formulm o interogare care s combine Rollup cu Grouping. Funcia GROUPING are ca argument coloana de grupare, rezultatul ntors fiind 1 dac coloana respectiv este inclus ntr-un grup de agregare superior, sau 0 pentru liniile normale (n afara subtotalurilor). Valoarea 1 ntoars de funcia GROUPING pentru un atribut indic un subtotal pentru acel atribut, relativ la atributele din stnga, n ordinea declarat n clauza ROLLUP. SELECT jud, Loc, Client, SUM(ValTotala) AS Val_Vinzari, GROUPING (Jud) AS Grup_Jud, GROUPING (Loc) AS Grup_Loc, GROUPING (Client) AS Grup_Client FROM vinzari_carti GROUP BY ROLLUP(jud, loc, client) ORDER BY jud, loc, client ;

ROLLUP-uri pariale
Este necesar uneori ca subtotalizarea atributelor de grupare s fie parial: fie nu intereseaz totalul general, fie subtotalizarea este necesar numai pentru anumite atribute sau grupuri de atribute. Din datele existente n tabela VINZARI_CARTI se dorete gruparea pe judee, localiti, clieni, dar i pe cri (ISBN-uri). Subtotalul, ns, trebuie calculat numai la nivel client i localitate. SELECT NVL(jud,' ') AS Judet, CASE WHEN GROUPING(jud)=1 THEN 'total general ' ELSE CASE WHEN GROUPING(loc)=1 THEN 'Subtotal-judet'||jud ELSE loc END END AS localitate, CASE WHEN GROUPING(loc)=1 THEN ' ' ELSE CASE WHEN GROUPING(client) =1 THEN ' Subtotal loc. '||loc ELSE client END END AS Client, CASE WHEN GROUPING(client)=1 THEN ' ' ELSE CASE WHEN GROUPING (ISBN)=1 THEN ' Subtotal -clientul '||client ELSE isbn END END AS ISBN, SUM(ValTotala) AS Vinzari FROM VINZARI_CARTI GROUP BY jud,loc, ROLLUP(client,isbn) ;

Exerciii:
1. 2. 3. 4. 5. 6. S se creeze n ORACLE tabela studeni i s se insereze nregistrrile din figur. S se execute gruparea i calculul mediei la nivel de an. S se execute gruparea i calculul mediei la nivel de grup. S se afieze o medie general a tuturor studenilor. S se execute gruparea i calculul mediei la nivel de grup i an. S se creeze subtotaluri folosind operatorul UNION, calculndu-se media la nivel de an i media general. 7. S se creeze subtotaluri folosind operatorul UNION, adugndu-se interogrii anterioare gruparea i calcularea mediei la nivel de grupa. 8. S se scrie interogarea SQL folosind operatorul ROLLUP, criteriul de grupare fiind doar anul. 9. S se scrie interogarea SQL folosind operatorul ROLLUP, criteriile de grupare fiind anul i grupa. 10. S se scrie interogarea SQL folosind operatorul ROLLUP, criteriile fiind anul, secia i grupa.

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