Вы находитесь на странице: 1из 31

Functii de un singur rnd

Obiective
Dupa parcurgerea acestei lectii, ar trebui sa stiti sa faceti urmatoarele lucruri:
-

Sa descrieti diferite tipuri de functii disponibile n SQL


Sa utilizati caractere, numere si date calendaristice n cadrul instructiunii
SELECT
Sa descrieti utilitatea functiilor de conversie

Scopul Lectiei
Functiile fac blocul de baza al interogarii mai puternic si snt folosite pentru a manipula date.
Aceasta lectie este prima dintr-un set de doua lucrari ce au ca obiectiv descrierea acestor
functii. Ea se ocupa att de functiile de un singur rnd pentru caractere, numere si date
calendaristice ct si de functiile ce fac conversii dintr-un tip de data n altul de exemplu: din
caracter n numar

Functii SQL
intrare

iesire

functia face
o actiune

arg 1

Rezultat

arg 2

.
.
.
arg n

Functii SQL
Functiile reprezinta o componenta importanta a limbajului SQL, si pot fi utilizate pentru a face
urmatoarele:
- Calcule matematice asupra datelor
- Modificarea unor articole individuale
- Manipularea iesirii pentru grupuri de rnduri
- Stabilirea unui format pentru date calendaristice si numere atunci cnd acestea snt tiparite
pe ecran
- Schimbarea tipului de data a unei coloane
Functiile SQL accepta argumente si ntorc valori.
Nota : Majoritatea functiilor descrise n aceasta lectie snt specifice versiunii SQL pentru
Oracle.

Doua tipuri de functii SQL

Functii

Functii de un
singur rnd

Functii de mai
multe rnduri

Functii SQL (continuare)


Exista doua tipuri distincte de functii:
- Functii de un singur rnd
- Functii de mai multe rnduri
Functii de un singur rnd
Aceste functii actioneaza doar asupra unui singur rnd si ntorc un rezultat pentru fiecarea rnd.
Exista mai multe tipuri de functii de un singur rnd. Aceasta lectie se ocupa de urmatoarele
tipuri:
- Caracter
- Numar
- Data calendaristica
2

Conversie

Functii de mai multe rnduri


Aceste functii actioneaza asupra unor grupuri de rnduri si ntorc un rezultat pentru fiecare
grup.
Pentru mai multe detalii consultati lucarea:
Oracle Server SQL Reference. Release 8.0 pentru o lista completa a functiilor disponibile
mpreuna cu sintaxa aferenta

Functii de un singur rnd

Manipuleaza articole
Actioneaza asupra fiecarui rnd rezultat din interogare
ntorc un singur rezultat pentru fiecare rnd
Pot modifica tipuri de date
Pot fi imbricate

nume_functie (coloana | expresie, [arg1, arg2, ] )

Functii de un singur rnd


Functiile de un singur rnd snt utilizate pentru a manipula date. Ele accepta unul sau mai
multe argumente si ntorc o singura valoare pentru fiecare rnd rezultat din interogare. O
functie poate avea ca argument unul din urmatoarele:
- O constanta furnizata de utilizator
- O variabila
- O denumire de coloana
- O expresie
Caracteristici ale functiilor de un singur rnd

Actioneaza asupra fiecarui rnd ntors de interogare


ntorc o valoare pentru fiecare rnd
Pot ntoarce o data a carui tip este diferit de tipul argumentului
Este posibil sa astepte unul sau mai multe argumente
Le puteti utiliza n SELECT, WHERE si ORDER BY. Le puteti imbrica.

n sintaxa:
nume_functie este numele functiei
3

coloana
este un nume de coloana din baza de date
expresie
este orice sir de caractere sau expresie calculabila
arg1, arg2, snt argumentele utilizate de functie

Functii de un singur rnd


Caractere
Generale

Numere
Functii de un
singur rnd
Data
calendaristica

Conversie

Functii de un singur rnd (continuare)


Aceasta lectie prezinta urmatoarele tipuri de functii:
- Functii pentru caractere: accepta argumente de tip caracter si ntorc rezultate de tip caracter
sau numeric
- Functii pentru numere: accepta argumente de tip numeric si ntorc rezultate de tip numeric
- Functii pentru date calendaristice: accepta argumente de tip data calendaristica si intorc
rezultate de tip data calendaristica cu exceptia functiei MONTH_BEETWEEN care
ntoarce o valoare numerica
- Functii pentru conversie: fac conversia dintr-un tip de data n altul
- Functii generale:
Functii NVL
Functii DECODE

Functii pentru caractere


Functii pentru
caractere

Functii de
conversie a
caracterelor din
litere mari in
litere mici.
LOWER
UPPER
INITCAP

Functii de
manipulare a
caracterelor
CONCAT
SUBSTR
LENGTH
INSTR
LPAD
4

Functii pentru caractere


