Sunteți pe pagina 1din 4

Funcții generale

Funcțiile generale sunt: NVL, NVL2, NULLIF și COALESCE. Ele lucrează cu


orice tip de date.

NVL (expr1, expr2) afișează expr1 dacă este nenulă. Dacă expr1 este nulă
atunci se afilșează expr2.

Exemplu: SELECT numele,NVL(taxe,0) FROM angajati;


va afișa numele și valorile de pe coloana taxe pentru toți angajații; dacă există angajați
care nu au completată valoarea pentru taxe (este NULL) atunci aceștia vor avea afișată
valoarea 0.

NVL2 (expr1, expr2, expr3) dacă expr1 nu este nulă, NVL2 returneaza expr2.
Dacă expr1 este nulă, NVL2 returneza expr3. Argumentul expr1 poate fi orice tip de
date.
Exemplu: SELECT numele,NVL2(taxe,1,-1) FROM angajati;
Afișează pe a doua coloană 1 dacă angajatul trebuie să plătească taxe (are o valoarea
numerică completată) și -1 dacă coloana taxe este necompletată (NULL).

NULLIF (expr1, expr2) compară două expresii și returnează valoarea nulă dacă
sunt egale sau prima expresie dacă nu sunt egale.
Exemplu: SELECT NULLIF(numele,prenumele) FROM angajati;
returnează NULL dacă numele coincide cu prenumele, altfel afișează numele.

COALESCE (expr1, expr2, ..., expr n) returneaza prima expresie non-nulă din
lista de expresii
Exemplu: SELECT numele,COALESCE(taxe,bonus,salariu) FROM angajati;
afișează numele urmat de prima valoare nenulă din câmpurile taxe, bonus, salariu.

Constrângeri prin referințe


Fie tabelele:
diriginti
nume câmp Tip de date Tip de cheie
codd NUMBER(3) PK
nume VARCHAR2(30)
și elevi
nume câmp Tip de date Tip de cheie
ide NUMBER(3) PK
nume VARCHAR2(30)
idd NUMBER(3) FKdiriginti(codd)
Dorim să introducem date în tabelul elevi astfel încât fiecare elev să aibă asociat un
diriginte. Pentru ca fiecare elev să aibă un diriginte, vom crea și completa mai întâi tabelul
diriginți:
CREATE TABLE diriginti
(codd NUMBER(3) PRIMARY KEY,
nume VARCHAR2(30));

INSERT INTO diriginti VALUES (101,'Aconstantinesei Teofil');


INSERT INTO diriginti VALUES (102,'Berhuzescu Ioana');
INSERT INTO diriginti VALUES (103,'Cernomazu Mirel');

apoi vom crea și completa tabelul elevi:


CREATE TABLE elevi
(ide NUMBER(3) PRIMARY KEY,
nume VARCHAR2(30),
idd NUMBER(3) REFERENCES diriginti(codd)
);
INSERT INTO elevi VALUES (1,'Popescu Georgel',101);
INSERT INTO elevi VALUES (2,'Popescu Adelina',103);
INSERT INTO elevi VALUES (3,'Scărlătescu Valdimir',102);
INSERT INTO elevi VALUES (4,'Filipescu Filip',101);
INSERT INTO elevi VALUES (5,'Rotărescu Emilia',102);

Observație: Nu putem introduce un elev căruia să îi asociem un diriginte care nu există. De


ex., comanda INSERT INTO elevi VALUES (6,'Țurcanu Eduard',109); va da eroare deoarece
nu există un diriginte cu codd=109.

Constrângeri de domeniu

Vom adăuga câmpul localitatea în tabelul elevi și vom impune ca utilizatorul să


poată introduce pe această coloană doar una din valorile: Dorohoi, Hilișeu, Suharău,
Havârna sau alta.

ALTER TABLE elevi ADD localitatea VARCHAR2(20) CONSTRAINT loc_ck CHECK


(localitatea IN ('Dorohoi','Hilișeu','Suharău','Havârna','alta'));

De ex., comanda INSERT INTO elevi VALUES (7,'X Y',101,'Flămânzi'); nu va fi acceptată


deoarece localitatea nu face parte din domeniul prestabilit.

Adăugarea unei constrângeri

Vom adăuga pentru tabelul diriginti constrângerea codd_ck care impune ca, codul
dirigintelui să fie cuprins între 101 și 500.
Comanda folosită:
ALTER TABLE diriginti ADD CONSTRAINT codd_ck CHECK (codd>=101 AND codd<=500);

Verificarea impunerii constrângerii de mai sus poate fi făcută de exemplu cu ajutorul


comenzii: INSERT INTO diriginti VALUES (550,'Azamfirei Ion');
comandă care, după ce este executată va genera eroarea:

Dezactivarea constrângerii poate fi efectuată folosind DISABLE CONSTRAINT ca în


exemplul următor:

ALTER TABLE diriginti DISABLE CONSTRAINT codd_ck;

Ștergerea constrângerii poate fi efectuată folosind DROP CONSTRAINT ca în exemplul


următor:

ALTER TABLE diriginti DROP CONSTRAINT codd_ck;

Exemple:
-------------------------------------------------------------
CREATE TABLE judete (
codj NUMBER(2) PRIMARY KEY,
nume VARCHAR2(30),
populatie NUMBER(6)
);

INSERT INTO judete VALUES(1,'Arad',74356);


INSERT INTO judete VALUES(2,'Bacãu',777777);
INSERT INTO judete VALUES(3,'Botoºani',789789);
-------------------------------------------------------------
CREATE TABLE tabj (
idt NUMBER(3) UNIQUE,
nume VARCHAR2(40),
idjud NUMBER(2) REFERENCES judete(codj)
);

INSERT INTO tabj VALUES (101,'Serafinceanu',1);


INSERT INTO tabj VALUES (102,'Porfireanu',2);
INSERT INTO tabj VALUES (103,'Rebenciuc',5);
-------------------------------------------------------------
ALTER TABLE tabj
ADD CONSTRAINT lng_nume_ck CHECK (LENGTH(nume)>4);

INSERT INTO tabj VALUES (104,'Ion',3);


-------------------------------------------------------------
--varianta 1:
CREATE TABLE tab1(
id NUMBER(3) PRIMARY KEY,
nume VARCHAR2(30),
varsta NUMBER(2) CHECK (varsta>=12 AND varsta<=20)
);
--varianta 2:
CREATE TABLE tab1(
id NUMBER(3) PRIMARY KEY,
nume VARCHAR2(30),
varsta NUMBER(2),
CONSTRAINT varsta_ck CHECK (varsta>=12 AND varsta<=20)
);

INSERT INTO tab1 VALUES (1,'Ionescu',12);


INSERT INTO tab1 VALUES (2,'Rãdulescu',17);
INSERT INTO tab1 VALUES (3,'Corjãuceanu',27);
-------------------------------------------------------------

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