Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Functii de un singur rind
Obiective
Dupa parcurgerea acestei lectii, ar trebui sa stiti sa faceti urmatoarele lucruri
Sa descrieti diferite tipuri de functii disponibile in SQL
Sa utilizati caractere, numere si date calendaristice in cadrul instructiunii SELECT
Sa descrieti utilitatea functiilor de conversie
Functiile fac blocul de baza al interogarii mai puternic si sint 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 atit de functiile de un singur rind pentru caractere, numere si date calendaristice cit si de functiile ce fac conversii dintr-un tip de data in altul de exemplu: din caracter in numar
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 rinduri
Stabilirea unui format pentru date calendaristice si numere atunci cind acestea sint tiparite pe ecran
Schimbarea tipului de data a unei coloane
Functiile SQL accepta argumente si intorc valori.
Nota : Majoritatea functiilor descrise in aceasta lectie sint specifice versiunii SQL pentru Oracle.
Functii SQL continuare Exista doua tipuri distincte de functii:
Functii de un singur rind
Functii de mai multe rinduri
Caracter
Numar
Data calendaristica
Conversie
Functii de mai multe rinduri - Aceste functii actioneaza asupra unor grupuri de rinduri si intorc 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 impreuna cu sintaxa aferenta
Functii de un singur rind
Manipuleaza articole
Actioneaza asupra fiecarui rind rezultat din interogare
Intorc un singur rezultat pentru fiecare rind
Pot modifica tipuri de date
Pot fi imbricate
O
O variabila
O denumire de coloana
O expresie
Actioneaza asupra fiecarui rind intors de interogare
Intorc o valoare pentru fiecare rind
Pot intoarce o data a carui tip este diferit de tipul argumentului
Este posibil sa astepte unul sau mai multe argumente
Le puteti utiliza in SELECT, WHERE si ORDER BY Le puteti imbrica
In sintaxa:
nume_functie este numele functiei
coloana este un nume de coloana din baza de date
expresie este orice sir de caractere sau expresie calculabila
arg1, arg2, . sint argumentele utilizate de functie
Functii de un singur rand:
Functii pentru caractere: accepta argumente de tip caracter si intorc rezultate de tip caracter sau numeric
Functii pentru numere: accepta argumente de tip numeric si intorc 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 intoarce o valoare numerica
Functii pentru conversie: fac conversia dintr-un tip de data in altul
Functii generale
Functii NVL
Functii DECODE
Functii pentru caractere
Functii
pentru caractere
SUBSTR
LOWER LENGTH
INITCAP LPAD
Functiile de un singur rind pentru caractere accepta argumente de tip caracter si intorc rezultate de tip caracter sau numeric. Functiile pentru caractere se pot imparti in
Functii de conversie a caracterelor din litere mari in litere mici.
Functii de manipulare a caracterelor
Functie |
Scop |
LOWER (expresie coloana |
Face conversia caracterelor alfabetice in litere mici |
UPPER (expresie coloana |
Face conversia caracterelor alfabetice in litere mari |
INITCAP (expresie coloana |
Face conversia pentru primul caracter din fiecare cuvint in litera mare iar pentru restul caracterelor conversia se face in litere mici |
CONCAT(expresie coloana1, (expresie coloana2) |
Concateneaza prima valoare de tip caracter cu a doua valoare de tip caracter. Aceasta functie este echivalenta cu operatorul de concatenare ( || ) |
SUBSTR(expresie coloana, m/,n/) |
Intoarce un sir de caractere din cadrul valorii de tip caracter incepind cu pozitia m si avind lungimea n. Daca m este negativ atunci pozitia de inceput a numararii se considera a fi ultimul caracter din sir. Daca n este omis atunci functia intoarce toate caracterele de la pozitia m pina la sfirsitul sirului. |
LENGTH(expresie coloana |
Intoarce numarul de caractere dintr-o valoare de tip caracter |
INSTR(expresie coloana,m |
Intoarce pozitia in cadrul valorii de tip caracter a caracterului specificat. |
LPAD(expresie|coloana, n,'sir caractere') |
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 in litere mici.
FUNCTIE |
REZULTAT |
LOWER ('SQL Course') |
sql course |
UPPER ('SQL Course') |
SQL COURSE |
INITCAP ('SQL Course') |
Sql Course |
Functii de conversie a caracterelor
din litere mari in litere mici.
Cele trei functii de conversie a caracterelor sint: LOWER, UPPER, INITCAP.
LOWER: Face conversia in litere mici pentru un text scris cu litere mari si mici
UPPER : Face conversia in litere mari pentru un text scris cu litere mari si mici
INITCAP : Face concersia pentru prima litera din fiecare cuvint in litera mare iar pentru celelalte litere ale cuvintului conversia se face in 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 Clark is manager 14 rows selected.
The job for Blake
is manager
Utilizarea functiilor de conversie a caracterelor din litere mari in litere mici.
Afisati numarul de ordine, numele si departamentul la care lucreaza pentru angajatul Blake.
2 FROM emp
3 WHERE ename = 'blake';
no rows selected
2 FROM emp
3 WHERE LOWER(ename) = 'blake';
7698 BLAKE 30
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 sint
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 intii conversia numelui memorat in tabela din litere mari in litere mici si compara rezultatul obtinut cu numele 'blake'. In acest caz ambii termeni din comparatie sint scrisi cu litere mici si deci de aceasta data se pot selecta informatiile necesare din tabela. Clauza WHERE mai poate fi scrisa ca in 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 in tabela. Pentru a afisa numele cu prima litera convertita in litera mare iar restul in 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 |
REZULTAT |
CONCAT ('Good','String') SUBSTR ('String',1,3) LENGTH ('String') INSTR ('String','r') LPAD (sal,10,'*') |
GoodString Str |
Cele cinci functii pentru manipulat caracatere prezentate in cadrul acestei lectii sint: CONCAT, SUBSTR, LENGTH, INSTR si LPAD.
CONCAT: Concateneaza cei doi parametri. Functia limiteaza numarul parametrilor la 2.
SUBSTR: Extrage un sir de caracter de o lungime spcificata.
LENGTH Intoarce lungimea sirului de caractere (intoarce o valoare numerica
INSTR: Gaseste pozitia caracterului specificat.
LPAD Intoarce un sir de caractere rezultat prin inserarea arg. trei la stinga primului argument lungimea rezultatului avind 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 functiilor pentru manipulat caractere
2 INSTR(ename, 'A')
3 FROM emp
4 WHERE SUBSTR(job,1,5) = 'SALES';
MARTIN MARTINSALESMAN 6 2
ALLEN ALLENSALESMAN 5 1
TURNER TURNERSALESMAN 6 0
WARD WARDSALESMAN 4 2
Exemplul de mai sus afiseaza numele angajatului si slujba sa impreuna, lunginea numelui si pozitia literei A in cadrul numelui, pentru toate persoanele care au functia de vinzator.
Modificati exemplul de mai sus astfel incit instructiunea SQL sa afiseze informatiile despre angajati pentru acele persoane a caror nume se termina in 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 CONCAT(ENAME,JOB) LENGTH(ENAME) INSTR(ENAME,'A')
---------- ----- ----- --------- ------------- ----- ----- ------
MARTIN MARTINSALESMAN 6 2
ALLEN ALLENSALESMAN 5 1
ROUND Rotunjeste valoarea cu un numar specificat de zecimale.
ROUND (45.926,2)
TRUNC: Truncheaza valoare
TRUNC
MOD: Intoarce restul impartirii
MOD
Functii pentru valori numerice - Functiile pentru valori numerice accepta valori numerice si intorc valori numerice. Aceasta sectiune descrie o parte din aceste functii
Funtie |
Scop |
ROUND (coloana | expresie, n) |
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 stinga a punctului zecimal. |
TRUNC (coloana | expresie, n) |
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 stinga a punctului zecimal catre zero |
MOD (m,n) |
Intoarce restul impartirii 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
2 ROUND(45.923,-1)
3 FROM DUAL;
45.92 46 50
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 stinga punctului zecimal
Functia ROUND poate fi utilizata asupra datelor calendaristice.
Veti vedea exemple mai tirziu in cadrul acestei lectii.
NOTA DUAL este o tabela fictiva. Mai multe detali despre acest aspect vor fi oferite mai tirziu.
Utilizarea functiei TRUNC
2 TRUNC(45.923,-1)
3 FROM DUAL;
45.92 45 40
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
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
Functia MOD intoarce restul impartirii dintre valoarea1 si valoarea2. Exemplul de mai sus calculeaza restul impartirii dintre salar si comisionpentru toti angajatii care sint agenti comerciali
Utilizarea datelor calendaristice
Oracle memoreaza datele calendaristice intr 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 intorce data si timpul.
DUAL este o tabela fictiva utilizata pentru a vedea rezultatul intors de SYSDATE.
Formatul implicit pentru date calendaristice este: DD-MON-YY. Valorile valide pentru date calendaristice se situeaza intre Ianuarie 1. 4712 B.C. si Decembrie 31. 9999 A.D.
SYSDATE este o functie care intorce data si timpul curent. Puteti sa utilizati SYSDATE asa cum utilizati orice denumire de coloana. De exemplu puteti afisa data curenta selectind SYSDATE dintr o tabela. Tabela pe care o folositi ramine la latitudinea dumneavoastra. Se poate de exemplu folosi pentru afisarea datei tabela fictiva DUAL.
Tabela DUAL este proprietatea utilizatorului SYS si poate fi accesata de toti utilizatorii. Ea contine o coloana DUMMY, si un rind cu valoarea X. Tabela DUAL este folositoare atunci cind avem de intors o singura valoare
ca de exemplu valoare unei constante, pseudocoloane sau o expresie care nu este derivata dintr-o tabela cu datele utilizatorului.
SQL>
SELECT SYSDATE 2 FROM DUAL;
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 adunind la acea data numarul de ore impartit la 24.
Din moment ce baza de date memoreaza datele calendaristice ca numere, rezulta ca asupra acestor date se pot efectua operatii aritmetice utilizind 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 |
Rezultat |
Descriere |
data + numar |
data |
aduna un numar de zile la o data |
data - numar |
data |
scade un numar de zile dintr-o data |
data - data |
numar de zile |
scade o data din cealalta |
data + numar/24 |
data |
aduna un numar de ore la o data |
Folosirea operatorilor aritmetici cu date calendaristice
2 FROM emp
3 WHERE deptno = 10;
WEEKS
KING 830.93709
CLARK 853.93709
MILLER 821.36566
Exemplul de mai sus prezinta o tabela cu numele angajatilor din departamentul 10 alaturi de perioada in care au fost angajati exprimata in saptamini. Pentru a afiasa perioada angajarii in saptamini se face diferenta intre data curenta (data de SYSDATE) si data la care a fost angajata persoana si apoi se imparte rezultatul la 7.
Nota SYSDATE este o functie SQL ce intoarce data si timpul curent. Rezultatul pe care il obtineti daca probati exemplul poate sa difere de rezultatul de mai sus.
Functii pentru date calendaristice
Functie |
Descriere |
MONTH_BETWEEN |
Intoarce numarul de luni dintre doua date calendaristice. |
ADD_MONTH |
Aduna un numar de saptamini la o data calendaristica |
NEXT_DAY |
Intoarce ziua ce urmeaza datei specificate |
LAST_DAY |
Ultima zi a lunii |
ROUND |
Rotunjeste data calendaristica |
TRUNC |
Truncheaza data calendaristica |
Functiile pentru date calendaristice opereaza asupra datelor calendaristice de tip Oracle. Toate functiile pentru date intorc o valoare de tip data cu exceptia functiei MONTH_BETWEEN, care intoarce o valoare numerica.
MONTH_BETWEEN(data1, data2): Gaseste numarul de luni dintre data1 si data2. Rezultatul poate fi pozitiv sau negativ. Daca data1 este mai tirzie decit data2 atunci rezultatul este pozitiv. Daca data2 este mai tirzie decit data1 atunci rezultatul este negativ. Partea neintreaga a rezultatului reprezinta o parte din luna.
ADD_MONTH(data,n): Aduna un numar de n luni la data. Numarul n trebuie sa fie intreg si poate fi negativ.
NEXT_DAY(data,'char'): Determina data calendaristica a urmatoarei zile specificate, din saptamina, care urmeaza datei "data
LAST_DAY(data): Determina data calendaristica a ultimei zile specificate, din saptamina, care urmeaza datei "data"
ROUND(data[,'fmt']): Intoarce data rotunjita in functie de formatul fmt. Daca fmt este omis atunci data este rotunjita la cea mai apropiata data.
TRUNC(data[,'fmt']): Intoarce data "data" trunchiata in 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 sint tratate mai tirziu in cadrul acestui capitol. Exemple de format sint month si year.
Utilizarea functiilor pentru date calendaristice
MONTH_BETWEEN ('01-SEP-95','11-JAN-94')
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'
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 in 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 TENURE REVIEW NEXT_DAY( LAST_DAY( ----- ----- ------- ----- ----- ---- ----- ----- ---- ----- ----- ---- ----- ----- -------- ----- ----- ------- 7839 17-NOV-81 192.24794 17-MAY-82 20-NOV-81 30-NOV-81 7698 01-MAY-81 198.76407 01-NOV-81 08-MAY-81 31-MAY-81 . 11 rows selected.
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
Functiile ROUND si TRUNC pot fi utilizate atit pentu numere cit si pentru date calendaristice. Atunci cind sint utilizate cu date calendaristice, acestea rotunjesc sau truncheaza data tinind cont de modelul specificat. Astfel se pot , de exemplu, rotunji date calendaristice spre cel mai apropiat an sau cea mai apropiata luna.
Comparati datele in care s-au facut angajari pentru toate persoanele care au inceput sa lucreze in anul 1987. Afisati numarul de ordine al angajatului, data angajarii, si luna in care acesta a inceput sa lucreze exprimata sub forma unui interval, folosind functiile ROUND si TRUNC.
> SELECT empno, hiredate,
2 ROUND (hiredate, 'MONTH'), TRUNC(hiredate, 'MONTH')
3 FROM emp
6 WHERE hiredate like '%87' ;
EMPNO HIREDATE ROUND(HIR TRUNC(HIR ----- ----- ------- ----- ----- ------ ----- ----- ------- ----- ----- ------- 7788 19-APR-87 01-MAY-87 01-APR-87 7876 23-MAY-87 01-JUN-87 01-MAY-87 |
Functii pentru conversia tipului de date
Conversie implicita a tipului dedate Conversie explicita a tipului de date
Pe linga tipurile de date din Oracle, coloanele tabelelor dintr-o baza de date Oracle8 pot fi definite utilizind tipuri de date ANSI, DB2 si SQL DS. Intern server ul Oracle face conversia din aceste tipuri de date in tipuri de date Oracle8
In unele situatii, server ul Oracle accepta anumite tipuri de date desi in mod normal ar trebui sa primeasca alte tipuri. Acest lucru se intimpla atunci cind server ul Oracle poate face automat conversia in tipul de date pe care il 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 tirziu.
Conversiile de date explicite se fac utilizind functii de conversie. Functiile de conversie transforma tipul unei valori in altul. In 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 in mod implicit atunci cind este nevoie, este recomnadat ca aceste conversii sa fie facute implicit de catre utilizator pentru a sigura corectitudinea instructiunilor
Conversii de date implicite In operatii de atribuire Oracle poate automat conversia
DIN |
IN |
VARCHAR2 sau CHAR (sir de caractere |
NUMBER (valoare numerica) |
VARCHAR2 sau CHAR (sir de caractere |
DATE |
NUMBER (valoare numerica) |
VARCHAR2 (sir de caractere |
DATE (data calendaristica |
VARCHAR2 (sir de caractere |
In operatii de atribuire Oracle poate automat conversia
Din VARCHAR2 sau CHAR in NUMBER
Din VARCHAR2 sau CHAR in DATE
Din NUMBER in VARCHAR2
Din DATE in VARCHAR2
Operatia de atribuire are loc cu succes daca server-ul Oracle poate converti tipul de data al sursei in tipul de data al destinatiei.
Conversii de date implicite
In cazul evaluarii expresiilor, Oracle poate automat conversia
DIN |
IN |
VARCHAR2 sau CHAR (sir de caractere |
NUMBER (valoare numerica) |
VARCHAR2 sau CHAR (sir de caractere |
DATE (data calendaristica) |
In cazul evaluarii expresiilor, Oracle poate automat conversia
Din VARCHAR2 sau CHAR in NUMBER
Din VARCHAR2 sau CHAR in DATE
In general server-ul Oracle utilizeaza regulile de conversie pentru expresii in cazul in care regulile de conversie pentru atribuire nu acopera si situatia respectiva.
Nota Conversia din CHAR in NUMBER are loc cu succes doar daca sirul de caractere reprezinta un numar valid. Conversia din CHAR in DATE are loc cu succes doar daca sirul de caractere respecta formatul implicit
DD-MON-YY.
Conversii de date explicite
SQL pune la dispozitie trei functii cu ajutorul carora se pot face conversii dintr un tip de data in altul.
Functie |
Scop |
TO_CHAR (numar data calendaristica, 'fmt' |
Face conversia dintr-un numar sau o data calendaristica intr un sir de caractere de tipul VARCHAR2 respectind formatul fmt specificat. |
TO_NUMBER (caracter) |
Face conversia dintr-un sir de caractere ce contine cifre intr o valoare numerica |
TO_DATE (caracter ,['fmt']) |
Face conversia dint-un sir de caractere ce reprezinta o data intr-o valoare de tip DATE respectind formatul fmt specificat. Daca fmt este omis formatul implicit este DD-MON-YY) |
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 impreuna cu date calendaristice
Modelul de formatare:
Trebuie inclus intre 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
'fmt')
Afisarea datei calendaristice intr-un anumit format
Pina acum toate datele calendaristice au fost afisate respectind formatul DD-MON-YY. Functia TO_CHAR va permite sa faceti conversia din formatul implicit intr un format specificat de dumneavoastra
Trebuie inclus intre 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 in 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 cimp 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';
Elementele ale modelului de formatare pentru date calendaristice
YYYY |
Anul afisat pe 4 digiti |
YEAR |
Anul in litere |
MM |
luna scrisa cu doua cifre |
MONTH |
numele lunii |
DY |
o abreviatie a denumirii unei zile din saptamina formata din trei litere |
DAY |
denumirea completa a zilei |
Element |
Descriere |
SCC sau CC |
Secol:S precede data i.e.n cu |
YYYY sau SYYYY (an in cadrul datelor calendaristice |
Anul: S precede data i.e.n cu |
YYY sau YY sau Y |
Ultimele 3,2 sau 1 cifre din an |
Y,YYY |
O virgula in cadrul anului |
[YYY,[YY,[Y,] |
4,3,2 sau o cifra din an conform standardului ISO |
SYEAR sau YEAR |
Anul in litere :S precede data i.e.n cu |
BC sau AD |
|
B.C. sau A.D. |
|
Q |
Sfertul unui an |
MM |
Luna scrisa cu doua cifre |
MONTH |
Numele intreg al lunii scris pe 9 caractere. Daca denumirea lunii nu ocupa cele 9 caractere, spatiul ramas liber este automat umplut cu spatii |
MON |
O abreviatie a denumirii unei luni formata din trei litere |
RM |
Luna scrisa cu cifre romane |
WW sau W |
Saptamina din an sau luna |
DDD sau DD sau D |
Ziua din an ,luna sau saptamina. |
DAY |
Denumirea completa a zilei completata eventual cu spatii pina la 9 caractere. |
DY |
O abreviatie a denumirii unei zile formata din trei litere |
J |
Numarul de zile de la data de 31 Decembrie 4713BC |
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 inchiderea acestora intre ghilimele
DD "of" MONTH |
12 of OCTOBER |
Adaugati sufixe pentru a scrie in litere un numar
ddspth |
fourteenth |
Modele de formatare pentru timp
Utilizarea functiei TO_CHAR impreuna cu date calendaristice
Utilizati elementele descrise mai jos atunci cind doriti sa afisati timpul intr-un anumit format sau folosind litere in loc de cifre.
Element |
Descriere |
AM sau PM |
indicator de meridian |
A.M. sau P.M. |
indicator de meridian cu puncte |
HH sau HH12 sau HH24 |
ora |
MI |
minute (0 |
SS |
secunde (0-59) |
SSSSS |
Numarul de secunde incepind cu miezul noptii |
Element |
Descriere |
Punctuatia este reprodusa in rezultat. |
|
"of the" |
sirul incadrat intre ]ghilimele este reprodus |
Element |
Descriere |
TH |
Numar de ordine dat in cifre (de exemplu DDTH pentru 4TH) |
SP |
Numar scris in litere (de exemplu DDSP pentru FOUR) |
SPTH sau THSP |
Numar de ordine scris in litere (de exemplu DDSPTH pentru FOURTH) |
Utilizarea functiei TO_CHAR impreuna cu date calendaristice
Exemplul de mai sus prezinta o modalitate de a afisa numele si data angajarii pentru fiecare angajat.( De remarcat este formatul in care se afiseaza data.
Modificati exemplul de mai sus astfel incit 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 HIREDATE ----- ----- ---------- ----- ----- ------------ KING Seventeenth
of November 1981 12:00:00 AM BLAKE First
of May 1981 12:00:00 AM . 14 rows selected
De remarcat este faptul ca denumirea lunii respecta modelul pentru format specificat (INITCAP).
Utilizarea functiei TO_CHAR impreuna cu valori numerice
Reprezinta un numar |
|
Forteaza afisarea unei cifre 0 |
|
Semnul dolar |
|
L |
Foloseste simbolul local pentru moneda |
Afiseaza un punct |
|
Tipareste un indicator pentru mii |
Utilizarea functiei TO_CHAR impreuna cu valori numerice
Atunci cind lucrati cu valori numerice ca siruri de caractere ar trebui sa convertiti acele numere spre valori de tip caracter utilizind functia TO_CHAR, care face conversia dintre o valoare de tip NUMBER spre o valoare de tip VARCHAR2. Aceasta tehnica este folositoare in cadrul unei concatenari
Daca aveti de convertit un numar intr o valoare de tip caracter puteti utiliza urmatoarele elemente.
Element |
Descriere |
Exemplu |
Rezultat |
Pozitie numerica numarul cifrelor de 9 determina lungimea pe care se face afisarea | |||
Afiseaza zerourile nesemnificative | |||
Semnul dolar | |||
L |
Foloseste simbolul local pentru moneda |
L999999 |
FF1234 |
Determina afisarea unui punct zecimal in pozitia specificata. | |||
Determina afisarea unei virgule in pozitia specificata. | |||
MI |
Determina afisarea semnului minus in partea dreapta (pentru valori negative) |
999999MI | |
PR |
Inchide intre paranteze numerele negative |
999999PR |
<1234> |
EEEE |
Notatie stiintifica formatul impune existenta a patru litere E |
99.999EEEE |
1.234E |
V |
Inmultire cu 10 de n ori (n=numarul de cifre de 9 de dupa litera V) |
9999V99 | |
B |
Inlocuieste valorile de 0 cu blank |
B9999.99 |
Utilizarea functiei TO_CHAR impreuna cu valori numerice
Observatii
Server-ul Oracle afiseaza semnul in 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 intr un numar folositi functia TO_NUMBER
Pentru a face conversia dintr-un sir de caractere intr-o data calendaristica folositi functia TO_DATE
Este posibil sa apara o situatie in care doriti sa faceti conversia dintr un sir de caractere intr-un numar sau intr 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.
Afisati numele si data angajarii pentru toate persoanele care au fost angajate pe February
Formatul RR pentru date calendaristice
Anul curent |
Data specificata |
Formatul RR |
Formatul YY |
27-OCT-95 | |||
27-OCT-17 | |||
27-OCT-17 | |||
27-OCT-95 |
Daca cele doua cifre specificate ale anului sint |
|||
Daca cele doua cifre ale anului curent sint |
Data intoarsa se incadreaza in secolul curent |
Data intoarsa se incadreaza in secolul de dinaintea celui curent |
|
Data intoarsa se incadreaza in secolul de dupa secolul curent |
Data intoarsa se incadreaza in secolul curent |
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 in locul elementului YY si astfel secolul valorii returnate variaza in functie de cei doi digiti specificati in an si de ultimii doi digiti ai anului curent. Tabelul urmator descrie comportamentul elementului RR.
Anul curent |
Data specificata |
Formatul RR |
Formatul YY |
-OCT-95 | |||
27-OCT-17 | |||
27-OCT-17 |
Converteste o valoare nula intr o valoare efectiva
Tipurile de date care pot fi folosite sint: 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)
Pentru a face conversia intre o valoare nula si o valoare efectiva utilizati functia NVL.
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 impreuna cu orice tip de data, dar tipul valorii intoarse este de fiecare data la fel cu tipul parametrului expr1.
Tip de data |
Exemplu de conversie |
NUMBER |
NVL (coloana ce contine o valoare de tip numeric |
DATE |
NVL (coloana ce contine o valoare de tip data calendaristica, '01-JAN-95') |
CHAR sau VARCHAR2 |
NVL (coloana ce contine o valoare de tip caracter,'Unavariable') |
Utilizarea functiei NVL
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. . 14 rows selected. |
Functia NVL
Pentru a calcula compensatia anuala pentru toti angajatii, trebuie sa inmultiti 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. . 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 intilneste pe colana o valoare nula atunci rezultatul este nul. Pentru a calcula valorile pentru toti angajatii trebuie sa convertiti valorile nule in valori numerice inainte de a aplica operatorul aritmetic. O solutie corecta pentru o astfel de problema este prezentata in exemplul precedent celui luat in discutie, exemplu in care pentru conversia valorilor nule s-a folosit functia NVL.
[, search2, result2,,]
[, default])
Functia DECODE evalueaza o expresie intr-un mod similar structurii IF-THEN-ELSE, structura folosita in 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 in search atunci valoarea result este intoarsa. Daca valoarea default implicita) este omisa functia va intoarce o valoare nula in cazul in care valoarea expresiei nu se potriveste cu nici o valoare search.
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;
PRESIDENT 5000 5000
MANAGER 2850 3420
MANAGER 2450 2940
14 rows selected.
Utlizarea functiei DECODE
In 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.
Aceeasi structura scrisa cu IF-THEN-ELSE are urmatoarea forma
IF job =
'ANALIST' THEN sal = sal * 1.1 IF job =
'CLERK' THEN sal = sal * 1.15 IF job =
'MANAGER' THEN sal = sal * 1.20 ELSE sal = sal
Imbricarea functiilor
Functiile de un singur rind se pot imbrica de cite ori dorim. Evaluarea lor se face din centrul expresiei imbricate spre exteriorul acesteia. Exemplele care urmeaza va vor demonstra flexibilitatea acestor functii.
2 NVL(TO_CHAR(mgr),'No Manager')
3 FROM emp
4 WHERE mgr IS NULL;
ENAME NVL(TO_CHAR(MGR),'NOMANAGER') KING No Manager
Imbricarea functiilor (continuare)
Exemplul de mai sus afiseaza acele persoane care nu are au superior. Evaluarea instructiunii SQL se realizeaza in doi pasi.
1. Evaluarea functiei din interior ce face conversia dintr-o valoare numerica in una de tip caracter.
- Rezultat1=TO_CHAR (mgr)
2. Evaluarea functiei din exterior care inlocuieste valorile nule cu un text
- NVL (Rezultat1, 'No Manager')
Denumirea coloanei este data de intreaga expresie din moment ce nu este specificat nici un alias pentru acea coloana.
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 in cazul in care
aveti de facut calcule asupra unor date calendaristice
Modificarea unor articole individuale
Manipularea iesirii pentru grupuri de rinduri
Stabilirea unui format pentru date calendaristice si numere atunci cind acestea sint tiparite pe ecran
Schimbarea tipului de data a unei coloane
Functii de un singur rind
Functiile de un singur rind se pot imbrica de cite ori dorim. Cu ajutorul functiilor de un singur rind putem manipula
Date de tip caracter
- LOWER, UPPER, INITCAP, CONCAT, SUBSTR, INSTR, LENGTH
Date de tip numeric
- ROUND, TRUNC, MOD
Date calendaristice
- MONTHS_BETWEEN, ADD_MONTH, NEXT_DAY, LAST_DAY, ROUND, TRUNC
- valorile de tip data calendaristica pot fi utilizate impreuna 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 intoarce data si
timpul curent. . Tabela pe care o folositi ramine la
latitudinea dumneavoastra. Se poate de exemplu folosi pentru afisarea datei
tabela fictiva DUAL.
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 sint scrise cu litere mari sau mici
Realizarea unor calcule asupra anilor si lunilor de angajare ale unor persoane
Determinare datei cind se recalculeaza salariul pentru un angajat.
Privire generala asupra exercitiilor
Exercitiile ce urmeaza sint astfel concepute incit sa aveti posibilitatea sa puneti in 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 in cazul functiilor imbricate evaluarea se face incepind cu functia din interior si terminind 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%(intr-un singur numar Denumiti ultima coloana Salar Nou. Salvati instructiunea intr-un fisier numit p3q2.sql
3.Rulati programul salvat anterior
4. Modificati programul salvat in fisierul p3q2.sql astfel incit acesta sa adauge o coloana in care veti trece difereta dintre salariul nou si cel vechi. Denumiti coloana Crestere. Rulati noul program.
5. Afisati numele angajatului, data angajarii, data cind se recalculeaza salariul, care este prima luni dupa 6 luni de servici. Denumiti coloana REVIEW. Formatati afisarea datei astfel incit 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 intre 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> cistiga <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 stinga 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 saptamina in care angajatul a inceput lucrul. Denumiti coloana ZI.
Ordonati rezultatul dupa cimpurile coloanei ZI incepind cu Monday (Luni).
11. Scrieti o interogare care sa afiseze numele angajatului si valoarea comisionului. Daca angajatii nu obtin comision introduce-ti No commission". Denumiti coloana COMM.
Copyright © 2024 - Toate drepturile rezervate