Functiile de un singur rnd pentru caractere accepta argumente de tip caracter si ntorc
rezultate de tip caracter sau numeric. Functiile pentru caractere se pot mparti n :
- Functii de conversie a caracterelor din litere mari in litere mici.
- Functii de manipulare a caracterelor
Functie
LOWER (expresie
coloana)
UPPER (expresie
coloana)
INITCAP (expresie
coloana)
CONCAT(expresie
coloana1,
(expresie
coloana2)
SUBSTR(expresie
coloana,
m/,n/)
LENGTH(expresie
coloana)
INSTR(expresie
coloana,m)
LPAD(expresie|coloana,
n,sir caractere)

Scop
Face conversia caracterelor alfabetice n litere mici
Face conversia caracterelor alfabetice in litere mari
Face conversia pentru primul caracter din fiecare cuvnt n litera
mare iar pentru restul caracterelor conversia se face n litere
mici
Concateneaza prima valoare de tip caracter cu a doua valoare de
tip caracter.
Aceasta functie este echivalenta cu operatorul de concatenare
( || )
ntoarce un sir de caractere din cadrul valorii de tip caracter
ncepnd cu pozitia m si avnd lungimea n. Daca m este negativ
atunci pozitia de nceput a numararii se considera a fi ultimul
caracter din sir. Daca n este omis atunci functia ntoarce toate
caracterele de la pozitia m pna la sfrsitul sirului.
ntoarce numarul de caractere dintr-o valoare de tip caracter
ntoarce pozitia n cadrul valorii de tip caracter a caracterului
specificat.
Aliniaza valoarea de tip caracter la dreapta pe o lungime de n
caractere.

Nota: Aceasta este o lista incompleta a functiilor disponibile.


Pentru mai multe detalii consultati lucarea:
Oracle Server SQL Reference. Release 8.0 Character Function

Functii de conversie a caracterelor din litere mari n


litere mici.
FUNCTIE
LOWER (SQL Course)
UPPER (SQL Course)
INITCAP (SQL Course)

REZULTAT
sql course
SQL COURSE
Sql Course
5

Functii de conversie a caracterelor din litere mari in litere mici.


Cele trei functii de conversie a caracterelor snt: LOWER, UPPER, INITCAP.
LOWER: Face conversia n litere mici pentru un text scris cu litere mari si mici
UPPER : Face conversia n litere mari pentru un text scris cu litere mari si mici
INITCAP : Face concersia pentru prima litera din fiecare cuvnt n litera mare iar pentru
celelalte litere ale cuvntului conversia se face n litera mica.
SQL > SELECT The job title for || INITCAP(ename) || is || LOWER(job)
2 AS EMPLOYEE DETAILS
3 FROM emp;

EMPLOYEE DETAILS
----------------------------------------------------------------------The job for King is manager
The job for Blake is manager
The job for Clark is manager

14 rows selected.

Utilizarea functiilor de conversie a caracterelor din


litere mari n litere mici.
Afisati numarul de ordine, numele si departamentul la care lucreaza pentru
angajatul Blake.

SQL> SELECT empno, ename, deptno


2 FROM
emp
3 WHERE ename = 'blake';
no rows selected

SQL> SELECT empno, ename, deptno


2 FROM
emp
3 WHERE LOWER(ename) = 'blake';

EMPNO
ENAME
DEPTNO
--------- ---------- --------7698 BLAKE
30

Functii de conversie a caracterelor din litere mari in litere mici.


Exemplul de mai sus afiseaza numarul de ordine, numele si departamentul la care lucreaza
pentru angajatul BLAKE.
Clauza WHERE din prima instructiune SQL specifica numele angajatului ca fiind blake. Din
moment ce toate informatiile din tabela EMP snt memorate folosind litere mari numele
blake (scris cu litere mici) nu poate fi gasit si ca urmare nu se afiseaza nimic
Clauza WHERE din cea de-a doua instructiune SQL face mai nti conversia numelui memorat
n tabela din litere mari n litere mici si compara rezultatul obtinut cu numele blake. n acest
caz ambii termeni din comparatie snt scrisi cu litere mici si deci de aceasta data se pot selecta
informatiile necesare din tabela. Clauza WHERE mai poate fi scrisa ca n exemplul de mai
jos , efectul instructiunii fiind acelasi.
WHERE ename = BLAKE

Numele angajatului din partea dreapta a comparatiei este scris cu litere mari adica asa cum
apare n tabela. Pentru a afisa numele cu prima litera convertita n litera mare iar restul n litere
mici utilizati functia INITCAP.
SQL> SELECT empno, INITCAP(ename), deptno
2 FROM
emp
3 WHERE LOWER(ename) = 'blake';

Functii pentru manipulat caractere


Manipulati siruri de caractere cu ajutorul:
FUNCTIE
CONCAT (Good,String)
SUBSTR (String,1,3)
LENGTH (String)
INSTR (String,r)
LPAD
(sal,10,*)

REZULTAT
GoodString
Str
6
3
******5000

Functii pentru manipulat caractere


Cele cinci functii pentru manipulat caracatere prezentate n cadrul acestei lectii snt: CONCAT,
SUBSTR, LENGTH, INSTR si LPAD.
7

CONCAT: Concateneaza cei doi parametri. Functia limiteaza numarul parametrilor la 2.


SUBSTR: Extrage un sir de caracter de o lungime spcificata.
LENGTH: ntoarce lungimea sirului de caractere (ntoarce o valoare numerica).
INSTR: Gaseste pozitia caracterului specificat.
LPAD: ntoarce un sir de caractere rezultat prin inserarea arg. trei la stnga primului
argument lungimea rezultatului avnd lungimea specificata de cel de-al doilea parametru.

Nota: RPAD are un comportament similar cu functia LPAD numai ca inserarea arg. trei se la
dreapta primului argument.

Utilizarea funciilor pentru manipulat caractere

SQL> SELECT ename, CONCAT (ename, job), LENGTH(ename),


2 INSTR(ename, 'A')
3 FROM
emp
4 WHERE SUBSTR(job,1,5) = 'SALES';

ENAME
---------MARTIN
ALLEN
TURNER
WARD

CONCAT(ENAME,JOB)
LENGTH(ENAME) INSTR(ENAME,'A')
------------------- ------------- ---------------MARTINSALESMAN
6
2
ALLENSALESMAN
5
1
TURNERSALESMAN
6
0
WARDSALESMAN
4
2

Functii pentru manipulat caractere (continuare)


Exemplul de mai sus afiseaza numele angajatului si slujba sa mpreuna, lunginea numelui si
pozitia literei A n cadrul numelui, pentru toate persoanele care au functia de vnzator.
Exemplu
Modificati exemplul de mai sus astfel nct instructiunea SQL sa afiseze informatiile despre
angajati pentru acele persoane a caror nume se termina n litera N.
SQL> SELECT ename, CONCAT (ename, job), LENGTH(ename),
2 INSTR(ename, 'A')
3 FROM
emp
4 WHERE SUBSTR(job,-1,1) = 'N';

ENAME
---------MARTIN
ALLEN

CONCAT(ENAME,JOB)
LENGTH(ENAME) INSTR(ENAME,'A')
------------------- ------------- ---------------MARTINSALESMAN
6
2
ALLENSALESMAN
5
1

Functii pentru valori numerice

ROUND:

TRUNC:

MOD:

Rotunjeste valoarea cu un numar specificat de


zecimale.
ROUND (45.926,2) 45.93
Truncheaza valoare
TRUNC (45.926,2) 45.92
ntoarce restul mpartirii
MOD (1600,300) 100

Functii pentru valori numerice


Functiile pentru valori numerice accepta valori numerice si ntorc valori numerice. Aceasta
sectiune descrie o parte din aceste functii:
Funtie
ROUND (coloana |
expresie, n)
TRUNC (coloana |
expresie, n)

MOD (m,n)

Scop
Rotunjeste coloana, expresia sau valoarea la un numar cu n
pozitii la partea zecimala. Daca n este omis numarul rezultat
din conversie nu are parte zecimala. Daca n este negativ este
rotunjit numarul din partea stnga a punctului zecimal.
Truncheaza coloana, expresia sau valoarea la un numar cu n
pozitii la partea zecimala. Daca n este omis numarul rezultat
din conversie nu are parte zecimala. Daca n este negativ este
truncheat numarul din partea stnga a punctului zecimal
catre zero.
ntoarce restul mpartirii dintre m si n

Nota: Aceasta este o lista incompleta a functiilor disponibile.


Pentru mai multe detalii consultati lucarea:
Oracle Server SQL Reference. Release 8.0 Number Function

Utilizarea functiei ROUND


SQL> SELECT ROUND(45.923,2), ROUND(45.923,0),
2
ROUND(45.923,-1)
3 FROM
DUAL;

ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)


