Академический Документы
Профессиональный Документы
Культура Документы
Obiective
Dupa parcurgerea acestei lectii, ar trebui sa stiti sa faceti urmatoarele lucruri:
-
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.
Functii
Functii de un
singur rnd
Functii de mai
multe rnduri
Conversie
Manipuleaza articole
Actioneaza asupra fiecarui rnd rezultat din interogare
ntorc un singur rezultat pentru fiecare rnd
Pot modifica tipuri de date
Pot fi imbricate
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
Numere
Functii de un
singur rnd
Data
calendaristica
Conversie
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
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.
REZULTAT
sql course
SQL COURSE
Sql Course
5
EMPLOYEE DETAILS
----------------------------------------------------------------------The job for King is manager
The job for Blake is manager
The job for Clark is manager
14 rows selected.
EMPNO
ENAME
DEPTNO
--------- ---------- --------7698 BLAKE
30
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';
REZULTAT
GoodString
Str
6
3
******5000
Nota: RPAD are un comportament similar cu functia LPAD numai ca inserarea arg. trei se la
dreapta primului argument.
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
ENAME
---------MARTIN
ALLEN
CONCAT(ENAME,JOB)
LENGTH(ENAME) INSTR(ENAME,'A')
------------------- ------------- ---------------MARTINSALESMAN
6
2
ALLENSALESMAN
5
1
ROUND:
TRUNC:
MOD:
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
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.
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.
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
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.
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
ENAME
---------KING
CLARK
MILLER
WEEKS
--------830.93709
853.93709
821.36566
12
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
13
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
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
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
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
Conversie
implicita a
tipului dedate
Conversie
explicita a
tipului de date
15
DIN
NUMBER
(valoare numerica)
DATE
VARCHAR2
(sir de caractere)
VARCHAR2
(sir de caractere)
DIN
NUMBER
(valoare numerica)
DATE
(data calendaristica)
16
NUMAR
TO_DATE
CARACTER
TO_CHAR
DATA CALENDARISTICA
TO_CHAR
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
18
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
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
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
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
Reprezinta un numar
Forteaza afisarea unei cifre 0
Semnul dolar
Foloseste simbolul local pentru moneda
Afiseaza un punct
Tipareste un indicator pentru mii
Descriere
Exemplu
Rezultat
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
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.
23
ENAME
HIREDATE
-------------------- -------------------WARD
22-FEB-81
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
24
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
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
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
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.
JOB
SAL REVISED_SALARY
--------- --------- -------------PRESIDENT
5000
5000
MANAGER
2850
3420
MANAGER
2450
2940
...
14 rows selected.
Imbricarea functiilor
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
Sumar
Utilizati functii n cazul n care:
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.
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