Functiile pot fi folosite pentru:
Exista diferite tipuri de functii:
Unele functii opereaza pe un singur sir , altele pe grupuri de siruri.
Cele mai folosite functii sunt prezentate in acest manual. Puteti recurge la SQL*Plus REFERENCE GUIDE pentru lista completa a functiilor.
Functiile care se aplica unui singur sir vor fi discutate in
capitolul prezent si in cap.5.Functiile de grup vor fi tratate
in cap.6.
Functii care se aplica unui singur sir.
Explicatia notatiei:
Notatie + Semnificatie:
Urmatoarele functii prezentate sunt:
Pentru a afisa cu litere mici numele departamentului ca si sirul ' SQL COURSE' introduceti:
SELECT LOWER (DNAME),LOWER('SQL course')
FROM DEPT;
LOWER(DNAME) LOWER(SQL COURSE)
------------------------------------
research sql course
sales sql course
operations sql course
accounting sql course
In urmatorul exemplu , functia UPPER e folosita pentru a forta intrarea utilizatorului la litere mari.
SELECT ENAME
FROM EMP
WHERE ENAME =UPPER('&ENAME');
Enter value for ename :smith
ENAME
-----
SMITH
Pentru afisarea numelor departamentelor si locatiile , introduceti:
SELECT INITCAP(DNAME), INITCAP(LOC)
FROM DEPT;
INITCAP(DNAME) INITCAP(LOC)
----------------------------
Accounting New York
Research Dallas
Sales Chicago
Operations Boston
SELECT CONCAT (ename,job) "JOB"
FROM EMP
WHERE EMPNO =7900;
JOB
-----------
JAMESCLERK
Functiile LPAD si RPAD aduc sirurile de caractere la o lungime specificata.
SELECT LPAD(DNAME,20,'*'),LPAD(DNAME,20),LPAD(DEPTNO,20,'.')
FROM DEPT;
LPAD(DNAME,20,'*') LPAD(DNAME,20) LPAD(DEPTNO,20,'.')
------------------------------------------------------------
************RESEARCH RESEARCH.....................20
***************SALES SALES.....................30
**********OPERATIONS OPERATIONS.....................40
**********ACCOUNTING ACCOUNTING.....................10
Observati ca a doua coloana e completata in stinga cu spatii,
implicit , si ca a treia coloana este de tipul numar.
SELECT RPAD(DNAME,20,'*'),RPAD(DNAME,20),RPAD(DEPTNO,20,'.')
FROM DEPT;
RPAD (DNAME,20,'*') RPAD(DNAME,20) RPAD(DEPTNO,20,'.')
------------------------------------------------------------
RESEARCH************ RESEARCH 20..................
SALES*************** SALES 30..................
OPERATIONS********** OPERATIONS 40..................
ACCOUNTING********** ACCOUNTING 10..................
In acest caz a doua coloana are in dreapta blancuri puse implicit.
Urmatoarele functii presupun ca caracterele din string sunt numerotate de la stinga la dreapta , incepind cu 1.
Urmatorul exemplu afiseaza urmatoarele "substringuri":
SELECT SUBSTR('ORACLE',2,4),SUBSTR(DNAME,2),
SUBSTR(DNAME,3,5)
FROM DEPT;
SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5)
---------------------------------------------------------
RACL ESEARCH SEARC
RACL ALES LES
RACL PERATIONS ERATI
RACL CCOUNTING COUNT
Observati ca valorile sint aliniate la stinga.Aceasta deoarece SQL*Plus intotdeauna afiseaza de la stinga, implicit.
SELECT DNAME,INSTR(DNAME,'A'),
INSTR(DNAME,'ES'),INSTR(DNAME,'C',1,2)
FROM DEPT;
DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2)
---------------------------------------------------------------------
ACCOUNTING 1 0 3
RESEARCH 5 2 0
SALES 2 4 0
OPERATIONS 5 0 0
O folosire obisnuita a lui INSTR este de a determina daca inceputul
utilizatorului contine un caracter particular sau mai multe. In
exemplul anterior , de exemplu, expresia INSTR(DNAME,'ES') e 0
pentru ACCOUNTING deoarece acesta nu contine sirul dat.
LTRIM si RTRIM sterg caracterele specificate din sir.
SELECT DNAME,LTRIM(DNAME,'A'),LTRIM(DNAME,'AS'),
LTRIM(DNAME,'ASOP')
FROM DEPT;
DNAME LTRIM(DNAME,'A') LTRIM(DNAME,'AS') LTRIM(DNAME,'ASOP')
-------------------------------------------------------------------
RESEARCH RESEARCH RESEARCH RESEARCH
SALES SALES LES LES
OPERATIONS OPERATIONS OPERATIONS ERATIONS
ACCOUNTING CCOUNTING CCOUNTING CCOUTING
SELECT DNAME, RTRIM(DNAME,'G'),RTRIM(DNAME,'GHS')
RTRIM(DNAME,'N')
FROM DEPT;
DNAME RTRIM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N')
---------------------------------------------------------------
RESEARCH RESEARCH RESEARC RESEARCH
SALES SALES SALE SALES
OPERATIONS OPERATIONS OPERATION OPERATIONS
ACCOUNTING ACCOUNTIN ACCOUNTIN ACCOUNTING
RTRIM poate fi in mod particular folositor in a sterge blancurile de la sfirsit la coloane.De exemplu , presupunind ca in transferul datelor la tabela 'emp' blancurile au fost adaugate neintentionat dupa fiecare ENAME.Urmatoarea comanda va sterge toate blancurile finale:
UPDATE EMP
SET ENAME =RTRIM(ENAME);
Observatie: comanda UPDATE e tratata complet mai tirziu.
SELECT ENAME, SOUNDEX(ENAME)
FROM EMP
WHERE SOUNDEX(ENAME) = SOUNDEX('FRED');
ENAME SOUNDEX(ENAME)
-----------------------------
FORD F630
SELECT LENGTH('SQL COURSE'),LENGTH(DEPTNO),LENGTH(DNAME)
FROM DEPT;
LENGTH('SQLCOURSE') LENGTH(DEPTNO) LENGTH(DNAME)
-------------------------------------------------
10 2 8
10 2 5
10 2 10
10 2 10
Observati ca LENGTH la fel ca si functia INSTR intoarce o valoare numerica.
Functiile TRANSLATE si REPLACE sunt folosite pentru substitutia caracterelor.
TRANSLATE(col/value,from,to) translateaza la iesire caracterele
'from' la cele 'to'.Mai mult de un caracter , se poate potrivi.
Toate operatiile lui 'from' sunt inlocuite de corespondentul din 'to'.
Daca caracterul corespunzator din 'to'nu e rezervat , caracterul din
'from'e sters(vezi functiile imbricate).
SELECT ,ENAME,TRANSLATE(ENAME,'C','P'),JOB
TRANSLATE(JOB,'AR','IT')
FROM EMP
WHERE DEPTNO=10;
ENAME TRANSLATE(ENAME,'C','P') JOB TRANSLATE(JOB,'AR','IT')
-----------------------------------------------------------------
CLARK PLARK MANAGER MINIGET
KING KING PRESIDENT PTESIDENT
MILLER MILLER CLERK CLETK
SELECT JOB , REPLACE(JOB,'SALESMAN','SALESPERSON'),
ENAME ,REPLACE(ENAME,'CO','PX')
FROM EMP;
JOB REPLACE(JOB,'SALESMAN','SALESPERSON') ENAME REPLACE(ENAME,'CO','PX') -------------------------------------------------------------------ANALYST ANALYST SCOTT SPXTT SALESMAN SALESPERSON TURNER TURNER SALESMAN SALESPERSON ALLEN ALLEN MANAGER MANAGER CLARK CLARK
Functia REPLACE suplimenteaza functionalitatea furnizata de functia
TRANSLATE.TRANSLATE furnizeaza caractere singulare , unul cite unul ,
pentru substitutie.REPLACE va permite sa substituiti un sir cu altul
ca si sa stergeti un sir (daca nu specificati 'replacement _string').
Observati ca 'string' si 'replacement_string' pot fi de orice lungime.
REPLACE poate sa faca si conversia caracter la caracter REPLACE('C',
IP).
FUNCTII IMBRICATE
Functiile singulare aplicate liniilor(sirurilor) pot fi imbricate la
orice adincime.Daca functiile sunt imbricate, ele sunt evaluate din
interior spre exterior.
Sa presupunem ca vreti sa aflati nr. de ori in care un caracter apare intr-un sir.Cum veti proceda? Puteti imbrica functiile LENGHT si TRANSLATE pentru a obtine rezultatul dorit. Urmatorul exemplu va permite sa numarati de cite ori apare S intr-un sir.
SELECT DNAME,LENGTH(DNAME),LENGTH(DNAME) LENGTH(TRANSLATE(DNAME,'AS,'A')) FROM DEPT; DNAME LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A')) -------------------------------------------------------------------------- RESEARCH 8 1 SALES 5 2 OPERATIONS 10 1 ACCOUNTING 10 0
Pasii pentru a obtine rezultatul sunt:
SELECT TRANSLATE(DNAME,'AS','A') FROM DEPT; TRANSLATE(DNAME,'AS',A') ------------------------ REEARCH ALE OPERATION ACCOUNTING
O tehnica alternativa este de a folosi functia REPLACE.
SELECT DNAME, LENGTH(DNAME), LENGTH(REPLACE(DNAME,'S'))
FROM DEPT;
DNAME LENGTH(DNAME) ENGTH(REPLACE(DNAME,'S'))
----------------------------------------------------
ACCOUTING 10 10
RESEARCH 8 7
SALES 5 3
OPERATIONS 10 9
SELECT DNAME,LENGTH(DNAME), LENGTH(DNAME)
LENGTH(REPLACE(DNAME,'S'))
FROM DEPT;
DNAME LENGTH(DNAME) LENGTH(DNAME)-LENGTH(REPLACE(DNAME,'S'))
-------------------------------------------------------------------
ACCOUTING 10 0
RESEARCH 8 1
SALES 5 2
OPERATIONS 10 1
SELECT ROUND(45.923,1),
ROUND(45.923),
ROUND(45.323,1),
ROUND(42.323,-1),
ROUND(SAL/32,2)
FROM EMP
WHERE DEPTNO =10;
ROUND(45.923,1)ROUND(45.923)ROUND(45.323,1)Round(42.323,-1)ROUND(SAL/32,2)
------------------------------------------------------------------------
45.9 46 45.3 40 76.56
45.9 46 45.3 40 156.23
45.9 46 45.3 40 40.63
TRUNC(col/value,n) trunchiaza coloana sau valoarea la n zecimale, sau
daca nu e om is , fara zecimale.Daca n e negativ , numarul din stinga
punctului zecimal e trunchiat la zero.
SELECT TRUNC(45.923,1),
TRUNC(45.923),
TRUNC(45.323,1),
TRUNC(42.323,-1),
TRUNC(SAL/32,2)
FROM EMP
WHERE DEPTNO= 10;
TRUNC(45.923,1)TRUNC(45.923)TRUNC(45.323,1)TRUNC(42.323,-1)TRUNC(SAL/32,2)
----------------------------------------------------------------------------
45.9 45 45.3 40 76.56
45.9 45 45.3 40 156.25
45.9 45 45.3 40 40.62
CEIL (col/value) gaseste cel mai mic intreg mai mare sau egal cu coloana,
expresie sau valoare.
SELECT CEIL(SAL),CEIL(99.9),CEIL(101.76),CEIL(-11.1)
FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;
CEIL(SAL) CEIL(99.9) CEIL(101.26) CEIL(-11.1)
-------------------------------------------------
3000 100 102 -11
5000 100 102 -11
3000 100 102 -11
FLOOR (col/value) gaseste cel mai mare intreg mai mic sau egal cu
coloana expresie sau valoare.
SELECT FLOOR(SAL), FLOOR(99.9),FLOOR(101.76),FLOOR(-11.1)
FROM EMP
WHERE FLOOR(SAL) BETWEEN 3000 AND 5000;
FLOOR (SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1)
-----------------------------------------------------
3000 99 101 -12
5000 99 101 -12
3000 99 101 -12
POWER(col/value,n) ridica coloana, expresia sau valoarea la
puterea n. Poate fi negativa.
SELECT SAL,POWER(SAL,2), POWER(SAL,3), POWER(50,5)
FROM EMP
WHERE DEPTNO=10;
SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5)
----------------------------------------------
2450.00 6002500 14706125000 312500000
5000.00 25000000 125000000000 312500000
1300.00 1690000 2197000000 312500000
EXP(n) intoarce e ridicat la puterea n
e=2.71828183.
SELECT EXP(4)
FROM DUAL;
EXP(4)
------
54.59815
SQRT(col/value) gaseste radacina patrata a coloanei sau valorii.
Daca col/value e NULL sau negativ atunci e
intors rezultatul NULL.
SELECT SAL, SQRT(SAL),SQRT(40), SQRT(COMM)
FROM EMP
WHERE COMM>0;
SAL SQRT(SAL) SQRT(40) SQRT(COMM)
-----------------------------------------------
1600.00 40 6.32455532 17.3205081
1250.00 35.3553391 6.32455532 22.3606798
1250.00 35.3553391 6.32455532 37.4165739
SIGN(col/value) intoarce -1 daca e coloana, expresie sau valoare e
un nr. negativ , intoarce 0 daca e zero,+1 daca e
nr.pozitiv.
SELECT SAL -COMM,SIGN(SAL-COMM),COMM-SAL, SIGN(COMM-SAL)
FROM EMP
WHERE DEPTNO=30;
SAL-COMM SIGN(SAL-COMM) COMM-SAL SIGN(COMM-SAL)
---------------------------------------------------
1300 1 -1300 -1
750 1 -750 -1
- 150 -1 150 1
1500 1 -1500 -1
Frecvent , functia SIGN este folosita pentru a testa daca o valoare
este mai mica ca , mai mare ca sau egala cu a doua valoare.
Urmatorul exemplu tipareste toti angajatii al caror salariu este
mai mare decit comisionul lor.
SELECT ENAME ,SAL,COMM
FROM EMP
WHERE SIGN (SAL-COMM)=1;
ENAME SAL COMM
-----------------------------
ALLEN 1600 300
WARD 1250 500
TURNER 1500 0
ABS(col/value) gaseste valoarea absoluta a coloanei sau valorii.
SELECT SAL,COMM,COMM-SAL,ABS(COMM-SAL),ABS(-35)
FROM EMP
WHERE DEPTNO =30;
SAL COMM COMM-SAL ABS(COMM-SAL) ABS(-35)
-------------------------------------------------------
1600.00 300.00 -1300 1300 35
1250.00 500.00 -750 750 35
1250.00 1400.00 150 150 35
2850.00 35
1500.00 00 -1500 1500 35
950.00 35
MOD(value1,value2) gaseste restul impartirii lui 'value1'la 'value2'.
SELECT SAL , COMM , MOD(SAL,COMM), MOD(100,40)
FROM EMP
WHERE DEPTNO =30
ORDER BY COMM;
SAL COMM MOD(SAL,COMM) MOD(100,40)
--------------------------------------------------------
2,850.00 20
950.00 20
1,600.00 300.00 100 20
1,250.00 500.00 250 20
1,250.00 1,400.00 1250 20
1,500.00 00 1500 20
Alte citeva functii matematice:
1. Listati pentru toti angajatii numele si salariul marit cu
15 % si exprimat ca un nr. de dolari.
DEPTNO ENAME PCTSAL
---------------------------
20 SMITH 920
30 ALLEN 1840
30 WARD 1438
20 JONES 3421
30 MARTIN 1438
30 BLAKE 3278
10 CLARK 2818
20 SCOTT 3450
10 KING 5750
30 TURNER 1725
20 ADAMS 1265
30 JAMES 1093
20 FORD 3450
10 MILLER 1495
14 selectate.
2. Obtineti urmatoarea iesire:
EMPLOYEE_AND_JOB
----------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
3. Obtineti urmatoarea iesire
EMPLOYEE
--------
SMITH(Clerk)
ALLEN(Salesman)
WARD(Salesman)
JONES(Manager)
MARTIN(Salesman)
BLAKE(Manager)
CLARK(Manager)
SCOTT(Analyst)
KING(President)
TURNER(SAlesman)
ADAMS(Clerk)
JAMES(Clerk)
FORD(Analyst)
MILLER(Clerk)
4. Faceti o cautare pentru a obtine o lista a angajatilor cu
functia 'job' specificata de utilizator.
Enter value for job :clerk
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
-----------------------------------------------------------
7369 SMITH CLERK 7902 17-DEC-80 1000 20
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
7900 JAMES CLERK 7698 03-DEC-81 1092.5 30
7934 MILLER CLERK 7782 23-JAN-82 1300 10
5. S- a descoperit ca nu toti angajatii din departamentul 30
sunt barbati .Obtineti urmatoarea iesire:
ENAME DEPTNO JOB
----------------------------
ALLEN 30 Salesperson
WARD 30 Salesperson
MARTIN 30 Salesperson
BLAKE 30 Manager
TURNER 30 Salesperson
JAMES 30 Clerk
1. SELECT DEPTNO,ENAME, ROUND(SAL*1.15) PCTSAL
FROM EMP;
2. SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPLOYEE_AND_JOB
FROM EMP;
3. SELECT ENAME ||'('||initcap(job)||')' EMPLOYEE
FROM EMP;
4. SELECT *
FROM EMP
WHERE UPPER(JOB)=UPPER('&JOB');
5. SELECT ENAME,DEPTNO,INITCAP
(REPLACE(JOB,'SALESMAN','SALESPERSON')) JOB
FROM EMP
WHERE DEPTNO =30;