--------------- -------------- ----------------45.92
46
50

Functia ROUND
Functia ROUND rotunjeste coloana, expresia sau valoarea la un numar cu n pozitii la partea
zecimala. Daca al doilea argument este omis sau este 0 numarul rezultat din conversie nu are
parte zecimala. Daca al doilea argument este 2 atunci numarul rezultat din conversie are 2 cifre
la partea zecimala. Daca al doilea argument este -2 atunci se rotunjesc primele 2 cifre ale
numarului de la stnga punctului zecimal.
Functia ROUND poate fi utilizata asupra datelor calendaristice.
Veti vedea exemple mai trziu n cadrul acestei lectii.
NOTA: DUAL este o tabela fictiva. Mai multe detali despre acest aspect vor fi oferite mai
trziu.

Utilizarea functiei TRUNC


SQL> SELECT TRUNC(45.923,2), TRUNC(45.923),
2
TRUNC(45.923,-1)
3 FROM
DUAL;

TRUNC(45.923,2) TRUNC(45.923) TRUNC(45.923,-1)


--------------- ------------- --------------45.92
45
40

Functia TRUNC
Truncheaza coloana, expresia sau valoarea la un numar cu n pozitii la partea zecimala.
Functia TRUNC functioneaza cu argumente similare ca si functia ROUND. Daca al doilea
argument este omis sau este 0 numarul rezultat din conversie nu are parte zecimala. Daca al
doilea argument este 2 atunci numarul rezultat din conversie are 2 cifre la partea zecimala.
Functia TRUNC la fel ca si functia ROUND poate fi utilizata asupra datelor calendaristice.

Utilizarea functiei MOD


SQL> SELECT ename, sal, comm, MOD(sal, comm)
2 FROM
emp
3 WHERE job = 'SALESMAN';
ENAME
SAL
COMM MOD(SAL,COMM)
---------- --------- --------- ------------MARTIN
1250
1400
1250
ALLEN
1600
300
100
TURNER
1500
0
1500
WARD
1250
500
250
10

Functia MOD
Functia MOD ntoarce restul mpartirii dintre valoarea1 si valoarea2. Exemplul de mai sus
calculeaza restul mpartirii dintre salar si comisionpentru toti angajatii care snt agenti
comerciali

Utilizarea datelor calendaristice

Oracle memoreaza datele calendaristice ntr-un format numeric intern:


Secol, an, luna, zi, ora, minute, secunde.
Formatul implicit pentru date calendaristice este:
DD-MON-YY.
SYSDATE este o functie care ntorce data si timpul.
DUAL este o tabela fictiva utilizata pentru a vedea rezultatul ntors de
SYSDATE.

Formatul datei calendaristice n Oracle


Oracle memoreaza datele calendaristice ntr-un format numeric intern: Secol, an, luna, zi, ora,
minute, secunde.
Formatul implicit pentru date calendaristice este: DD-MON-YY. Valorile valide pentru date
calendaristice se situeaza ntre Ianuarie 1. 4712 B.C. si Decembrie 31. 9999 A.D.
SYSDATE
SYSDATE este o functie care ntorce data si timpul curent. Puteti sa utilizati SYSDATE asa
cum utilizati orice denumire de coloana. De exemplu puteti afisa data curenta selectnd
SYSDATE dintr-o tabela. Tabela pe care o folositi ramne la latitudinea dumneavoastra. Se
poate de exemplu folosi pentru afisarea datei tabela fictiva DUAL.
DUAL
Tabela DUAL este proprietatea utilizatorului SYS si poate fi accesata de toti utilizatorii. Ea
contine o coloana DUMMY, si un rnd cu valoarea X. Tabela DUAL este folositoare atunci
cnd avem de ntors o singura valoare
ca de exemplu valoare unei constante, pseudocoloane sau o expresie care nu este derivata
dintr-o tabela cu datele utilizatorului.
Exemplu
Afisarea datei curente folosind tabela DUAL.
SQL> SELECT SYSDATE
2 FROM
DUAL;
11

Operatii aritmetice cu date calendaristice

Daca adunati sau scadeti un numar la sau dintr-o data calendaristica veti
obtine tot o data calendaristica.
Scadeti doua date pentru a gasi numarul de zile dintre acele date.
Adunati un numar de ore la o data adunnd la acea data numarul de zile
mpartit la 24.

Operatii aritmetice cu date calendaristice


Din moment ce baza de date memoreaza datele calendaristice ca numere, rezulta ca asupra
acestor date se pot efectua operatii aritmetice utiliznd operatori aritmetici cum ar fi + si - .
Puteti deasemeni sa adunati sau sa scadeti constante numerice la date calendaristice.
Aveti posibilitatea de aefectua urmatoarele operatii:
Operatie
data + numar
data numar
data data
data +
numar/24

Rezultat
data
data
numar de zile
data

Descriere
aduna un numar de zile la o data
scade un numar de zile dintr-o data
scade o data din cealalta
aduna un numar de ore la o data

Folosirea operatorilor aritmetici cu date


calendaristice
SQL> SELECT ename, (SYSDATE-hiredate)/7 WEEKS
2 FROM
emp
3 WHERE deptno = 10;

ENAME
---------KING
CLARK
MILLER

WEEKS
--------830.93709
853.93709
821.36566

12

Operatii aritmetice cu date calendaristice


Exemplul de mai sus prezinta o tabela cu numele angajatilor din departamentul 10 alaturi de
perioada n care au fost angajati exprimata n saptamni. Pentru a afiasa perioada angajarii n
saptamni se face diferenta ntre data curenta (data de SYSDATE) si data la care a fost
angajata persoana si apoi se mparte rezultatul la 7.
Nota: SYSDATE este o functie SQL ce ntoarce data si timpul curent. Rezultatul pe care l
obtineti daca probati exemplul poate sa difere de rezultatul de mai sus.

Functii pentru date calendaristice


Functie
MONTHS_BETWEEN
ADD_MONTHS
NEXT_DAY
LAST_DAY
ROUND
TRUNC

Descriere
ntoarce numarul de luni dintre
doua date calendaristice.
Aduna un numar de saptamni la o
data calendaristica
ntoarce ziua ce urmeaza datei
specificate
Ultima zi a lunii
Rotunjeste data calendaristica
Truncheaza data calendaristica

Functii pentru date calendaristice


Functiile pentru date calendaristice opereaza asupra datelor calendaristice de tip Oracle. Toate
functiile pentru date ntorc o valoare de tip data cu exceptia functiei MONTH_BETWEEN,
care ntoarce o valoare numerica.
MONTHS_BETWEEN(data1, data2): Gaseste numarul de luni dintre data1 si data2.
Rezultatul poate fi pozitiv sau negativ. Daca data1 este mai trzie dect data2 atunci
rezultatul este pozitiv. Daca data2 este mai trzie dect data1 atunci rezultatul este negativ.
Partea nentreaga a rezultatului reprezinta o parte din luna.
ADD_MONTHS(data,n): Aduna un numar de n luni la data. Numarul n trebuie sa fie
ntreg si poate fi negativ.
NEXT_DAY(data,char): Determina data calendaristica a urmatoarei zile specificate, din
saptamna, care urmeaza datei data
LAST_DAY(data): Determina data calendaristica a ultimei zile specificate, din saptamna,
care urmeaza datei data
ROUND(data[,fmt]): ntoarce data rotunjita n functie de formatul fmt. Daca fmt este
omis atunci data este rotunjita la cea mai apropiata data.
TRUNC(data[,fmt]): ntoarce data data trunchiata n functie de de formatul fmt. Daca
fmt este omis atunci data este rotunjita la cea mai apropiata zi.
Aceasta lista este un subset al functiilor disponibile. Modelele pentru format snt tratate mai
trziu n cadrul acestui capitol. Exemple de format snt: month si year.

13

Utilizarea functiilor pentru date calendaristice

MONTHS_BETWEEN (01-SEP-95,11-JAN-94)
19.6774194
ADD_MONTHS (11-JAN-94,6)
11-JUL-94
NEXT_DAY (01-SEP-95,FRIDAY)
08-SEP-95
LAST_DAY (01-SEP-95)
30-SEP-95

Functii pentru date calendaristice (continuare).


Pentru toate persoanele care au fost angajate pe o perioada mai mica de 200 de luni, afisati
numarul de ordine al angajatului , data angajarii, numarul de luni pe care persoana le-a
acumulat ca angajat, data reviziei care trebuie facuta peste 6 luni, prima vineri de dupa data
angajarii, ultima zi a lunii n care s-a facut angajarea.
SQL > SELECT empno, hiredate,
2
MONTHS_BETWEEN (SYSDATE, hiredate) TENURE,
3
ADD_MONTHS (hiredate, 6) REVIEW,
4
NEXT_DAY (hiredate, FRIDAY), LAST_DAY(hiredate)
5
FROM emp
6 WHERE MONTHS_BETWEEN (SYSDATE, hiredate) < 200;
EMPNO HIRDATE
----------------- -------------7839 17-NOV-81
7698 01-MAY-81

11 rows selected.

TENURE REVIEW
NEXT_DAY( LAST_DAY(
-------------- -------------- ------------------ ----------------192.24794 17-MAY-82 20-NOV-81
30-NOV-81
198.76407 01-NOV-81 08-MAY-81
31-MAY-81

Utilizarea functiilor pentru date calendaristice

ROUND (25-JUL-95,MONTH)
01-AUG-95
ROUND (25-JUL-95,YEAR)
01-JAN-96
TRUNC (25-JUL-95,MONTH)
01-JUL-95
TRUNC (25-JUL-95,YEAR)
01-JAN-95

Functii pentru date calendaristice (continuare).


14

Functiile ROUND si TRUNC pot fi utilizate att pentu numere ct si pentru date calendaristice.
Atunci cnd snt utilizate cu date calendaristice, acestea rotunjesc sau truncheaza data tinnd
cont de modelul specificat. Astfel se pot , de exemplu, rotunji date calendaristice spre cel mai
apropiat an sau cea mai apropiata luna.
Exemplu
Comparati datele n care s-au facut angajari pentru toate persoanele care au nceput sa lucreze
n anul 1987. Afisati numarul de ordine al angajatului, data angajarii, si luna n care acesta a
nceput sa lucreze exprimata sub forma unui interval, folosind functiile ROUND si TRUNC.
SQL > SELECT empno, hiredate,
2
ROUND (hiredate, MONTH), TRUNC(hiredate, MONTH)
3
FROM emp
6 WHERE hiredate like %87 ;

EMPNO
----------------7788
7876

HIREDATE ROUND(HIR
---------------- ----------------19-APR-87 01-MAY-87
23-MAY-87 01-JUN-87

TRUNC(HIR
----------------01-APR-87
01-MAY-87

Functii pentru conversia tipului de date


Conversia
tipului de date

Conversie
implicita a
tipului dedate

Conversie
explicita a
tipului de date

Functii pentru conversia tipului de date


Pe lnga tipurile de date din Oracle, coloanele tabelelor dintr-o baza de date Oracle8 pot fi
definite utiliznd tipuri de date ANSI, DB2 si SQL/DS. Intern server-ul Oracle face conversia
din aceste tipuri de date n tipuri de date Oracle8.
n unele situatii, server-ul Oracle accepta anumite tipuri de date desi n mod normal ar trebui
sa primeasca alte tipuri. Acest lucru se ntmpla atunci cnd server-ul Oracle poate face
automat conversia n tipul de date pe care l astepta. Aceste conversii se pot face implicit de
catre server-ul Oracle sau explicit de catre utilizator.
Conversiile de date implicite se fac conform unui set de reguli ce va fi detaliat mai trziu.

15

Conversiile de date explicite se fac utiliznd functii de conversie. Functiile de conversie


transforma tipul unei valori n altul. n general functiile de conversie respecta urmatoarea
forma: tip de data1 TO tip de data2 unde
tip de data1este tipul de data care trebuie transformat si reprezinta intrarea, iar tip de data2este
tipul de data spre care se face conversia si reprezinta iesirea.
Nota: Desi se fac conversii de date n mod implicit atunci cnd este nevoie, este recomnadat
ca aceste conversii sa fie facute implicit de catre utilizator pentru a sigura corectitudinea
instructiunilor.

Conversii de date implicite


n operatii de atribuire Oracle poate automat conversia:

DIN

VARCHAR2 sau CHAR


(sir de caractere)
VARCHAR2 sau CHAR
(sir de caractere)
NUMBER
(valoare numerica)
DATE
(data calendaristica)

NUMBER
(valoare numerica)
DATE
VARCHAR2
(sir de caractere)
VARCHAR2
(sir de caractere)

Conversii de date implicite


n operatii de atribuire Oracle poate automat conversia:
Din VARCHAR2 sau CHAR n NUMBER
Din VARCHAR2 sau CHAR n DATE
Din NUMBER n VARCHAR2
Din DATE n VARCHAR2
Operatia de atribuire are loc cu succes daca server-ul Oracle poate converti tipul de data al
sursei n tipul de data al destinatiei.

Conversii de date implicite


n cazul evaluarii expresiilor, Oracle poate automat conversia:

DIN

VARCHAR2 sau CHAR


(sir de caractere)
VARCHAR2 sau CHAR
(sir de caractere)

NUMBER
(valoare numerica)
DATE
(data calendaristica)

16

Conversii de date implicite


n cazul evaluarii expresiilor, Oracle poate automat conversia:
Din VARCHAR2 sau CHAR n NUMBER
Din VARCHAR2 sau CHAR n DATE
n general server-ul Oracle utilizeaza regulile de conversie pentru expresii n cazul n care
regulile de conversie pentru atribuire nu acopera si situatia respectiva.
Nota: Conversia din CHAR n NUMBER are loc cu succes doar daca sirul de caractere
reprezinta un numar valid. Conversia din CHAR n DATE are loc cu succes doar daca sirul de
caractere respecta formatul implicit:
DD-MON-YY.

Conversii de date explicite


TO_NUMBER

NUMAR

TO_DATE

CARACTER

TO_CHAR

DATA CALENDARISTICA
TO_CHAR

Conversii de date explicite


SQL pune la dispozitie trei functii cu ajutorul carora se pot face conversii dintr-un tip de data
n altul.
Functie
TO_CHAR (numar|data calendaristica,
[fmt])
TO_NUMBER (caracter)
TO_DATE (caracter ,[fmt])

Scop
Face conversia dintr-un numar sau o data
calendaristica ntr-un sir de caractere de tipul
VARCHAR2 respectnd formatul fmt specificat.
Face conversia dintr-un sir de caractere ce contine
cifre ntr-o valoare numerica
Face conversia dint-un sir de caractere ce reprezinta
o data ntr-o valoare de tip DATE respectnd
formatul fmt specificat.
(Daca fmt este omis formatul implicit este DDMON-YY)

17

Nota: Lista prezentata mai sus reprezinta un subset din functiile disponibile pentru conversii.
Pentru mai multe detalii consultati lucarea:
Oracle Server SQL Reference. Release 8.0 Conversion Function

Utilizarea functiei TO_CHAR mpreuna cu date


calendaristice
TO_CHAR (data calendaristica, fmt)
Modelul de formatare:

Trebuie inclus ntre ghilimele simple si este


case sensitive
Poate include orice element valid al modelului de formatare pentru date
calendaristice
Are un element fm care elimina spatiile albe sau zerourile
nesemnificative.
Este separat de data calendaristica prin virgula.

Afisarea datei calendaristice ntr-un anumit format


Pna acum toate datele calendaristice au fost afisate respectnd formatul DD-MON-YY.
Functia TO_CHAR va permite sa faceti conversia din formatul implicit ntr-un format
specificat de dumneavoastra.
Observatii
Trebuie inclus ntre ghilimele simple si este case sensitive
Poate include orice element valid al modelului de formatare pentru date calendaristice.
Asigurati-va ca valoarea este separata de modelul de formatare prin virgula.
Pentru numele zilelor si a lunilor n iesire se adauga automat spatii albe.
Pentru a elimina spatiile si zerourile nesemnificative folositi elementul pentru modul de
umplere.
Aveti posibilitatea de a redimensiona lungimea pe care se face afisarea pentru un cmp cu
ajutorul comenzii SQL*Plus COLUMN.
Lungimea implicita a coloanei rezultate este de 80 caractere.
SQL > SELECT empno, TO_CHAR (hiredate, MM/YY) Month_Hired
2 FROM emp
3 WHERE ename=BLAKE;

18

Elementele ale modelului de formatare


pentru date calendaristice
YYYY
YEAR
MM
MONTH
DY
DAY

Anul afisat pe 4 digiti


Anul n litere
luna scrisa cu doua cifre
numele lunii
o abreviatie a denumirii
unei zile din saptamna
formata din trei litere
denumirea completa a zilei

Exemple de elementele ale modelului de formatare


Element
SCC sau CC
YYYY sau SYYYY
(an n cadrul datelor calendaristice)
YYY sau YY sau Y
Y,YYY
[YYY,[YY,[Y,]
SYEAR sau YEAR
BC sau AD
B.C. sau A.D.
Q
MM
MONTH

MON
RM
WW sau W
DDD sau DD sau D
DAY
DY
J

Descriere
Secol:S precede data .e.n cu Anul: S precede data .e.n cu Ultimele 3,2 sau 1 cifre din an
O virgula n cadrul anului
4,3,2 sau o cifra din an conform standardului
ISO
Anul n litere :S precede data .e.n cu Indicatorul BC AD
Indicatorul BC AD cu puncte
Sfertul unui an
Luna scrisa cu doua cifre
Numele ntreg al lunii scris pe 9 caractere.
Daca denumirea lunii nu ocupa cele 9
caractere, spatiul ramas liber este automat
umplut cu spatii
O abreviatie a denumirii unei luni formata din
trei litere
Luna scrisa cu cifre romane
Saptamna din an sau luna
Ziua din an ,luna sau saptamna.
Denumirea completa a zilei completata
eventual cu spatii pna la 9 caractere.
O abreviatie a denumirii unei zile formata din
trei litere
Numarul de zile de la data de 31 Decembrie
4713BC

19

Elementele ale modelului de formatare pentru date


calendaristice

Elemente ce formateaza timpul


HH24:MI:SS AM
15:45:32 PM

Adaugati siruri de caractere prin nchiderea acestora ntre ghilimele


DD of MONTH
12 of OCTOBER

Adaugati sufixe pentru a scrie n litere un numar


ddspth
fourteenth

Modele de formatare pentru timp


Utilizati elementele descrise mai jos atunci cnd doriti sa afisati timpul ntr-un anumit format
sau folosind litere n loc de cifre.
Element
AM sau PM
A.M. sau P.M.
HH sau HH12 sau HH24
MI
SS
SSSSS
Alte formate
Element
/..
of the
Specificati sufixe
Element
TH
SP
SPTH sau THSP

Descriere
indicator de meridian
indicator de meridian cu puncte
ora
minute (0-59)
secunde (0-59)
Numarul de secunde ncepnd cu miezul
noptii
Descriere
Punctuatia este reprodusa n rezultat.
sirul incadrat ntre ]ghilimele este reprodus
Descriere
Numar de ordine dat n cifre (de exemplu
DDTH pentru 4TH)
Numar scris n litere (de exemplu DDSP
pentru FOUR)
Numar de ordine scris n litere (de exemplu
DDSPTH pentru FOURTH)

20

Utilizarea functiei TO_CHAR mpreuna cu date


calendaristice
SQL > SELECT ename,
2
TO_CHAR (hiredate, fmDD Month YYYY) HIREDATE
3 FROM emp;

ENAME
-------------------KING
BLAKE
CLARK
JONES
MARTIN
ALLEN

14 rows selected

HIREDATE
---------------------17 November 1981
1 May 1981
9 June 1981
2 April 1981
28 September 1981
20 Februay 1981

Utilizarea functiei TO_CHAR mpreuna cu date calendaristice


Exemplul de mai sus prezinta o modalitate de a afisa numele si data angajarii pentru fiecare
angajat.( De remarcat este formatul n care se afiseaza data.)
Exemplu
Modificati exemplul de mai sus astfel nct data calendaristica sa aiba urmatorul format:
Ex. Seventh of February 1981 08:00:00 AM
SQL > SELECT ename,
2 TO_CHAR (hiredate, fmDdspth of Month YYYY fmHH:MI:SS AM)
3 HIREDATE
3 FROM emp;

ENAME
-------------------KING
BLAKE

14 rows selected

HIREDATE
---------------------Seventeenth of November 1981 12:00:00 AM
First of May 1981 12:00:00 AM

De remarcat este faptul ca denumirea lunii respecta modelul pentru format specificat
(INITCAP).
21

Utilizarea functiei TO_CHAR mpreuna cu valori


numerice

TO_CHAR (number, fmp)


Pentru a afisa o valoare numerica sub forma unui caracter utilizati
urmatoarele elemnte de formatare mpreuna cu functia TO_CHAR.
9
0
$
L
.
,

Reprezinta un numar
Forteaza afisarea unei cifre 0
Semnul dolar
Foloseste simbolul local pentru moneda
Afiseaza un punct
Tipareste un indicator pentru mii

Utilizarea functiei TO_CHAR mpreuna cu valori numerice


Atunci cnd lucrati cu valori numerice ca siruri de caractere ar trebui sa convertiti acele
numere spre valori de tip caracter utiliznd functia TO_CHAR, care face conversia dintre o
valoare de tip NUMBER spre o valoare de tip VARCHAR2. Aceasta tehnica este folositoare n
cadrul unei concatenari.
Elemente de formatare pentru numere
Daca aveti de convertit un numar ntr-o valoare de tip caracter puteti utiliza urmatoarele
elemente.
Eleme

Descriere

Exemplu

Rezultat

Pozitie numerica (numarul cifrelor


de 9 determina lungimea pe care se
face afisarea)
Afiseaza zerourile nesemnificative
Semnul dolar
Foloseste simbolul local pentru
moneda
Determina afisarea unui punct
zecimal n pozitia specificata.
Determina afisarea unei virgule n
pozitia specificata.
Determina afisarea semnului minus
n partea dreapta (pentru valori

999999

1234

099999
$999999
L999999

001234
$1234
FF1234

999999.99

1234.00

999,999

1,234

999999MI

1234 -

n
t
9
0
$
L
.
,
MI

22

PR
EEEE
V
B

negative)
nchide ntre paranteze numerele
negative
Notatie stiintifica (formatul impune
existenta a patru litere E)
nmultire cu 10 de n ori (n=numarul
de cifre de 9 de dupa litera V)
nlocuieste valorile de 0 cu blank

999999PR

<1234>

99.999EEEE
9999V99

1.234E+
03
123400

B9999.99

1234.00

Utilizarea functiei TO_CHAR mpreuna cu valori


numerice

SQL> SELECT TO_CHAR(sal,'$99,999') SALARY


2 FROM
emp
3 WHERE ename = 'SCOTT';

SALARY
-------$3,000

Observatii
Server-ul Oracle afiseaza semnul (#) n locul valorii numerice a carui numar cifre a
depasit valoarea specificata prin model.
Server-ul Oracle rotunjeste valoarea zecimala stocata ca o valoare cu un numar de
zecimale furnizat de catre modelul de formatare.

Functiile TO_CHAR si TO_DATE

Pentru a face conversia dintr-un sir de caractere ntr-un numar folositi


functia TO_NUMBER
TO_NUMBER (char)

Pentru a face conversia dintr-un sir de caractere ntr-o data


calendaristica folositi functia TO_DATE
TO_DATE (char [, fmt ] )

23

Functiile TO_CHAR si TO_DATE


Este posibil sa apara o situatie n care doriti sa faceti conversia dintr-un sir de caractere ntr-un
numar sau ntr-o data callendaristica. Pentru a realiza aceste tipuri de conversii utilizati
functiile TO_NUMBER si TO_DATE. Modelul dupa care se face formatarea va trebui sa-l
alcatuiti pe baza elementelor pentru formatare prezentate anterior.
Exemplu
Afisati numele si data angajarii pentru toate persoanele care au fost angajate pe February 22,
1981.
SQL > SELECT ename, hiredate
2 FROM emp
3 WHERE hiredate = TO_DATE (February 22, 1981, Month dd, YYYY);

ENAME
HIREDATE
-------------------- -------------------WARD
22-FEB-81

Formatul RR pentru date calendaristice


Anul curent
1995
1995
2001
2001

Data specificata
27-OCT-95
27-OCT-17
27-OCT-17
27-OCT-95

0-49
Daca cele
doua cifre
ale anului
curent snt
50-99

Formatul RR
1995
2017
2017
1995

Formatul YY
1995
1917
2017
2095

Daca cele doua cifre specificate


ale anului snt
0-49
50-99
Data ntoarsa
Data ntoarsa se
se ncadreaza
ncadreaza n
n secolul
secolul de
curent
dinaintea celui
curent
Data ntoarsa
Data ntoarsa
se ncadreaza
se ncadreaza
n secolul de
n secolul
dupa secolul
curent
curent

24

Formatul RR pentru date calendaristice


Formatul RR pentru date calendaristice este similar cu elementul YY, dar va permite sa
specificati secole diferite. Aveti posibilitatea de a folosi elementul pentru formatarea datelor
RR n locul elementului YY si astfel secolul valorii returnate variaza n functie de cei doi
digiti specificati n an si de ultimii doi digiti ai anului curent. Tabelul urmator descrie
comportamentul elementului RR.
Anul curent
1994
1994
2001

Data specificata
27-OCT-95
27-OCT-17
27-OCT-17

Formatul RR
1995
2017
2017

Formatul YY
1995
1917
2017

Functia NVL
Converteste o valoare nula ntr-o valoare efectiva

Tipurile de date care pot fi folosite snt: data calendaristica, caracter


si numar.
Tipurile de date trebuie sa se potriveasca
- NVL (comm,0)
- NVL (hiredate,01-JAN-97)
- NVL (job, No Job Yet)

Functia NVL
Pentru a face conversia ntre o valoare nula si o valoare efectiva utilizati functia NVL.
Sintaxa
NVL (expr1, expr2)

unde: expr1 este valoarea sau expresia sursa care ar putea sa contina o valoare nula.
expr2 este valoarea tinta, valoarea spre care se face conversia
Aveti posibilitatea de a utiliza functia NVL mpreuna cu orice tip de data, dar tipul valorii
ntoarse este de fiecare data la fel cu tipul parametrului expr1.
Conversii NVL pentru diferite tipuri de date
Tip de data
NUMBER
DATE
CHAR sau
VARCHAR2

Exemplu de conversie
NVL (coloana ce contine o valoare de tip numeric,9)
NVL (coloana ce contine o valoare de tip data
calendaristica, 01-JAN-95)
NVL (coloana ce contine o valoare de tip
caracter,Unavariable)
25

Utilizarea functiei NVL


SQL> SELECT ename, sal, comm, (sal*12)+NVL(comm,0)
2 FROM
emp;

ENAME
SAL
COMM (SAL*12)+NVL(COMM,0)
---------- --------- --------- -------------------KING
5000
60000
BLAKE
2850
34200
CLARK
2450
29400
JONES
2975
35700
MARTIN
1250
1400
16400
ALLEN
1600
300
19500
...
14 rows selected.

Functia NVL
Pentru a calcula compensatia anuala pentru toti angajatii, trebuie sa nmultiti salariul lunar cu
12 si apoi sa adugati comisionul.
SQL> SELECT ename, sal, comm, (sal*12)+comm
2 FROM
emp;

ENAME
SAL
COMM (SAL*12)+NVL(COMM,0)
---------- --------- --------- -------------------KING
5000
BLAKE
2850
CLARK
2450
JONES
2975
MARTIN
1250
1400
16400
...
14 rows selected.

Din exemplul precedent se poate remarca faptul ca compensatia anuala se calculeaza doar
pentru acei angajati care au o valoare pentru comision nenula. Daca se ntlneste pe colana o
valoare nula atunci rezultatul este nul. Pentru a calcula valorile pentru toti angajatii trebuie sa
convertiti valorile nule n valori numerice nainte de a aplica operatorul aritmetic. O solutie
corecta pentru o astfel de problema este prezentata n exemplul precedent celui luat n discutie,
exemplu n care pentru conversia valorilor nule s-a folosit functia NVL.

26

Functia DECODE
Faciliteaza simularea unor structuri de tip CASE sau
IF-THEN-ELSE

DECODE(col/expression, search1, result1


[, search2, result2,...,]
[, default])

Functia DECODE
Functia DECODE evalueaza o expresie ntr-un mod similar structurii IF-THEN-ELSE,
structura folosita n multe limbaje de programare. Funtia DECODE evalueaza expresia dupa ce
o compara cu fiecare valoare search. Daca valoarea expresiei este la fel cu valoarea continuta
n search atunci valoarea result este ntoarsa.
Daca valoarea default (implicita) este omisa functia va ntoarce o valoare nula n cazul n care
valoarea expresiei nu se potriveste cu nici o valoare search.

Utilizarea functiei DECODE


SQL> SELECT job, sal,
2
DECODE(job, 'ANALYST', SAL*1.1,
3
'CLERK',
SAL*1.15,
4
'MANAGER', SAL*1.20,
5
SAL)
6
REVISED_SALARY
7 FROM
emp;

JOB
SAL REVISED_SALARY
--------- --------- -------------PRESIDENT
5000
5000
MANAGER
2850
3420
MANAGER
2450
2940
...
14 rows selected.

Utlizarea functiei DECODE


n exemplul de mai sus valoarea evaluata este JOB. Daca JOB este ANALIST, sporul de salar
este de 10%; daca JOB este CLERK, sporul de salar este de 15% iar daca JOB este
MANAGER, sporul de salar este de 20%.Pentru celelalte slujbe salariile nu se modifica.
27

Aceeasi structura scrisa cu IF-THEN-ELSE are urmatoarea forma:


IF job = ANALIST
IF job = CLERK
IF job = MANAGER
ELSE sal = sal

THEN sal = sal * 1.1


THEN sal = sal * 1.15
THEN sal = sal * 1.20

Imbricarea functiilor

Functiile de un singur rnd se pot imbrica de cte ori dorim.


Evaluarea functiilor imbricate ncepe de la nivelul cel mai adnc.

F3 (F2 (F1 (col, arg1), arg2), arg3)


pas1=rez.1
pas2=rezultat2
pas3=rezultat3

Imbricarea functiilor
Functiile de un singur rnd se pot imbrica de cte ori dorim. Evaluarea lor se face din centrul
expresiei imbricate spre exteriorul acesteia. Exemplele care urmeaza va vor demonstra
flexibilitatea acestor functii.

Imbricarea functiilor
SQL> SELECT ename,
2
NVL(TO_CHAR(mgr),'No Manager')
3 FROM
emp
4 WHERE mgr IS NULL;

ENAME
NVL(TO_CHAR(MGR),'NOMANAGER')
---------- ----------------------------KING
No Manager

28

Imbricarea functiilor (continuare)


Exemplul de mai sus afiseaza acele persoane care nu are au superior. Evaluarea instructiunii
SQL se realizeaza n doi pasi.
1. Evaluarea functiei din interior ce face conversia dintr-o valoare numerica n una de tip
caracter.
- Rezultat1=TO_CHAR (mgr)
2. Evaluarea functiei din exterior care nlocuieste valorile nule cu un text
- NVL (Rezultat1, No Manager)
Denumirea coloanei este data de ntreaga expresie din moment ce nu este specificat nici un
alias pentru acea coloana.
Exemplu
Afisati data calendaristiaca a zilei de vineri ce urmeaza dupa sase luni de la data angajarii.
Data rezultata ar trebui sa aiba o forma de genul Friday, March 12th, 1982. Ordonati rezultatul
afisarii dupa data angajarii.
SQL > SELECT TO_CHAR (NEXT_DAY (ADD_MONTHS
2 (hiredate, 6), FRIDAY) ,
3 fmDay, Month ddth, YYYY)
4
Next 6 Month Review
5
FROM emp
6
ORDER BY hiredate;

Sumar
Utilizati functii n cazul n care:

aveti de facut calcule asupra unor date calendaristice


Modificarea unor articole individuale
Manipularea iesirii pentru grupuri de rnduri
Stabilirea unui format pentru date calendaristice si numere atunci cnd
acestea snt tiparite pe ecran
Schimbarea tipului de data a unei coloane

Functii de un singur rnd


Functiile de un singur rnd se pot imbrica de cte ori dorim. Cu ajutorul functiilor de un singur
rnd putem manipula:
Date de tip caracter
- LOWER, UPPER, INITCAP, CONCAT, SUBSTR, INSTR, LENGTH
Date de tip numeric
- ROUND, TRUNC, MOD
29

Date calendaristice
- MONTHS_BETWEEN, ADD_MONTH, NEXT_DAY, LAST_DAY, ROUND,
TRUNC
- valorile de tip data calendaristica pot fi utilizate mpreuna cu operatori aritmetici

Functiile de conversie pot converti valori numerice, valori de tip caracter si datelor
calendaristice
- TO_CHAR, TO_DATE, TO_NUMBER

SYSDATE si DUAL
SYSDATE este o functie care ntoarce data si timpul curent. . Tabela pe care o folositi ramne
la latitudinea dumneavoastra. Se poate de exemplu folosi pentru afisarea datei tabela fictiva
DUAL.

Privire generala asupra exercitiilor

Crearea unor interogari care sa includa lucru cu numere, caractere si


date calendaristice
Utilizarea concatenarilor cu functii
Realizarea unor interogari care sa nu depinda de faptul ca informatiile
snt scrise cu litere mari sau mici
Realizarea unor calcule asupra anilor si lunilor de angajare ale unor
persoane
Determinare datei cnd se recalculeaza salariul pentru un angajat.

Privire generala asupra exercitiilor


Exercitiile ce urmeaza snt astfel concepute nct sa aveti posibilitatea sa puneti n aplicatie
cunostintelor acumulate pe parcursul acestei lectii cu privire la functiile pentru caractere,valori
numerice, date calendaristice si tipuri de date.
Este bine sa va reamintiti ca n cazul functiilor imbricate evaluarea se face ncepnd cu functia
din interior si terminnd cu cea din exterior.
1. Scrieti o interogare care sa afiseze data curenta. Denumiti coloana Date
2.Afisati numarul de ordine,numele,salariul si salariu marit cu 15%(ntr-un singur numar).
Denumiti ultima coloana Salar Nou. Salvati instructiunea ntr-un fisier numit p3q2.sql
3.Rulati programul salvat anterior

30

4. Modificati programul salvat n fisierul p3q2.sql astfel nct acesta sa adauge o coloana n
care veti trece difereta dintre salariul nou si cel vechi. Denumiti coloana Crestere. Rulati noul
program.
5. Afisati numele angajatului, data angajarii, data cnd se recalculeaza salariul, care este prima
luni dupa 6 luni de servici. Denumiti coloana REVIEW. Formatati afisarea datei astfel nct sa
arate similar cu exemplul de mai jos:
Ex. Sunday, the Seventh of September, 1981
6. Pentru fiecare angajat afisati numele si calculati numarul de luni ntre data de astazi si data
angajarii. Denumiti coloana LUNI_DE_ACTIVITATE. Ordonati rezultatul dupa numarul de
luni de lucru. Rotunjiti numarul de luni.
7. Scrieti o interogare care sa produca urmator afisaj pentru fiecare angajat
<nume angajat> cstiga <salariu> lunar dar ar dori <3 * salariu>. Denumiti coloana Salariul de
vis.
8. Scrieti o interogare care sa afiseze numele si salariul pentru toti angajatii. Afisati valoarea
salariului pe 15 caracter aliniata la dreapta iar spatiul ramas la stnga sa fie umplut cu
caracterul $. Denumiti coloana SALARIU.
9. Scrieti o interogare care sa afiseze numele angangajatului cu litere mici cu exceptia primei
litere care se va scrie cu litera mare si lungimea numelui.
10. Afisati numele, data angajarii si ziua din saptamna n care angajatul a nceput lucrul.
Denumiti coloana ZI.
Ordonati rezultatul dupa cmpurile coloanei ZI ncepnd cu Monday (Luni).
11. Scrieti o interogare care sa afiseze numele angajatului si valoarea comisionului. Daca
angajatii nu obtin comision introduceti No commission. Denumiti coloana COMM.

31

Вам также может понравиться