Sunteți pe pagina 1din 45

CAPITOLUL 3.

ELEMENTELE DE BAZ ALE


LIMBAJULUI SQL*PLUS
3.1. DESPRE LIMBAJ
n 1974 a fost lansat proiectul System/R de ctre firma IBM. Tot n
acest an a aprut limbajul structurat de programare SEQUEL (Structured
English as Query Language) autori fiind Chamberlin i Boyce.
n 1976 apare un nou limbaj SEQUEL 2 care a fost declarat limbajul
de interogare al SGBD System/R. Denumirea limbajului este schimbat de
Chamberlin n SQL (Structured Query Language) n anul 1980.
Ulterior limbajul a fost perfecionat fiind considerat cel mai
rspndit limbaj de interogare a bazelor de date relaionale.
Institutul Naional pentru Standarde n anul 1982 a lansat un proiect
de lucru pentru standardizarea limbajelor de interogare care a fost finalizat
n 1986 aprnd standardul ANSI SQL-86. Acesta definete comenzile de
baz ale SQL, dar nu conine partea de actualizare i acordarea drepturilor
de acces la o baz de date.
Prin revizuire acest limbaj apare n 1989 SQL-1 ca fiind limbajul
fundamental al SGBD ralaionale.
n 1992 apare versiunea SQL-2 care ofer noi faciliti cum ar fi:
jonciune extern, implementarea restriciei refereniale, modificarea
schemei bazei de date, etc.
Cel mai recent standard este SQL-3 care a fost lansat n anul 1999,
acesta este considerat un limbaj complet n vederea definirii i gestiunii
obiectelor complexe. Se consider c prin publicarea standardului propus n
acest an a fost depit bariera relaionalului, el fiind mult mai mult dect un
instrument de consultare a bazelor de date.
3.2. CONCEPTE UTILIZATE
SQL*PLUS este un limbaj neprocedural i opereaz asupra datelor
normalizate. Conceptele necesare a fi cunoscute pentru lucrul cu acest
limbaj sunt: tabel, cheie primar, coloan, rnd, viziune, index, sinonim,
cluster, baz de date relaional, comanda, blocul, cererea,raportul etc.
Tabela sau relaia este un ansamblu format din n coloane
(atribute/subansambluri) i m rnduri (tupluri/linii) care respect
urmtoarele condiii minime: nu conine date la nivel agregat (valorile aflate
la intersecia liniilor cu coloanele s fie la un nivel elementar); liniile sunt
distincte unele fa de altele; nu conine coloane repetitive n descriere.

Cheia primar este un atribut care are valori distincte. Deci, fiecare
linie se identific printr-o valoare distinct. Dou sau mai multe atribute
care pot fi chei primare se numesc chei candidate.
Coloana tabelei este format din valorile pe care le ia atributul n
liniile tabelei respective.
Rndul/tuplul/linia este format din valorile coloanelor ce se refer la
o entitate a tabelei.
Baza de date relaional este un ansamblu de tabele normalizate,
grupate n jurul unui subiect, n principiu, bine definit. ntr-o baz de date
relaional, entitile i legturile sunt transpuse n tabele.
Viziunea este o tabela logic i reprezint o fereastr la date, dintruna sau mai multe tabele.
Pentru ca accesul la date sa se fac mai rapid, se utilizeaz
indexarea. Un index reprezint o cheie pe una sau mai multe coloane.
Indexarea este dinamic deoarece se pot adaug sau terge indeci oricnd,
fr ca datele memorate sau aplicaiile scrise s fie afectate.
Pentru realizarea unor operaii sau pentru a utiliza n cereri nume
mai scurte, se pot defini sinonime ale unor nume de tabele sau viziuni.
Un cluster reprezint o anumit modalitate de grupare a rndurilor
uneia sau mai multor tabele. Aceast grupare mrete viteza de execuie a
unor operaii consumatoare de timp.
Comanda este o instruciune emis din SQL*Plus ctre o baz de
date Oracle.
Blocul reprezint un grup de instruciuni SQL i PL/SQL.
Cererea este o comanda SQL (SELECT) care regsete date din
baza de date. Rezultatul cererii l formeaz datele regsite din baza de date.
Raportul este rezultatul cererii formatat cu ajutorul comenzilor
SQL*Plus.
Numele unei baze de date, al unei tabele, coloane sau variabile
utilizator trebuie s aib lungimea ntre 1 i 30 caractere. Un nume nu poate
conine apostrofuri. Cu att mai puin, un nume utilizat ntr-o comand nu va
fi introdus ntre apostrofuri. Literele mici i mari sunt echivalente (nu se
face distincia ntre literele mici i mari). Un nume trebuie s nceap cu o
liter, s conin numai anumite caractere (A-Z, 0-9, $, #, @, -), s nu
duplice numele unui alt obiect de acelai tip i s difere de un cuvnt
rezervat ORACLE.
Cuvintele rezervate nu pot fi utilizate ca nume de tabele, coloane sau
orice alte obiecte definite de utilizator. Ele sunt prezentate n Anexa 1.

3.3. FUNCII SQL


Funciile se apeleaz prin sintaxa:
Nume_funcie (argument1, argument2, )
Funciile SQL sunt cu un singur rnd sau scalare (returneaz un
singur rezultat pentru fiecare rnd al cererii emise asupra unei tabele sau
vederi) i cu mai multe rnduri numite funcii grup sau agregate (returneaz
un singur rezultat pentru un grup de rnduri regsite dintr-o tabel sau
vedere).
A. Funciile SQL cu un singur rnd (funciile scalare)
Acestea sunt funcii: numerice, caracter, de tip DATE, de conversie
i alte funcii.
1) Funciile numerice accept valori numerice i returneaz
rezultate numerice i sunt prezentate n tabelul 3.1. Tabela DUAL folosit n
exemple, este creat automat de ctre Oracle odat cu crearea dicionarului
de date i se afl n schema utilizatorului SYS, dar cu acest nume este
accesibil tuturor utilizatorilor unei baze de date Oracle. Ea are o singur
coloan numit DUMMY cu tipul de date VARCHAR2(1) i un singur rnd
cu valoarea 'X'. Seleciile din tabela DUAL sunt utile pentru calcularea unor
expresii constante cu comanda SQL SELECT. Din cauz c are un singur
rnd, constanta este returnat o singur dat. Alternativ pentru aceeai
activitate se poate selecta o constant, pseudocoloan sau o expresie din
orice tabel.
Tabelul 3.1 Funciile numerice
Funcia
ABS(n)

Rolul funciei
Returneaz valoarea absolut
a numrului n.

ACOS(n)

Arc cosinus de n. Rezultatul


este exprimat n radiani.

ASIN(n)

Arc sinus de n.

ATAN

Arc tangent de n.

Exemple
SELECT ABS(-15) "Absolut"
FROM DUAL;
Absolut
---------15
SELECT COS(.3)"Arc_Cosinus"
FROM DUAL;
Arc cosinus
---------1.26610367
SELECT ASIN(.3) "Arc_Sinus"
FROM DUAL;
Arc_Sinus
---------.304692654
SELECT ATAN(.3) "Arc_Tangent"
FROM DUAL;

ATAN2

Arc tangent de n i m sau


arc tangent de n/m. Deci
ATAN2(n,m) este identic cu
ATAN2(n/m).

CEIL(n)

Retureaz numrul ntreg cel


mai mic care este mai mare
sau egal cu n.

COS(n)

Cosinus de n.

COSH(n)

Cosinus hiperbolic de n.

EXP(n)

Returneaz o valoare egal


cu e ridicat la puterea n, unde
e = 2.71828183.

FLOOR(n)

Returneaz numrul cel mai


mare care este mai mic sau
egal cu n.

LN(n)

Returneaz logaritmul
natural de n, unde n > 0.

LOG(m,n)

Returneaz logaritm n baza


m de n.(LOGmn)

MOD(m,n)

Returneaz restul mpririi

Arc_Tangent
---------.291456794
SELECT ATAN2(.3,.2) Arc_Tangent2"
FROM DUAL;
Arc_Tangent2
-----------.982793723
SELECT CEIL(15.7) "NUMR"
FROM DUAL;
NUMR
---------16
SELECT COS(180 * 3.14/180)
"Cosinus de 180 grade"
FROM DUAL;
Cosinus de 180 grade
---------------------1
SELECT COSH(0) "Cosinus
hiperbolic de 0"
FROM DUAL;
Cosinus hiperbolic de 0
---------------------1
SELECT EXP(4) "e la puterea 4"
FROM DUAL;
e la puterea 4
-----------------54.59815
SELECT FLOOR(15.7) "Floor"
FROM DUAL;
Floor
---------15
SELECT LN(95) "Logaritm natural de
95"
FROM DUAL;
Logaritm natural de 95
----------------4.55387689
SELECT LOG(10,100) "Log n baza
10 de 100"
FROM DUAL;
Log n baza 10 de 100
-----------------2
SELECT MOD(11,4) "Modulo 4"

POWER (n,m)

ROUND
(n[,m])

SIGN(n)

SIN(n)

SINH

lui m la n. Dac n este 0


returneaz valoarea m.
Aceast funcie se comport
diferit fa de funcia modulo
clasic din matematic,
atunci cnd m este negativ.
Avnd n vedere semnificaia
funciei MOD funcia modulo
clasic din matematic se
poate exprima cu formula :
m - n * FLOOR(m/n)
Returneaz o valoare egal
cu m la puterea n.

Returneaz n rotunjit la un
numr de m yecimale. Dac
m este omis se elimin
zecimalele, iar dac este
negativ se face rotunjirea
numrului din dreapta
virgulei zecimale, dup
regula: m = -1 rotunjire la
nivel de zeci, m = -2 rotunjire
la nivel de sute i aa mai
departe.

Returneaz semnul numrului


n, dup regula:
n<0 returneaz valoarea -1;
n=0 returneaz valoarea 0;
n>0 returneaz valoarea +1.
Returneaz sinus de n n
radiani.

Returneaz sinus hiperbolic

FROM DUAL;
Modulo 4
---------3 2.

SELECT POWER(3,2) "Putere"


FROM DUAL;
Putere
---------9
SELECT ROUND(15.193,1)
"Rotunjire"
FROM DUAL;
Rotunjire
---------15.2
SELECT ROUND(15.193,-1)
"Rotunjire "
FROM DUAL;
Rotunjire
---------20
Aici rotunjirea s-a fcut la nivel de
zeci, cci scala negativ nseamn
rotunjirea valorii din drepta semnului
zecimal, iar scala pozitiv nseamn
rotunjirea numrului din dreapta
semnului zecimal la ordinul de mrime
ct este scala.
SELECT SIGN(-15) "Semn"
FROM DUAL;
Semn
----------1
SELECT SIN(30 * 3.14159265359/180)
"Sinus de 30 de grade"
FROM DUAL;
Sinus de 30 de grade
-----------------.5
SELECT SINH(1) " Sinus hiperbolic de

de n.

SQRT(n)

Returneaz rdcin ptrat


din n.

TAN(n)

Returneaz tangent de n.

TANH(n)

Returneaz tangent
hiperbolic de n.

TRUNC (n,m)

Returneaz valoarea lui n


trunchiat la un numr de
zecimale egal cu m. Dac m
este omis se elimin valorile
zecimale, iar dac ia o
valoare negativ trunchiere
se aplic prii din stnga
virgulei zecimale, dup
regula: m = -1 rotunjire la
nivel de zeci, m= -2 rotunjire
la nivel de sute i aa mai
departe.

1"
FROM DUAL;
Sinus hiperbolic de 1
-------------------1.17520119
SELECT SQRT(26) "Rdcin ptrat"
FROM DUAL;
Rdcin ptrat
----------5.09901951
SELECT TAN(135 * 3.14/180)
"Tangent de 135 grade"
FROM DUAL;
Tangent de 135 grade
----------------------1
SELECT TANH(.5) " Tangent
hiperbolic de 5"
FROM DUAL;
Tangent hiperbolic de 5
-----------------------.462117157
SELECT TRUNC(15.79,-1) "Trunc"
FROM DUAL;
Trunc
---------10

2) Funciile caracter accept la intrare valori caracter i furnizeaz


valori caracter sau numerice. n tabelul 3.2 sunt prezentate funciile caracter
care returneaz caractere, iar n tabelul 3.3 funciile caracter care
returneaz valori numerice. Valorile caracter returnate sunt de tipul
VARCHAR2 dac nu se specific altfel.
Tabelul 3.2 Funciile caracter care returneaz caractere
Funcia
CHR(n)

Rolul funciei
Returneaz caracterul care
are valoarea binar n.

Exemple
SELECT CHR(67)||CHR(65)||CHR(84)
"Caractere"
FROM DUAL;
Caractere

CONCAT
(c1,c2)

Returneaz o valoare format


din concatenarea caracterului
c1 cu caracterul c2.

INITCAP
('ir')

Returneaz irul de caractere


'ir' astfel nct fiecare cuvnt
al irului are prima liter n
format liter mare.

LOWER ('ir')

Returneaz irul de caractere


'ir' astfel nct toate literele
irului sunt de format liter
mic.

LPAD
('c1',n,'c2')

Returneaz irul de caractere


'c1', pe lungime de n
caractere, astfel nct partea
din stnga irului pn la
lungimea de n caractere este
umplut cu secvene de
caractere egale cu 'c2'. Dac
irul 'c1' este mai lung dect
valoarea n, atunci se
returneaz partea dreapt a
irului pe lungime de n
caractere.
LTRIM ('c1'
Returneaz partea din irul
[,'c2'])
'c1' care a mai rmas dup ce
au fost nlturate toate
caracterele din stnga
acestuia care se regsesc n
setul de caractere 'c2'.
NLSSORT
Returnez un ir de caractere
('c1'
folosite pentru sortarea
[,'nlsparams']) cmpurilor de tip caracter.
Caracterul 'c1' definete un
marcator de sortare, n sensul
c toate valorile dintr-un
cmp care sunt mai mari sau
mai mici dect acesta vor fi
afiate sau nu prin folosirea

--CAT
SELECT CONCAT( CONCAT (nume, '
este '), funcie) "Funcie"
FROM tab1
WHERE codfuncie = 7000;
Funcie
----------------Popescu este PROGRAMATOR
SELECT INITCAP('cuvnt1 cuvnt2')
"Litere mari"
FROM DUAL;
Litere mari
--------Cuvnt1 Cuvnt2
SELECT LOWER('BUCURETI')
"Liter mic"
FROM DUAL;
Liter mic.
-------------------bucureti
SELECT LPAD('Page.1',10,'*.')
"LPAD exemplu"
FROM DUAL;
LPAD exemplu
--------------*.*.*Pag.1

SELECT LTRIM('xyxXxyREST IR','xy')


"LTRIM exemplu"
FROM DUAL;
LTRIM exemplu
-----------XxyREST IR
SELECT nume
FROM tab1
WHERE
NLSSORT(nume,'NLS_SORT=romanian'
)<
NLSSORT('O','NLS_SORT=romanian')
ORDER BY nume;
NUME
----------

REPLACE
('c1','c2','c3')

RPAD
('c1',n[,'c2'])

RTRIM
('c1','c2')

SUBSTR
('c1',m[,n])

clauzei ORDER BY.


Parametrul 'nlsparams'
defineste valoare lingvistic
dup care s se fac sortare
i se d sub forma
'NLS_SORT = sort' n care
sort definete limba dup care
dorim s se fac
sortarea(german, romn
etc).
Returneaz irul 'c1'
translatat, astfel nct n irul
'c1' toate valorile egale cu
irul de cutare 'c2' sunt
nlocuite cu irul de nlocuire
'c3'.
Returneaz irul de caractere
'c1', pe lungime de n
caractere, astfel nct partea
din dreapta irului pn la
lungimea de n caractere este
umplut cu secvene de
caractere egale cu 'c2'. Dac
irul 'c1' este mai lung dect
valoarea n, atunci se
returneaz partea stng a
irului pe lungime de n
caractere.
Returneaz partea din irul
'c1' care a mai rmas dup ce
au fost nlturate toate
caracterele din dreapta
acestuia care se regsesc n
setul de caractere 'c2'.
Returneaz poriunea din
irul 'c1' care ncepe de la al
m-lea caracter pe lungime de
n caractere.

IONESCU
MARINESCU
POPESCU
OLGA
Not: Numele care ncep cu o liter mai
mare dect 'O' nu se vor afia.

SELECT REPLACE ('MAS i


MUSCA','M','C') "REPLACE"
FROM DUAL;
REPLACE
-------------CAS i CUC
SELECT RPAD('CLUJ',10,'ab') "RPAD
exemplu"
FROM DUAL;
RPAD exemplu
----------------CLUJababab

SELECT
RTRIM('BUCURETIyxXxy','xy')
"RTRIM exemplu"
FROM DUAL;
RTRIM exemplu
------------BUCURETIyxX
SELECT SUBSTR
('ABCDEFG',3.1,4) Subir1"
FROM DUAL;
Subir1
---CDEF
SELECT SUBSTR('ABCDEFG',-5,4)
"Subir2"
FROM DUAL;
Subir2
---CDEF

TRANSLATE
('c1','c2','c3')

UPPER('c1')

1. Translateaz irul 'c1' prin


intermediul irului 'c2' la
valorile din irul 'c3' dup
regula: fiecare caracter din
irul c1 este cutat n irul
'c2', dac este gsit valoarea
acestuia este nlocuit cu
caracterul din irul 'c3' a
crui poziie corespunde cu
poziia caracterului din irul
'c2'.
2. Dac irul 'c2' este mai
lung dect irul 'c3'
caracterele ce nu pot fi
translatate sunt eliminate din
irul 'c1'.
Returneaz irul 'c1' cu toate
caracterele transformate n
caractere mari.

SELECT TRANSLATE ('2KRB229',


'0123456789ABCDEFGHIJKLMNOPQ
RSTUV',
'9999999999XXXXXXXXXXXXXXXXXX
XXXXXXXX') "TRANSLATE 1"
FROM DUAL;
TRANSLATE 1
-------9XXX999
SELECT TRANSLATE ('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQ
RSTUVWX', '0123456789') "
TRANSLATE 2"
FROM DUAL;
TRANSLATE 2
----------------2229
SELECT UPPER('Bucureti')
"LITERE MARI"
FROM DUAL;
LITERE MARI
----BUCURETI

Tabelul 3.3 Funciile caracter care returneaz valori numerice


Funcia
ASCII ('c1')

Rolul funciei
Returneaz
valoarea
zecimal
a
primului
caracter din irul 'c1'.

INSTR ('c1','c2'
[,n[,m]])

1.Caut n irul 'c1'


ncepnd cu al n-lea su
caracter a m-a apariie a
irului 'c2' i returneaz
poziia acestuia n irul
'c1' relativ la nceputul
irului. Dac irul 'c2' nu
este gsit n irul 'c1' se
returneaz valoarea 0.
Valorile asumate prin
lips pentru n i m sunt 1.
2. Dac n este negativ
cutarea se face invers de
la sfritul irului.
Returneaz lungimea n

LENGTH

Exemple
SELECT ASCII('Q')
FROM DUAL;
ASCII('Q')
---------81
SELECT INSTR ('CORPORATE
FLOOR','OR', 3, 2) "INSTR"
FROM DUAL;
INSTR
---------14
SELECT INSTR ('CORPORATE
FLOOR', 'OR', -3, 2) "INSTR
INVERS" FROM DUAL;
INSTR INVERS
----------------2
SELECT LENGTH('BUCURETI')

caractere
caractere
CHAR.

a irului de
'c1' de tip

"LUNGIME IR"
FROM DUAL;
LUNGIME IR
-------------------9

3) Funciile de tip DATE opereaz cu tipuri de date de tip DATE i


sunt prezentate n tabelul 3.4. Toate funciile de tip DATE returneaz valori
de tip DATE, mai puin funcia MONTH_BETWEEN care furnizeaz o
valoare numeric. Structurile formatului fmt de afiare a datelor pentru
funciile de tip DATE sunt prezentate n tabelul 3.7.
Tabelul 3.4 Funciile de tip DATE
Funcia
ADD_MONTHS(d,n)

Rolul funciei
Returneaz data
d plus un numr
de luni egal cu
n.

LAST_DAY (d)

Returneaz data
ultimei zile din
lun.

MONTHS_
BETWEEN (d1, d2)

Returneaz
numrul de luni
dintre datele d1

Exemple
Dac n coloana data1 aferent numelui
'POPESCU' din tabela tab1 avem data 17
septembrie2005 cu comanda de mai jos se va
ob'ine data 17 octombrie 2005.
SELECT TO_CHAR
(ADD_MONTHS(data1,1), 'DD-MON-YYYY')
"Luna urmtoare"
FROM tab1
WHERE nume = 'POPESCU';
Luna urmtoare
----------17-OCT-2005
Cu aceast funcie se poate determina numrul
zilelor rmase din luna curent.
SELECT SYSDATE, LAST_DAY(SYSDATE)
"ULTIMA",LAST_DAY(SYSDATE) - SYSDATE
"ZILE RMASE"
FROM DUAL;
SYSDATE
ULTIMA
ZILE RMASE
-------------------------23-SEP-05 30-SEP-05
7
SELECT
TO_CHAR(ADD_MONTHS(LAST_DAY(data1),
5), 'DD-MON-YYYY') "Cinci luni"
FROM tab1
WHERE nume = 'POPESCU';
Cinci luni
----------28-FEB-2006
SELECT MONTHS_BETWEEN
(TO_DATE('02-09-2005','MM-DD-YYYY'),
TO_DATE('01-08-2005','MM-DD-YYYY') )

NEXT_DAY (d, 'c1')

ROUND (d[,fmt])

SYSDATE

TRUNC (d,[fmt])

i d2. Dac d1
i d2 sunt
acelei zile din
lun sau sunt
ultimele zile din
lun rezultatul
este un numr
ntreg, altfel
Oracle
calculeaz
fraciuni din
lun bazat pe o
lun cu 31 zile.
Returneaz data
primei zile a
sptmnii dup
ziua definit de
irul 'c1' i care
este dup data
d.
Returneaz data
d rotunjit la
unitatea de timp
specificat de
ctre formatul
fmt, conform
specificaiilor
de la sfritul
tabelului.
Returneaz data
i timpul curent.

Returneaz data
d fr timp
trunchiat la o
unitate
specificat de
formatul fmt, iar
dac este absent
se face
trunchierea la
ziua cea mai

"Luni"
FROM DUAL;
Luni
---------1.03225806

n exemplul de mai jos se returneaz data zilei


care urmeaz zilei de Mari, dup data de 15
martie 1999.
SELECT NEXT_DAY('15-MAR-05','TUESDAY')
"ZIUA URMTOARE"
FROM DUAL;
ZIUA URMTOARE
--------22-MAR-05
SELECT ROUND (TO_DATE ('27-SEP05'),'YEAR') "Noul an"
FROM DUAL;
Noul an
--------01-JAN-06

SELECT TO_CHAR(SYSDATE,
'MM-DD-YYYY HH24:MI:SS') "Data i timpul
curent"
FROM DUAL;
Data i timpul curent
------------------27-09-2005 20:27:11
SELECT TRUNC(TO_DATE
('27-SEP-05','DD-MON-YY'), 'YEAR')
"Anul nou"
FROM DUAL;
Anul nou
--------01-JAN-05

apropiat.
Formatul fmt utilizat de funciile ROUND i TRUNC
Formatul fmt
Semnificaia formatului fmt
CC, SCC
Se rotunjete la nivel de secol (primii doi digii ai anului
exprimat pe patru digii + 1)
Exemplu: 1898 se rotujete la 1998.
SYYYY, YYYY, YEAR SYEAR, Se rotunjete la nivelul 01 ianuarie a anului din data care
YYY, YY, Y
se rotunjete.
Exemplu: 27-sep-05 se rotunje;te la 01-jan-05.
Q
Rotunjire la nivel de trimestru (Se routunjete n sus la a
asesprezecea zi a lunii a doua a trimestrului).
MONTH, MON, MM, RM
Rotunjire la nivel de lun (Se routunjete n sus la a
asesprezecea zi a lunii).

4) Funciile de conversie convertesc o valoare de la un tip de dat la alt tip


de dat. Aceste funcii au formatul general de forma tip_de_dat TO
tip_de_dat i sunt prezentate n tabelul 3.5.
Tabelul 3.5 Funciile de conversie
Funcia
CONVERT
('c1', set_destinaie,
[,set_surs] )

HEXTOROW('c1')

RAWTOHEX(raw)
ROWIDTOCHAR
(rowid)

Semnificaia
Convertete un ir de
caractere de la un set
de caractere la alt set
de caractere. Setul
set_surs este setul de
caractere din care fac
parte caracterele
irului 'c1', iar
set_destinaie este setul
de caractere n care se
convertesc caracterele
irului 'c1'.
Convertete irul 'c1'
care conine digii
hexazecimali la tipul de
date RAW.
Convertete digii
hexazecimali de tip
RAW la irul 'c1'.
Convertete valoarea
ROWID la o valoare de
tip VARCHAR".
Rezultatul conversiei

Exemple
SELECT CONVERT('Gro', 'US7ASCII',
'WE8HP') "Conversie"
FROM DUAL;
Conversie
---------Gross
Seturile de caractere cele mai comune
sunt: US7ASCII, WE8DEC, WE8HP,
F7DEC, WE8EBCDIC500 , WE8PC850,
WE8ISO8859P1 .
INSERT INTO tab1 (raw_column)
SELECT HEXTORAW('7D') FROM
DUAL;

SELECT ROWID
FROM tab1
WHERE ROWIDTOCHAR(ROWID)
LIKE '%Br1AAB%';

este tot impul un ir de


18 caractere.

ROWID
-----------------AAAAZ6AABAAABr1AAB

TO_CHAR pentru
conversie de caractere,
are sintaxa:
TO_CHAR
(d [, fmt])

Convertete data d de
tip DATE la o valoare
de tip VARCHAR2 n
formatul specificat.

TO_CHAR pentru
conversie de numere,
are sintaxa:
TO_CHAR
(n [, fmt])

Convertete numrul n
de tip NUMBER la o
valoare de tip
VARCHAR2.

CHARTOROWID
('c1')

Convertete o valoare
de tip CHAR sau
VARCHAR2 la o
valoare de tip ROWID

TO_DATE
('c1' [, fmt ])

Convertete irul de
caractere 'c1' de tip
CHAR sau VARCHAR2
la o valoare de tip
DATE n conformitate
cu formatul fmt .
Formatul fmt pentru
datele de tip DATE este
prezentat n tabelul 3.7.
Convertete irul de
caractere 'c1' de tip
CHAR sau VARCHAR2
la o valoare numeric
de tip NUMBER n
conformitate cu
formatul fmt. Forma
acestui format este n
tabelul 3.6.

SELECT TO_CHAR (data1, 'Month DD,


YYYY') "Format nou"
FROM tab1
WHERE nume = 'ION';
Format nou
-----------------May
01, 2005
SELECT TO_CHAR(10000,'L99G999D99MI') "Cantitate"
FROM DUAL;
Cantitate
-------------$10,000.00SELECT nume
FROM tab1
WHERE ROWID = CHARTOROWID
('AAAAfZAABAAACp8AAO');
nume
---------POPESCU
INSERT INTO tab1 (data1)
SELECT TO_DATE( 'January 15, 2005,
11:00 A.M.', 'Month dd, YYYY, HH:MI
A.M.')
FROM DUAL;

TO_NUMBER
('c1',[,fmt ])

UPDATE tab1
SET salariu = salariu +
TO_NUMBER('100.00', '9G999D99')
WHERE nume = 'ION';

Tabelul 3.6 Structurile formatului fmt pentru datele de tip NUMBER


Elementul
fmt
9
0

Exemple

Semnificaia elementului fmt

9999
0999 9990

Nr. semnificativ de digii care vor fi afiai


Afieaz 0 n faa sau dup digiii semnificativi

$
B
MI
S

$999
B999
999MI
S999

D
G
,
.
RN sau rn

99D99
99G999
99,999,99
999.99
RN sau rn

Afieaz semnul $ n faa numrului


Afieaz valorile 0 ca blank-uri
Afieaz semnul - dup numerele negative
Afieaz semnul + sau - n faa numerelor
pozitive, respectiv negative
Afieaz punctul zecimal n aceast poziie
Separator de grupuri
Virgula se afieaz n poziiile indicate
Afieaz punctul zecimal n aceast poziie
Afieaz cifre romane cu majuscule, respectiv cu
caractere mici(minuscule)

Tabelul 3.7 Structurile formatului fmt pentru datele de tip DATE


Elementul fmt
- /,.;:
"text"
AD sau A.D.
BC sau B.C.
CC sau SCC

Se specific
n
TO-DATE
Da
Da
Da
Da
Nu

D
DAY
DD
DDD
HH sau HH12
HH24
J

Da
Da
Da
Da
Da
Da
Da

MI
MM
MON
MONTH
PM sau P.M.
RR sau RRRR
SS
SSSS

Da
Da
Da
Da
Nu
Da
da
Da

WW
W
YYYY,YYY,YY,Y

Nu
Nu
Da

Semnificaia elementului fmt


Punctuaii pentru dat
Text reprodus n rezultat
Specificarea unui an din Era Noastr(E.N.)
Specificarea unui an naintea Erei Noastre(.E.N.)
Secolul = cu primii doi digii ai anului pe patru digii
+1
Ziua din sptmn(de la 1 la 7)
Numele zilei
Ziua din lun(de la 1 la 31)
Ziua din an(1 la 366)
Ora din zi din intervalul 1 - 12
Ora din zi din intervalul 1 - 24
Ziua din calendarul Iulian cu valori ncepnd cu 1
ianuarie 4712 BC. Trebuie s fi ntreg.
Minute (0 la 59)
Luna (01 la 12)
Numele prescurtat al lunii
Numele ntreg al lunii
Indicator de meridian
Rotunjirea anului pe doi digii sau patru digii
Secundele n cadrul minutului(0 la 59)
Secundele de la miezul nopii n cadrul zilei(0 la
86399)
Sptmna din an (1 la 53)
Sptmna n cadrul lunii(1 la 5)
Anul cu 4 , 3, 2, 1 digii.

Alte funcii cu un singur rnd sunt prezentate n tabelul 3.8.

Tabelul 3.8 Alte funcii cu un singur rnd


Funcia
DUMP ('c1'
[,return_format
[,start_position
[,length]]])

EMPTY_
[B|C]LOB()

BFILENAME
('director',
'nume_fiier')

GREATEST (expr
[,expr] ...)

Rolul funciei
Returneaz o valoare de tip
VARCHAR2 coninnd codul
tipului de date, lungimea n
baii i reprezentarea
intern a expresiei expr
return_format este codul
sistemului de numeraie n
care este reprezentat
valoarea returnat de
funcie pentru irul 'c1';
Dac se furnizeaz ca o
valoare egal cu codul
sistemului de numeraie +
1000 se returneaz i
numele sistemului de
numeraie.
start_position determin
poziia din irul 'c1' de unde
s nceap DUMP-u
length este lungimea
DUMP-ului.
Returneaz un pointer sau
locator care poate fi folosit
pentru iniializare unei
variabile de tip LOB, ntr-un
INSERT, ntr-un UPDATE
pentru iniializarea unei
coloane de tip LOB sau ca
atribut EMPTY, care
nseamn c LOB-ul a fost
iniializat dar nu a fost
populat cu date.
Returneaz un pointer sau
locator asociat cu un LOB
de tipul unui fiier binar de
pe server.
director este numele
directorului unde se afl
fiierul LOB de tip binar.
nume_fiier este numele
fiierului.
Returneaz valoarea cea
mai mare dint-o list de
valori.

Exemple
SELECT DUMP('abc', 1016)
FROM DUAL;
DUMP('ABC',1016)
----------------------------------Typ=96
Len=3 CharacterSet=WE8DEC:
61,62,63
SELECT DUMP(nume, 8, 3, 2)
"OCTAL"
FROM tab1
WHERE nume = 'SCOTT';
OCTAL
---------------------------Type=1 Len=5: 117,124 Sistemele
de numeraie sunt: 8 = sistemul
octal; 10 = sistemul zecimal; 16 =
sistemul hexazecimal; 17 =
rezultatul este returnat sub forma
de caractere singulare.
INSERT INTO lob_tab1
VALUES (EMPTY_BLOB());
UPDATE lob_tab1
SET clob_col = EMPTY_BLOB();

INSERT INTO tab1 VALUES


(BFILENAME('lob_dir1',foto1.gif'))
;

SELECT GREATEST ('HARRY',


'HARRIOT', 'HAROLD') "Mare"
FROM DUAL;
Mare
-----

LEAST (expr
[,expr] ...)

Returneaz valoarea cea


mai mic dint-o list de
valori.

NVL (expr1, expr2)

Dac expr1 este NULL


returneaz expresia expr2,
iar dac expr1 nu este
NULL returneaz expr1.
Argumentele expr1 i expr2
pot avea orice tip de date.
Dac sunt de tipuri diferite
Oracle convertete expr2 la
tipul expr1 nainte de a
executa comparaiile.
Valoarea returnat este
totdeauna de tipul expr1,
execpie fcnd situaia
cnd expr1 este de tip
caracter, caz n care
rezultatul este VARCHAR2.
Returnez un ntreg care
identific n mod unic
utilizatorul curent.
Returneaz identificatorul
utilizatorului curent n
format VARCHAR2.

UID
USER

USERENV (option)

Returneaz informaii
despre sesiune curent.

VSIZE(expr)

Returneaz lungimea n baii


a expresiei expr.

HARRY
SELECT
LEAST('HARRY','HARRIOT','HAR
OLD') "Mic"
FROM DUAL;
Mic
-----HAROLD
SELECT nume,
NVL(TO_CHAR(comision), 'NOT
APPLICABLE') "COMISION"
FROM tab1
WHERE codepart = 30;
NUME COMISION
---------- -----------------ALLEN 300
WARD
500
MARTIN 1400
TURNER 0
JAMES NOT APPLICABLE

SELECT USER, UID


FROM DUAL;
USER
UID
---------------------------SCOTT
19
SELECT USERENV('LANGUAGE')
"Limbajul"
FROM DUAL;
Limbajul
----------------------------------AMERICAN_AMERICA.WE8DEC
SELECT nume, VSIZE (nume)
"BYTES"
FROM tab1
WHERE codepart = 10;
NUME
BYTES
---------------------------CLARK
5
KING
4
MILLER
6

B.Funciile cu mai multe randuri (de grup)


Furnizeaz un rezultat bazat pe prelucrarea mai multor rnduri.
Toate funciile de grup, mai puin COUNT(*) ignor valorile NULL.
Majoritatea funciilor de grup accept opiunile:DISTINCT
(determin luarea n calcul numai a valorilor distincte ale rndurilor din
cadrul grupului) i ALL ( determin luarea n calcul a tuturor valorilor
grupului de rnduri).
Funciile de grup sunt prezentate n tabelul 3.9.
Tabelul 3.9 Funciile de grup
Funcia
AVG([DISTINCT|ALL] n)

Semnificaia
Returnez media celor n
valori

COUNT ({* |
[DISTINCT|ALL] expr})

Returneaz toate
rndurile cererii. Dac
avem argumentul = * se
returneaz toate
rndurile indiferent de
valoarea lor (NULL sau
NOT NULL)

MAX([DISTINCT|ALL]
expr)

MIN([DISTINCT|ALL]
expr)

Returneaz maximul din


expresia expr.

Exemple
SELECT AVG(salariu) "Medie"
FROM tab1;
Media
---------2077343.21429
SELECT COUNT(*) "Total"
FROM tab1;
Total
---------18
SELECT COUNT(job) "Count"
FROM tab1;
Count
---------14
SELECT COUNT(DISTINCT
job) "Jobs"
FROM emp;
Jobs
---------5
SELECT MAX(salariu)
"Maximum"
FROM tab1;
Maximum
---------5000
SELECT MIN(data1) "Minim"
FROM tab1;
Minimum

SUM([DISTINCT|ALL] n)

--------17-DEC-80
SELECT SUM(salariu) "Total"
FROM tab1;
Total
---------29081

Utilizatorii pot s-i scrie propriile funcii n PL/SQL pentru a


executa activiti neacoperite de ctre funciile SQL. Aceste funcii pot fi
folosite n comenzile SQL la fel ca i cele standard.
De exemplu, funciile utilizator pot fi folosite n: lista de selecie a comenzii
SELECT; condiia din clauza WHERE; clauzele CONNECT BY, START
WITH, ORDER BY I GROUP BY ; clauza VALUES a comenzii
INSERT; clauza SET a comenzii UPDATE.
Funciile utilizator nu pot fi folosite n clauzele CONSTRAINT sau
DEFAULT ale comenzilor C REATE TABLE sau ALTER TABLE i nici
pentru actualizarea bazei de date. n funciile utilizator nu este permis
utilizarea parametrilor OUT sau IN OUT.
3.4. EXPRESII SQL
Expresia este o combinaie de unul sau mai muli operatori,
operanzi (variabile, literali, coloane, funcii SQL) care se evalueaz la o
singur valoare.
Operatorii utilizai n comenzile SQL sunt: operatori SQL*PLUS;
operatori SQL; operatori aritmetici; operatori logici; operatori specifici n
expresiile de cereri. Ei sunt prezentai n Anexa 2, n ordinea descresctoare
a prioritii, cei de aceeai importan fiind grupai ntre perechi de linii
orizontale. Operatorii sunt evaluai de la stnga spre dreapta.
O expresie are n general acelai tip de date ca i componentele sale.
Expresiile sunt folosite pentru construirea instruciunilor SQL i a unor liste
de expresii.
A. Exist cinci forme de furnizarea a expresiilor pentru construirea
instruciunilor SQL.
1) Forma I este format din coloan, pseudocoloan, constant,
secven sau NULL i are sintaxa:
nume_schem.tabel | vedere. coloan | pseudocoloan | ROWLABEL
sau
text | numr | nume_secven | nume secven. CURRVAL | NEXTVAL
| NULL

Pentru nume_schem se poate folosi pe lng numele schemei


utilizatorului i valoarea "PUBLIC", care calific sinonimele publice pentru
o tabel sau o vedere, calificare care este suportat doar n instruciunile
SQL pentru manipularea datelor de tip (DDL), nu i n cele de definire a
datelor de tip DDL.
Pseudocoloan poate fi doar LEVEL, ROWID sau ROWNUM.
Exemple:
Tab1.numecol_1
'acesta este un ir de caractere'
10
secventa1.CURRVAL
2) Forma II este folosit pentru definirea unei variabile gazd (host
variable) cu sau fr indicator de variabil. Expresiile din aceast form se
vor folosi doar n instruciunile SQL incluse n limbajele de programere
gazd sau n instruciunile prelucrate de programele OCI(Oracle Call
Interface). Sintaxa este de forma:
: variabil_gazd INDICATOR :variabil_indicator
Exemple:
: nume_angajat INDICATOR :indicator_var_nume_angajat
:nume_persoan
3) Forma III este folosit pentru apelul funciilor cu un singur rnd i are
sintaxa:
funcie (DISTINCT | ALL expresie1, expresie2, )
Exemple :
LENGTH('BLAKE')
ROUND(1234.567*43)
SYSDATE
4) Forma IV este folosit pentru apelul funciilor de utilizator i are sintaxa:
nume_schem . nume_pachet. nume_funcie
Exemple:
aria_cercului(raza)
calcul_rate(nume_angajat)

5) Forma V este o combinaie de mai multe expresii i are sintaxa:


( expresie ) | + | - | PRIOR expresie | expresie1 * | / | - | || expresie2
Exemple:
('IONESCU' || ' PETRE')
LENGTH('BUCURESTI') * 57
SQRT(144) + 72
funcie_utilizator(TO_CHAR(sysdate,'DD-MMM-YY')
Expresiile pentru decodificarea unor valori folosesc sintaxa special
de tip DECODE de forma:
DECODE ( expr, val1, rezultat1, val2, rezultat2, . , valoare_asumat)
expr va fi evaluat i apoi valoarea rezultat va fi comparat cu
fiecarea dintre valorile val1, val2, . . Dac valoarea expresiei este egal cu
una din valorile de comparaie se va furniza valoarea rezultat (rezultat1,
rezultat2, ) care corespunde valorii de comparaie. Dac valoarea
expresiei expr1 nu este egal cu nici una din valorule de comparaie se
furnizeaz valoarea valoare_asumat. Dac valoarea asumat este omis
atunci se furnizeaz valoarea NULL.
Exemplu:
DECODE (cod_funcie,10, 'programator',
20, 'cercettor',
30, 'vnztor',
40, 'operatorr',
'lips_funcie')
Exemplul de mai sus decodific valoarea expresiei cod_funcie.
Astfel dac valoarea expresiei cod_funcie = 10 se furnizeaz funcia
programator, dac este = 20 se furnizeaz funcia cercettor i aa mai
departe. n caz c expresia cod_funcie are a valoare care nu este egal cu
nici una din valorile 10, 20, 30 sau 40 se furnizeaz ca rezultat valoarea
lips_funcie.
B. O list de expresii este o serie de expresii separate ntre ele prin virgul
i nchis ntre paranteze rotunde i poate conine pn la maximum 1000 de
expresii.

Exemplu:
(10, 20, 40)
('SCOTT', 'BLAKE', 'TAYLOR')
(LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69)
3.5. CONDIIILE
Condiia este o combinaie de una sau mai multe expresii i
operatori logici evaluat cu una din valorile TRUE, FALSE sau
UNKNOWN. Condiiile se pot folosi n clauza WHERE a instruciunilor
SQL DELETE, SELECT i UPDATE sau ntr-una din clauzele WHERE,
START WITH, CONNECT BY sau HAVING ale instruciunii SELECT.
Exemple:
1) Expresia 1=1 este evaluat ca TRUE
2) Expresia NVL(sal, 0) + NVL(comm, 0) > 2500 adun valoarea
sal cu comm i evalueaz rezultatul dac este >= cu 2500000. Dac sal sau
comm sunt NULL se vor nlocui cu valoarea zero.
Condiiile au opt forme de prezentare.
Forma I este folosit pentru compararea unei expresii cu alt
expresie sau cu o subcerere i are sintaxa:
expresie1 = | != | <> | > | < | >= | <= expresi2 | (subcerere)
sau
list_de_expresii = | != | <> (subcerere)
Forma II este folosit pentru compararea unei expresii sau a unei
liste de expresii cu unul sau toi membrii unei liste de xepresii sau ai unei
subcereri i are sintaxa:
expresie1 = | != | <> | > | < | >= | <= ANY | SOME | ALL
list_de_expresii | (subcerere)
sau
list_de_exp = | != | <> ANY | SOME | ALL (list_expr1,
list_expr2, ) | (subcerere1,
subcerere2, . )
Forma III este folosit pentru cutarea unei expresii sau a unei liste
de expresii dac figureaz ntr-o list de expresii sau ntr-o subcerere i are
sintaxa:
expresie1 NOT IN list_de_expresii | (subcerere)

sau
list_de_exp NOT IN ( list_expr1, list_expr2, ) |
(subcerere1, subcerere2, . )
Forma IV este folosit pentru testarea existenei sau inexistenei
expresiei ntre dou limite i are sintaxa:
expresie1 NOT BETWEEN expr2 AND expr3
Forma V este folosit pentru testarea valorii NULL i are sintaxa:
expresie1 IS NOT NULL
Forma VI este folosit pentru testarea existenei unui rnd nt-o
subcerere i are sintaxa:
EXISTS ( subcerere )
Forma VII este folosit pentru testarea egalitii unei ir de caractere
cu un format anume, cu un alt ir de caracter i are sintaxa:
ir_ caracter1 NOT LIKE ir_cacrater2 ESCAPE
'caracter_de_schimbare'
Forma VIII este folosit pentru specificarea unei combinaii de mai
multe condiii i poate avea sintaxele:
NOT condiie
sau
condiie1 NOT AND | OR condiie2
3.6. DESCHIDEREA I NCHIDEREA UNEI SESIUNI DE LUCRU
SQL*PLUS
Pentru a avea acces la componentele unei baze de date (tabele, viziuni, clustere etc.), utilizatorul trebuie mai nti s se conecteze la ea. La
sfritul sau n timpul unei sesiuni SQL exist posibilitatea deconectrii de
la baza de date. O prim conectare se face atunci cnd se ncepe lucrul cu
SQL*Plus. Efectul comenzii sau utilizrii meniului sistem l constituie
deschiderea unei sesiuni de lucru sub SQL*Plus.
Comanda are urmtoarele forme sintactice:
SQLPLUS [nume-utilizator[/parol]
[@nume-baz-de-date]
[@nume-fiier]

[-SILENT]
SQLPLUS /NOLOG [-SILENT]
SQLPLUS -?
unde:
nume-utilizator i parol: sunt numele i parola unui utilizator cu drept de
acces la baza de date.
@nume-baz-de-date: este numele unei baze de date cu care se lucreaz n
reea (este alt nume dect cel al bazei de date implicite, de pe calculatorul la
care se lucreaz).
@nume-fiier: reprezint numele unui fiier de comenzi SQL care va fi fi
rulat de SQL*Plus.
SILENT: are ca efect inhibarea facilitii de afiare a tuturor informaiilor i
mesajelor furnizate de SQL*Plus
/NOLOG: lanseaz n execuie SQL*Plus dar nu face conectarea la o baz
de date.
-?: are ca efect afiarea versiunii curente a componentei SQL*Plus, dup
care returneaz controlul sistemului de operare
Dac n linia de comand se specific parola i @nume-baz-dedate atunci ntre ele nu trebuie s existe spaiu. Parola sau @nume-baz-dedate vor fi separate printr-un spaiu de @nume-fiier.
Conectarea utilizatorului la o baz de date
Dac n timpul unei sesiuni de lucru SQL*PLUS se dorete conectarea la o alt baz de date dect cea deschis iniial se poate folosi comanda
CONNECT.
Sintaxa acestei comenzi este:
CONN[ECT] [nume-utilizator[/parol]]
[@nume-baz-de-date];
unde:
nume-utilizator i parol: sunt numele unui utilizator cu drepturi de acces la
baza de date i parola unui astfel de utilizator. Chiar dac nu se specific
parola (n linia de comand este opional), ea este cerut de sistem printrun mesaj explicit. Parola introdus la mesajul sistemului va fi invizibil.
@nume-baz-de-date: se specific n cazul lucrului n reea, cnd se dorete
conectarea la o alt baz de date dect cea aflat pe calculatorul la care se
lucreaz.

De remarcat faptul c n timpul unei sesiuni de lucru cu SQL*Plus se poate


realiza conectarea la o baz de date, fr a mai fi necesar nchiderea
sesiunii.
Furnizarea parametrilor nume-utilizator i parol asigur protecia bazei de
date mpotriva accesului neautorizat.
Deconectarea utilizatorului de la baza de date
Deconectarea utilizatorului de la o baz de date se realizeaz prin
comanda DISCONNECT.
Sintaxa acestei comenzi este:
DISC[ONNECT];
Comanda are ca efect deconectarea de la baza de date curent, fr a
nchide sesiunea de lucru SQL*Plus.
nchiderea sesiunii de lucru SQL*Plus
nchiderea sesiunii de lucru SQL*PLUS i predarea controlului
sistemului de operare al calculatorului gazd se realizeaz cu una din
comenzile: QUIT, EXIT sau ^Z.
Sintaxa acestor comenzi este:
QUIT;
EXIT:
^Z;
3.7. ELEMENTE DE LUCRU CU SQL*PLUS
A. ncrcarea i executarea comenzilor
n exemplele ce se vor prezenta, referitor la utilizarea comenzilor
SQL*Plus, se va folosi tabela Oracle pers100 cu structura de mai jos:
CREATE TABLE pers100
(CODPERS NUMBER(5),
NUME VARCHAR2(30),
PRENUME VARCHAR2(30),
ZINAST NUMBER(2),
LUNAST NUMBER(2),
ANAST NUMBER(4),
STRADA VARCHAR2(40),
NRSTR NUMBER(2),
SECTOR NUMBER(1),
LOCNAST VARCHAR(20),
FUNCTIA VARCHAR(15),
SALARIU NUMBER(8),
NUMAR_ACTIUNI NUMBER (6))

PCTFREE 5 PCTUSED 75;


Comenzile se pot introduce pe una sau mai multe linii.
Exemplu:
Comanda
sql> select * from pers100;
este echivalent cu:
sql> select
2 * from
3 pers100;
Introducerea comentariilor se poate realiza folosind:
Comanda REMARK din SQL*Plus
Exemplu:
REMARK comentariu
Nu se vor introduce comentarii intre liniile aceleai comenzi SQL.
Delimitatorii de comentariu din SQL /* */
Exemplu:
/* comentariu */
comentariile tip PL/SQL prefixate cu - -
Exemplu:
-- comentariu
Terminarea unei comenzi SQL se face cu: punct i virgul (;), slash
(/) sau blank. Primele dou forme cer SQL*Plus s execute imediat
comanda, a treia form nu. Comanda curent poate fi rulat sau rerulat
introducnd comenzile RUN sau slash(/).
Se pot introduce i blocuri PL/SQL care s fie executate. La sfritul
blocurilor PL/SQL se vor insera dou linii una coninnd un punct, iar
cealalt un slash(/).
Exemplu:
declare
x number := 100;
begin
for i in 1 .. 10 loop
insert into pers100 values
(10, ionel, marin, 10,7,1970, ion manolescu,2, 6, suceava);
end loop;
end;
/

Zona (aria) n care SQL*Plus memoreaz comenzile curente se


numete buffer-ul SQL.
Pe lng comenzile SQL i PL/SQL se pot introduce i comenzi
SQL*Plus, care pot fi abreviate i la o liter. Comenzile foarte lungi pot fi
ntrerupte i continuate pe linia urmtoare. ntreruperea se marcheaz cu -.
Oracle automat afieaz semnul > (prompter) dup care se introduce restul
comenzii.
Exemplu:
sql> select * from >pers100;
Controlul listrii rapoartelor lungi se poate face utiliznd tasata Cancel sau
setnd variabila PAUSE pe ON.
Exemplu:
set pause text de atenionare
set pause on
Aceast setare va determina ca sistemul s opreasc afiarea la
fiecare pagin i s afieze textul text de atenionare. Cu SET PAUSE OFF
se revine la starea anterioar.
B. Editarea comenzilor SQL*Plus
Editarea n mod linie se realizeaz prin comenzile din tabelul 3.10.
Tabelul 3.10. Comenzile de editare a comenzilor SQL*Plus
Comanda
APPEND text
CHANGE /old/new/
CHANGE /text
CLEAR BUFFER
DEL
INPUT
INPUT text
LIST
LIST n
LIST *
LIST LAST
LIST m n

Abreviaia
A text
C /old/new/
C/text
CL BUFF
Fr abreviaie
I
I text
L
L n sau n
L*
L LAST
Lmn

Funcia
Adaug text la sfritul unei linii
Schimb un text cu altul
terge textul unei linii
Cur bufferul
terge o linie
Adaug una sau mai multe linii
Adaug o linie format dintr-un text
Listeaz toate liniile din buffer
Listeaz linia n
Listeaz linia curent
Listeaz ultima linie
Listeaz liniile de la m la n

Editarea comenzilor cu editorul sistemului se realizeaz cu comanda


EDIT. Apare fereastra Editorului, n care se vor tasta instruciunile SQL
dorite. Se salveaz fiierul cu nume.SQL i se execut cu comanda @nume.
C. Crearea, regsirea, rularea i modificaea fiierelor de comenzi.
Crearea fiierelor de comenzi se pot realiza prin:

Salvarea coninutului bufferului cu comanda SAVE.


Exemplu:
SAVE nume_ fiier.SQL
nainte de salvare se va lista bufferul cu comanda LIST pentru a verifica
dac instruciunile ce vor fi salvate sunt corecte.
Utilizarea comenzii INPUT n corelaie cu SAVE
Exemplu:
sql> clear buffer
sql> input
select * from pers100
sql> save comand1.sql
sql> @comand1
Utilizarea editorului de sistem
SQL> EDIT nume_fiier
Regsirea (citirea) fiierelor de comenzi se face cu comanda GET.
Exemplu:
SQL> GET edit3
SELECT * FROM PERS100;
Rularea fiierelor de comenzi se execut folosind comenzile:
START nume_fiier
@nume_fiier
Dac avem mai multe fiiere de comenzi pe care vrem s le
executm secvenial, vom creea un fiier de comenzi coninnd comenzile
START corespunztoare, dup care pentru rulare vom activa acest ultim
fiier.
Exemplu:
n fiierul FILE2 introducem comenzile:
START fi1
START fi2
START fi3
Apoi cu una din comenzile START FILE2 sau @FILE2 vom activa
aceste comenzi.
Modificarea fiierelor de comenzi se poate realiza folosind comanda
EDIT nume_fiier sau comanda GET urmat de SAVE nume_fiier
REPLACE.
D. Faciliti pentru setarea fiierelor de comenzi
Urmtoarele faciliti fac posibil setarea unor fiiere de comenzi
care s permit utilizatorilor s-i introduc propriile valori pentru controlul

execuiei comenzilor: definirea variabilelor de utilizator; tergerea


variabilelor de utilizator; substituirea valorilor n comenzi; folosirea
comenzii START pentru furnizarea de valori n comenzi; crearea unor
prompteri pentru introducerea valorilor.
1) Definirea variabilelor de utilizator se face explicit cu comanda
DEFINE sau implicit prin utilizarea prefixrii variabilelor cu dou &.
Definirea, listarea i tergerea unei variabile utilizator n mod
explicit se fac cu comenzile:
DEFINE nume_variabil = valoare variabila
Exemplu:
SQL > DEFINE variabila1 = mihai
2) tergerea variabilelor de utilizator se realizeaz prin utilizarea
comenzii
UNDEFINE nume_varaiabil.
Exemplu:
SQL> UNDEFINE varaiabila1
3) Substituirea variabilelor este o tehnic prin care putem creea
proceduri de lucru astfel nct s folosim acelai script (grup de instruciuni)
pentru efectuarea unor funcii diferite pornind de la structura procedurii.
Variabilele ce se substituie pot exista la momentul substituirii dac anterior
au fost create explicit cu comanda DEFINE sau implicit prin prefixare cu &.
Exist patru modaliti de substituire a variabilelor: substituirea variabilelor
prefixate cu un &; substituirea variabilelor prefixate cu dou &;
substituirea variabilelor de tip &n cu ajutorul comenzii START; substituirea
variabilelor folosind comenzile PROMPT, ACCEPT i PAUSE
a) Substituirea variabilelor prefixate cu un &. Vom crea o
procedur generalizat pentru calculul unor subgrupe statistice pe o coloan
numeric.
Exemplu:
S se execute selecia din baza de date a valorilor salariilor
aparinnd aceleai funcii, iar din aceste grupe afiarea celor care sunt cele
mai mici din grup, ordonate descresctor.
select funcia , min(salariu) minimum
from pers100
group by funcia
order by min(salariu) desc;
n fraza SELECT de mai sus funcia, min, salariu i desc pot fi
definite ca variabile, ceea ce va permite ca s putem utiliza pentru grupare i
alt coloan, pentru calcul i valorile max sau sum, iar pentru ordonare vom
putea folosi i valoarea ascendent. Pentru executarea acestei comenzi vom
crea fiierul de comenzi CALC&.SQL, cu structura de mai jos:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --*/
/* &v1_col_grup = nume coloan din tabel dup valorile creia se
va face gruparea
/* &v2_tip_calc = tipul calculului: min, max, sum pentru un anumit
grup de valori numerice
/* &v3_col_calc = numele coloanei de tip numeric dup care se va
face calculul
/*&v4_nume_col_calculat = numele coloanei, n list, pe care se
vor afia valorile calculate
/* &v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau
asc(ascending)
SELECT &v1_col_grup,
&v2_tip_calc(&v3_col_calc),
&v4_nume_col_calculat
FROM pers100
GROUP BY &v1_col_grup
ORDER BY &v2_tip_calc(&v3_col_calc,) &v5_tip_sort;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - --*/
Dup apelul fiierului cu comanda @calc& sistemul ne va cere
succesiv s furnizm valorile dorite pentru variabilele definite astfel:
Enter value for v1_col_grup: nume
Enter value for v2_tip_calc: min
Enter value for v3_col_calc: salariu
Enter value for v4_nume_col_calculat: MINIMUM
Enter value for v1_col_grup: nume
Enter value for v2_tip_calc: min
Enter value for v3_col_calc: salariu
Enter value for v5_tip_sort: desc
Iar rezultatul dup executare comenzii va arta ca mai jos:
NUME
MINIMUM
------------------------------ --------ionescu
3500000
petrescu
2500000
mihai
1500000
b) Substituirea variabilelor prefixate cu dou
&. Pentru
exemplificare vom crea, pornind de la fiierul de comenzi CALC&.SQL,
fiierul de comenzi CALC&&.SQL n care variabilele vor fi prefixate cu
doua caractere &, ca mai jos:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - -*/
/* &&v1_col_grup = nume coloan din tabel dup valorile creia
se va face gruparea
/* &&v2_tip_calc = tipul calculului: min, max, sum pentru un
anumit grup de valori numerice
/* &&v3_col_calc = numele coloanei de tip numeric dup care se
va face calculul
/*&&v4_nume_col_calculat = numele coloanei, n list, pe care se
vor afia valorile calculate
/* &&v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau
asc(ascending) */
SELECT &&v1_col_grup,
&&v2_tip_calc(&&v3_col_calc),
&&v4_nume_col_calculat
FROM pers100
GROUP BY &&v1_col_grup
ORDER BY &&v2_tip_calc(&&v3_col_calc), &&v5_tip_sort
/* - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - - - -*/
La momentul executrii fiierului de comenzi CALC&&.Sql
sistemul va cere s introducem valorile dorite pentru variabilele definite la
fel ca la apelul precedent cu deosebirea c valorile ce le vom furniza vor fi
memorate de fiecare dat astfel c indiferent de cte ori apare o variabil
pentru ea se va furniza valoarea o singur dat. Orice execuie ulterioar a
unui fiier de comenzi n care apare una din variabilele create anterior
(definite implicit ca variabile utilizator) se vor folosi aceste valori. Execuia
acestui fiier de comenzi va produce acelai rezultat ca i execuia fiierului
CALC&.SQL. Rulnd comanda DEFINE vom gsi n sistem pe lng alte
variabile utilizator i variabilele create prin execuia fiierului
CALC&&.SQL.
Exemplu:
SQL> DEFINE
DEFINE _EDITOR
= Notepad (CHAR)
DEFINE _RC
= 1 (CHAR)
DEFINE V1_COL_GRUP = nume (CHAR)
DEFINE V2_TIP_CALC = min (CHAR)
DEFINE V3_COL_CALC = salariu (CHAR)
DEFINE V4_NUME_COL_CALCULAT = minimum (CHAR)
DEFINE V5_TIP_SORT = desc (CHAR)
Dac vom dori rularea procedurii create anterior dar dnd variabilelor alte
valori, va trebui nti s tergem aceste variabile cu comanda UNDEFINE.

c) Substituirea variabilelor de tip &n cu ajutorul comenzii START.


Pentru a nu mai furniza interactiv valori pentru variabilele utilizator la
momentul execuiei, le putem defini pe acestea sub forma &n , n care n ia
valori ncepnd cu 1, iar valorile lor vor fi furnizate ca parametrii de apel
ai instruciunii START.
Astfel vom crea fiierul de comenzi CALCSTART.SQL de forma:
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - --/* &1 = nume coloan din tabelei dup care se face gruparea
/* &2 = tipul calculului: min, max, sum pentru un anumit grup
/* &3 = numele coloanei de tip numeric dup care se va face
calculul
/* &4 = numele coloanei pe care se vor afia valorile calculate
/* &5 = tipul ordonrii(sortrii), descending sau ascending*/
select &1, &2(&3) &4
from pers100
group by &1
order by &2(&3) &5;
/* - - - - - - - - - - - - -- - - -- -- - - - - - - - - - - - -- - -*/
Pentru execuie vom apela fiierul de comenzi CALCSTART.SQL
cu comanda START n care vom furniza ca parametrii valorile dorite pentru
cele 5 variabile de tip &n definite.
Exemplu:
SQL> START CALCSTART nume min salariu MINIMUM desc
Aceast execuie va produce acelai rezultat ca i execuiile fiierelor
de comenzi CALC&.SQL i CALC&&.SQL.
Deosebirea este c nu se mai creeaz variabilele utilizator astfel c
putem executa n mod generalizat procedura CALCSTART dnd
variabilelor orice alte valori logic acceptabile.
d) Crearea unor modaliti interactive de comunicare cu
calculatorul se realizeaz cu comenzile PROMPT, ACCEPT i PAUSE, care
sunt de fapt operaii de intrare/ieire standard. PROMPT permite trimiterea
(scrierea) de mesaje la utilizator. ACCEPT permite preluarea (citirea)
rspunsurilor de la utilizator. PAUSE permite introducerea unui moment de
pauz pentru ca utilizatorul s citeasc mesajul i s-i formuleze rspunsul.
Aceste comenzi se folosesc n conjuncie cu INPUT i SAVE, pentru
a introduce valorile dorite cu comenzile de mai sus, i respectiv pentru a le
salva ntr-un fiier de comenzi, care s fie ulterior executat.
Exemplu:
SQL> Clear buffer
SQL> INPUT

PROMPT Introducei un titlu format din maxim 30 caractere


PAUSE urmeaz introducerea titlului, apsai RETURN
ACCEPT TITLUL_MEU PROMPT TITLUL:
PAUSE
urmeaz comanda de centrare a titlului, apsai
RETURN
TTITLE CENTER TITLUL_MEU SKIP 2
PAUSE urmeaz selectarea din baza de date, apsai RETURN
SELECT codpers, nume , prenume from pers100;
SQL> SAVE cmdprompt
SQL> @cmdprompt
Rezultatul este:
Introducei un titlu format din maxim 30 caractere
urmeaz introducerea titlului, apsai RETURN
titlu:-----SELECTARE DIN BAZA DE DATE codpers, nume i prenume ---urmeaz comanda de centrare a titlului, apsai RETURN
urmeaz selectarea din baza de date, apsai RETURN
-----SELECTARE DIN BAZA DE DATE codpers, nume i prenume ---CODPERS NUME
PRENUME
-------------------------------------- ---------1
petrescu
ion
2
petrescu
florea
3
ionescu
ion
4
ionescu
dumitru
5
mihai
florea
6
mihai
ion
6 rows selected.

e) Utilizarea comenzilor PROMPT i ACCEPT n conjuncie cu


substituirea variabilelor
n exemplele anterioare cnd s-au utilizat fiierele de comenzi
CALC&.SQL i CALC&&.SQL s-a vzut c sistemul pentru fiecare
variabil a creat cte un prompter de forma:
Enter value for nume_variabil :
Ca atare se poate nlocui prompter-ul sistemului cu propriu prompter
utiliznd pentru aceasta comenzile PROMPT i ACCEPT n fiierul de
comenzi unde vrem s introducem o variabil pentru care vom construi alt
prompter dect cel de sistem.
Exemplu:
SQL> Clear buffer
SQL> INPUT
PROMPT Introducei o valoare numeric pentru salariu
PROMPT De exemplu: 1500000, 2500000
ACCEPT var_salariu NUMBER PROMPT valoare salariu:

SELECT codpers, nume, salariu from pers100


WHERE salariu = &var_salariu
SQL> save cmd2prompt
SQL> @cmd2prompt
Rezultatul este:
Introducei o valoare numeric pentru salariu
De exemplu: 1500000, 2500000
valoare salariu: aaaa
aaaa is not a valid number
valoare salariu: 3500000
old
1: SELECT codpers, nume, salariu from pers100 WHERE salariu =
&var_salariu
new
1: SELECT codpers, nume, salariu from pers100 WHERE salariu =
3500000
CODPERS NUME
SALARIU
-------------------------------------- --------4
ionescu
3500000

3.8. FORMATAREA REZULTATELOR


Limbajul SQL*PLUS permite proiectarea i formatarea diverselor
situaii de ieire. Aceste operaii sunt posibile prin utilizarea unor comenzi
pentru tratarea ntreruperilor, comenzi pentru definirea titlurilor, definirea
coloanelor, realizarea calculelor i stabilirea diverselor opiuni pentru
poziionarea unor arii de lucru pe ecran.
A. Tratarea ntreruperilor
ntreruperea este un eveniment care se produce n timpul execuiei
unei comenzi SELECT, cum ar fi, de exemplu, apariia sfritului de pagin
sau schimbarea valorii unei expresii.
Pentru a specifica evenimentele care determin o ntrerupere i
aciunea corespunztoare SQL care se execut, se utilizeaz comanda
BREAK. Ea poate specifica mai multe evenimente care genereaz o
ntrerupere. Evenimentele sunt reinute ntr-o ordine numit "ierarhie de
ntrerupere". La un moment dat,"se poate executa doar o singur comand
BREAK.
Comanda BREAK are urmtoarele forme sintactice:
BRE[AK] ON {expr | ROW | PAG[E] | REPORT}
[SKI[P] n | [SKIP]PAGE]
[NODUP[LICATES] | DUP[LICATES]];
BRE[AK];

unde:
ON expr determin o ntrerupere cnd se schimb valoarea expresiei expr;
expr este fie o expresie care implic una sau mai multe coloane dintr-o
tabel, fie o etichet ataat unei coloane declarat in comanda SELECT
sau COLUMN.
Dac ON expr apare de mai multe ori n comand, atunci expresiile respect
"ierarhia de ntrerupere", aceasta fiind chiar ordinea n care sunt specificate
expresiile. Cnd se folosete ON expr, trebuie utilizat i clauza ORDER
BY, pentru a ordona rndurile din "ierarhia de ntrerupere*. Ordinea de
apariie a expresiilor expr n comanda BREAK ON trebuie s rte aceeai cu
cea prezent n SELECT...GRDER BY:
ON ROW determin o ntrerupere cnd se selecteaz un rnd cu SELECT.
Aceast ntrerupere este reinut la sfritul ierarhiei de
ntrerupere;
ON PAGE determin o ntrerupere la sfritul fiecrei pagini;
ON REPORT determin o ntrerupere la sfritul raportului sau cererii,
ntrerupere care este reinut la nceputul ierarhiei de ntrerupere.
SKIP determin saltul peste n linii, nainte de a se tipri linia
asociat ntreruperii respective.
PAGE sau SKIP PAGE determin saltul la o pagin nou nainte de a tipri
linia asociat respectivei ntreruperi.
NODUPLICATES determin tiprirea de spaii cnd valorile de JJS coloana
de ntrerupere sunt identice. DUPLICATES determin tiprirea valoarii
coloanei de ntrerupere n fiecare rnd selectat. Valoarea
NODUPLICATES este implicit.
Comanda BREAK fr clauze indic poziia ntreruperii curente.
Exemple:
1) S fie definit o ntrerupere generat de schimbarea valorilor coloanei
FUNCT. La apariia acestui eveniment s fie afiate dou linii vide.
SQL> BREAK ON FUNCT SKIP 2;
SQL> SELECT MARCA,NUME,CODD,
2 SALA, VENS
3 FROM SALARIAI
4 ORDER BY FUNCT;
MARCANUME
FUNCT
7000
ION ION
DIRECTOR
2550
FRINCU ION SEF DEP
1000
COMAN RADU
2500
VLAD VASILE
4000
PAUL TEFAN
3755
DORU DAN

CODD
100000
160000
130000
160000
160000
130000

SALA
45000
36000
35000
36500
35000
36500

VENS
40000
37000
2500
1500
5600
5500

1111
1680
3700
2553
3760
3770
2554
3759
3500
2650
1222

AVRAM ION VINZATOR


RADU ION
MNU DAN
AILENEI FLORIN
SANDU ION
CARMEN ANA
DARIAN GEO
ALEXE IOAN
DAN ION
VLAD ION
BARBU DAN

100000
130000
160000
120000
130000
130000
120000
160000
160000
120000
120000

21200
20750
27500
25000
25600
26500
26000
25700
24500
25060
20750

1000
3000
2500
400
0
2000
350
3500
2000

2) S fie definit o ntrerupere la apariia unei schimbri a valorii coloanei


ODS din tabela SALARIAI. n momentul realizrii evenimentului s se
realizeze salt la pagin nou.
SQL> SET PAGESIZE 11
SQL> BREAK ON CODS SKIP PAGE;
SQL> SELECT * FROM SALARIAT
2 ORDER BY CODS;
MARCA NUME
1111
AVRAM ION
2650
VLAP ION
1222
BARBU DAN

FUNCT
VINZATOR
VINZATOR
VINZATOR

CODD
100000
120000
120000

SALA
21200
25060
20750

MARCA NUME
2550
FRINCU ION
3500
DAN ION
1680
RADU ION

FUNCT
SEF DEP
VINZATOR
VINZATOR

CODD SALA
160000 36000
160000 24500
130000 20750

VENS CODS
1000
1000
3500
2000
VENS CODS
37000 2500
350
3000

MARCA NUME FUNCT CODD SALA VENS CODS VENS CODS


2553
AILENEI FLOR VINZATOR
120000 120000 250000 2000
2554
DARIAN GEO VINZATOR
260000 4000
MARCA
NUME FUNCT CODD SALA VENS CODS
7000
ION ION
DIRECTOR
100000 45000 40000 8000

9records selected.
B. Tiprirea titlurilor
Pentru afiarea unui titlu la sfritul sau la nceputul fiecrei pagini
se utilizeaz comanda BTITLE, respectiv TTITLE. Comanda BTITLE are
urmtoarele sintaxe:
BTI[TLE] [COL[UMN] n1 [SKlP [n]] [TAB n] [LEFT | RIGHT |
CENTER] [FORMAT char] [char | var]...;

BTI[TLE] {OFF | ON};


BTI[TLE] text;
BTI[TLE]
unde:
COL[UMN] n determin saltul la coloana n a liniei curente.
Prin SKIP n se determin saltul Ia nceputul liniei curente, de n ori. Dac n
este omis, se sare o singur dat, iar dac n este zero, se realizeaz
ntorcerea ia nceputul liniei curente.
TAB n are a efect saltul a n coloane (prin coloan nelegndu-se nu o
coloan de tabel, ci poziia cursorului) nainte dac n este pozitiv sau
napoi dac n este negativ.
Clauzele LEFT, RIGHT, CENTER determin alinierea la stnga, la dreapta
respectiv afiarea centrata a datelor din linia curent. Urmtoarele date sunt
aliniate ca an grup, de la nceputul pn la sfritul comenzii PRIN sau la
urmtorul LEFT, CENTER, RIGHT sau COLUMN. CENTER i RIGHT
folosesc valoarea returnat de comanda SET LINESIZE pentru a calcula
poziia urmtorului articol.
FORMAT char specific un model de format pentru articolul de date care
urmeaz; acest format se menine pn la ntlnirea unei alte clauze
FORMAT sau pn la sfritul comenzii. De reinut c doar un singur model
de format poate fi activ la un moment dat. Dac nici un format potrivit nu
are efect, atunci valorile sunt tiprite n conformitate cu formatul specificat
n SET NUMFORMAT iar dac SET UNFORMAT nu a fost utilizat,
valorile vor fi tiprite cu formatul implicit.
Pentru specificarea titlurilor pot fi folosite constante (char) i
variabile (var), ele fiind poziionate i formatate aa cum se specific n
clauzele comenzii.
Existena unui separator indic nceputul unor linii noi, iar doi
separatori pe acelai rnd introduc o linie vid. Iniial, caracterul de separare
este."!", ns el poate fi schimbat cu SET HEADSEP.
SQL*PLUS interpreteaz comanda BTITLE h forma nou dac
primul cuvnt dup numeie comenzii este numele unei clauze valide (LEFT,
SKIP, COL etc.).
Clauzele ON i OFF au ca efect apariia (ON) sau nu (OFF) a
titlului.
BTITLE text afieaz centrat textul specificat.
Comanda BTITLE fr clauze specific titlul curent.
Exemple:

1) S se afieze la sfritul unui raport final cu privire la produsele din


depozitul cu codul 100000, n partea stng irul de caractere "Data:" iar n
partea dreapt "Semntura:".
SQL> SET PAGESIZE 11
SQL> BTITLE LEFT Data: RIGHT Semntura:;
SQL> SELECT FROM PRODUSE
2 WHERE CODD=100000;
CODD
100000
100000
100000
Data:

CODP
D4
A3
A7

DENP
SCAUN
FOTOLIU
MASA

STOC
36
27
23

DATA CRT
UM
10-SEP-05
BUC
15-SEP-05
BUC
05-SEP-05
BUC
Semnatura:

2) S se afieze la sfritul unui raport privind situaia produselor din


depozitul 100000, ncepnd din coloana 11, irul de caractere
"OBSERVATIT.
SQL> BTITLE COL 11 OBSERVAII;
SQL> SELECT * FROM PRODUSE
2 WHERE CODD-100000;
CODD CODP DENP
100000 166666 PLACAJ 2/2
100000 144444 SCAUN D4
100000 111111 MESE 15/20
100000 122222 FOTOLIU A3
100000 133333 CANAPEA A7
100000 155555 BIROU C6X4
OBSERVAII

STOC DATACRT
100
12-JUL-05
36
12-JUL-05
7
27-JUN-05
12
01-JUL-05
6
18-JUL-05
9
29-JUL-05

UM
MP
BUC
BUC
BUC
BUC
BUC

3) S se afieze centrat, la sfritul unui raport privind produsele din


depozitul cu codul 100000, irul de caractere"Depozitul_MOBILA/100000".
SQL> BTITLE CENTER Depozitul_MOBILA/100000
SQL> SELECT CODD "Cod depozit",
2 DENP "Denumire",
3 CODP "Cod produs",
4 STOC "Stoc",DATACRT "Data",
5 UM
6 FROM PRODUSE
7 WHERE CODD=100000;
Cod dep Denumire

Cod produs

Stoc

Data

UM

100000
100000
100000
100000
100000
100000

PLACAJ 2/2
SCAUN D4
MESE 15/20
FOTOLIU A3
CANAPEA A7
BIROU C6X4

166666
144444
111111
122222
133333
155555

100
36
7
12
6
9

12-JUL-05
12-JUL-05
27-JUN-05
01-JUL-05
18-JUL-05
29-JUL-05

MP
BUC
BUC
BUC
BUC
BUC

Depozitul MOBILA/100000

4) S se afieze specificaiile curente pentru BTITLE. Ultima comand


primit n sistem se prezint astfel:
SQL> BTITLE COL 40 Total RIGHT Semntura;
SQL> BTITLE;
btitle ON and is the following 28 characters: COL 40 Total RIGHT Semntura

Comanda TTITLE determin afiarea unui titlu la nceputul paginii


i are urmtoarele sintaxe:
TTI[TLE] [COL[UMN] n] [SKIP [1 | n] [TAB n]
[LEFT | RIGHT | CENTER]
[FORMAT char] [char | var]
TTI[TLEI text;
TTI[TLE];
Clauzele comenzii TTITLE au aceeai semnificaie ca la BTITLE.
Comanda TTITLE fr clauze determin afiarea titlului curent.
Exemplu:
S se afieze la nceputul unui raport privind comenzile cu date mai mic de
30 septembrie 2005, urmtoarele iruri de caractere: "SITUAIA
COMENZILOR" i "LA DATA DE 30-SEP-05". Cele dou iruri se vor
afia centrat, pe dou linii.
SQL> SET PAGESIZE 11 SQL> SET LIN 45
SQL> COLUMN NRCOM FORMAT 99999999
SQL> COLUMN NRCOM JUSTIFY CENTER
SQL> COLUMN CODP FORMAT 99999999
SQL> COLUMN CODP JUSTIFY CENTER
SQL> COLUMN VALOARE FORMAT 99999999999
SQL> COLUMN VALOARE JUSTIFY CENTER
SQL> SET SPACE 7
SQL> TTITLE 'SITUAIA COMENZILOR LA
DATA DE 30-SEP-05"
SQL> SELECT
2 NRCOM,CODP,CANT*PRET VALOARE

3 FROM COMENZI
4 WHERE DATAL<='30- SEP-05;
SITUATIA COMENZILOR LA DATA DE 30- SEP-05
NRCOM
211111
255566
166666
27000

CODP
233333
133333
222222
375000

VALOARE
244444
144444
320000
282000

Anularea opiunilor
n vederea anulrii opiunilor se utilizeaz comanda:
CL[EAR] option
Este anulat opiunea specificat prin option, dup cum urmeaz:
BRE[AKS] anuleaz ntreruperea indicat prin comanda BREAK;
BUFF[ER] determin tergerea textului din buffer-ul curent;
COL[UMNS] anuleaz opiunile indicate n comanda COLUMN;
COMP[UTES] anuleaz opiunile indicate prin comanda
COMPUTE;
SCR[EEN] determin tergerea ecranului, iar SQL determin
tergerea buffer-ului SQL;
TIMI[NG] terge toate zonele create cu comanda TIMING.
Exemple:
1) S se anuleze ntreruperile.
SQL> CLEAR BREAKS;
2) S se anuleze definiiile de coloan.
SQL> CLEAR COLUMNS;
Descrierea coloanelor
Pentru specificarea modului de formare a unei coloane i a capului
de coloan ntr-o situaie, se utilizeaz comanda COLUMN. Sintaxa ei este:
COL[UMN] (col | expr) [ALI[AS] sinonim] CLE[AR] |
DEF[AULT]]
[COLOR
{culoare|
variabila-culoare}]
[FORMAT] format] [HEA[DING] text
[JUS[TIFY] {L[EFT | C[ENTER] | R[IGHT]] [LIKE {expr |
etichet}] [LINEAPP {LINE | MARK | BOTH}]
[NEW_VALUE variabila] [NU[LL] char] [NOPRl[NT] |
PRINT]] [OLD_VALUE variabila]
[ON | OFF]
[PATTERN {numr-de-model | variabila-model}
[WRA[PPED]! WOR[D,... WRAPPED] |
TRU[NCATED]]
...;

unde:
col sau expr au rolul de a identifica coloana sau expresia la care se refer
comanda. Comanda COLUMN trebuie s se refere la o coloan sau la o
expresie utilizat-a n comanda SELECT. Dac comanda COLUMN se refer
la o expresie, aceasta trebuie s fie specificat n acelai mod n care a fost
specificat n SELECT. De exemplu, dac n SELECT expresia este 'A.+B',
nu se poate folosi, n COLUMN, T+A'. Dac sunt selectate din tabele
diferite coloane cu acelai nume, atunci comanda COLUMN se va aplica
tuturor tabelelor ce conin acea coloan.
Clauza ALIAS pune n coresponden numele coloanelor cu sinonimul
specificat.
Clauza CLEAR are ca efect tergerea n totalitate a definiiei coloanei.
Clauza FORMAT specific formatul de apariie ai coloanei. Limea
implicit a coloanei este chiar limea coloanei definite n baza de date. Ea
poate fi schimbat cu valoarea n, folosind "FORMAT An". Limea unei
coloane numerice este implicit valoarea data de NUMWIDTH, ea putnd fi
schimbat cu ajutorul clauzei FORMAT.
Clauza HEADING definete capul coloanei, care implicit este col sau expr.
Dac textul din definirea coloanei conine spaii sau semne de punctuaie,
acestea trebuie puse ntre ghilimele. Fiecare semn "I" din text are ca efect
nceperea unei linii noi.
Clauza JUSTIFY aliniaz capul coloanei. Implicit, alinierea se face la
dreapta pentru o coloan numeric i la stnga pentru alte tipuri de coloane.
Clauza LIKE determin copierea specificaiilor altei coloane sau expresii
(specificaii deja definite prin alt comand COLUMN).
Prin folosirea clauzei NEWLINE se trece la o linie nou, nainte de a afia
valorile coloanei.
Clauzele PRINT i NOPRINT au ca efect tiprirea sau nu a coloanei.
Dac se utilizeaz clauza NULL, textul va fi afiat chiar dac conine o
valoare nul. Valoarea implicit este un ir de blancuri.
Clauzele OFF sau ON determin folosirea, respectiv nefolosirea formatului
specificaiei de ieire pentru o coloan, fr a-i afecta coninutul.
Clauza WRAPPED are ca efect scrierea pe linia urmtoare a caracterelor
care nu au ncput pe prima linie.
Clauza WORD_WRAPPED are efect asemntor cu cel al clauzei
WRAPPED, cu deosebirea c determin scrierea ntregului cuvnt pe linia
urmtoare i nu pe dou rnduri ca la WRAPPED.
Clauza TRUNC determin trunchierea valorii.
Clauza COLOR specific culoarea utilizat pentru afiarea valorilor
coloanei, ntr-o reprezentare liniar sau prin benzi. Variabila CLR n (n=l,60)

se refer la valoarea curent a culorii. Setarea se face prin comanda SET


CLR n.
Clauza LINEAPP stabilete modul de subliniere a coloanei. Utiliznd LINE
dreapta apare continu. Folosind MARK se schieaz doar puncte, iar
BOTH realizeaz ambele modaliti: linie i puncte.
Clauza PATTERN specific modelul pe care-1 va avea dreptunghiul/banda
ntr-un grafic de tip benzi sau sectorul ntr-un grafic de tip cerc. numr-demodel este cuprins ntre 1 i 16 i reprezint un model. Variabila PAT n,
unde ns[l,30] se refer la poziia curent a modelului. Semnificaia valorilor
din numr-de-model i a valorilor PAT n sunt precizate n documentaie.
Numrul de comenzi COLUMN folosite indic faptul c se lucreaz
cu diverse coloane sau expresii utilizate n comanda SELECT. Pentru o
coloan sau expresie pot exista mai multe comenzi COLUMN. n cazul n
care mai multe comenzi COLUMN folosesc aceeai clauz pentru aceeai
coloan, se va lua n considerare doar ultima comand.
Comanda COLUMN fr clauze are ca efect tiprirea definiiilor
coloanei curente. Dac aceast comand are doar clauzele col i expr,
efectul ei const n indicarea definirii coloanei existente.
Trebuie precizat c n prima comanda COLUMN, expresia trebuie s
aib aceeai form ca i n SELECT. n caz contrar, SQL*Plus nu va putea
executa comanda COLUMN pentru coloana respectiv.
Exemple:
1) S se defineasc coloana NUME pe o lime de 25 de caractere iar capul
de coloan s fie scris pe dou rnduri, astfel: NUME PRODUS
SQL> COLUMN NUME FORMAT A25 HEADING 'NUME
PRODUS';
5QL> SELECT DISTINCT(DENP) NUME
2 FROM PRODUSE;
NUME PRODUS
MESE 15/20
FOTOLIU
2 records selected.

2) S se afieze sinonimul SALARIU pentru coloana definit de expresie


aritmetic SALA+VENS. Coloana va fi scris cu formatul $99,999.99.
SQL> COLUMN SALA+VENS ALIAS SALARIU
SQL> COLUMN SALARIU FORMAT $99,999.99
SQL> SELECT SALA+VENS SALARIU,
2 MARCA, NUME
3 FROM SALARIAI;
SALARIU
$22,200.00
$22,750.00

MARCA
1111
1222

NUME
AVRAM ION
BARBU DAN

2 records selected.

3) S se defineasc coloana DENP de 16 caractere alfanumerice, pentru care


se specific sinonimul DENUMIRE . In capul de coloan se va afia textul
"Denumire produs".
SQL> COLUMN DENP FORMAT A16
SQL> COLUMN DENP ALIAS DENUMIRE
SQL> COLUMN DENUMIRE HEADING "Denumire produs"
SQL> SELECT * FROM PRODUSE;
CODD CODP Denumire produs
100000 166666 PLACAJ 2/2
100000 122222 FOTOLIU A3
100000 133333 CANAPEA A7
100000 155555 BIROU C6X4
100000 144444 SCAUN D4
100000 111111 MESE 15/20
6 records selected.

STOC
100
7
36
12
6
9

DATACRT
12-JUL-92
27-JUN-92
12-JUL-92
01-JUL-92
18-JUL-92
29-JUL-92

UM
MP
BUC
BUC
BUC
BUC
BUC

4) S se defineasc coloana DENUM2 cu un format alfanumeric


de trei caractere. Specificaiile pentru aceast coloan sunt
copiate pentru coloana DENP.
SQL> COLUMN DENUM2 FORMAT A3
SQL> COLUMN DENP LME DENUM2
SQL> SELECT * FROM PRODUSE 2 WHERE CODP<138333;
CODD CODP DEN
100000 111111 MES

STOC DATACRT
7
27-JUN-05

UM
BUC

5) S se defineasc coloana ADRESA pe 21 de caractere, utiliznd clauza


WRAPPED.
SQL> COLUMN FORMAT A21 ADRESA WRAPPED
SQL> SELECT STR11 '-' 11NR11 '-' 11 LOC ADRESA 2
FROM CLIENI;
ADRESA
MOILOR- 104-BUCURESTI
DOROBANI- 18-BUCURESTI
GOLENTINA-221-BUCURESTI
EMINESCU-44-BUCURESTI
4 records selected.

D.Realizarea de calcule
SQL*Plus permite realizarea unor calcule cu rndurile selectate din
tabele. Pentru aceasta se utilizeaz comanda COMPUTE, care are
urmtoarea sintax:
COMP[UTE] [AVG | COU[NT] | MAX[IMUM] |
MIN[IMUM] NUMBER) ISDT | SUM | VAR[IANCE}]
OF { expresiei etichet),...
ON [expresiei etichet IPAGE1 REPORT! ROW];
Semnificaia clauzelor este:
Clauza

Semnificaia

AVG
COUNT
MAXIMUM
MINIMUM
NUMBER
STD
SUM
VARIANCE

Valoare medie
Contorizare valori nule
Valoare maxim
Valoare minim
Contorizare rnduri
Abatere standard
Suma valorilor nenule
Dispersia

Tipul coloanei Tipuri de


date
Numeric
Toate tipurile
Numeric i caracter
Numeric i caracter
Toate tipurile
Numeric
Numeric
Numeric

Dac se specific mai multe funcii, nu trebuie separate ntre ele prin
virgul.
OF precizeaz coloana sau expresia ale cror valori se vor supune
calculului. Acestea trebuie s apar n comanda SELECT, altfel comanda
COMPUTE le va ignora. Dac se dorete ca valoarea calculat s nu fie
afiat pe ecran se va utiliza clauza NON PRINT ataat coloanei
respective cu comanda SELECT.
ON specific un element care va fi utilizat ca generator de ntrerupere. El
poate fi: expresie, etichet, pagin (PAGE), raport (REPORT), linie (ROW).
De cte ori se va schimba valoarea acestuia, se va declana automat
recalcularea funciei definite de COMPUTE.
n cazul n care se d comanda fr nici o funcie, se vor afia
specificaiile de calcul definite.
Secvena de instruciuni care se va utiliza, n general, va fi:
SQL* BREAK ON expresiei
SQL> COMPUTE clauza OF expresie2 ON expresiei;
SQL> SELECT
Exemple:
1) S se editeze situaia final cu urmtorul format:
SITUAIE SUM(SALA) FUNCIE
SQL> SET PAGESIZE 22
SQL>RUN
1 SELECT SUM(SALA),FUNCT FROM SALARIAI

2* GROUP BY FUNCT
SITUAIE
SUM(SALA)
45000
179000
268560

FUNCT
DIRECTOR
SEF DEP
VINZATOR

2) S se editeze o situaie final cu salariile grupate pe funcii i depozite.


SQL> RUN
1 SELECT FUNCT,
2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10",
3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13",
4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16"
5 FROM SALARIAI
6 GROUP BY FUNCT;

SITUATIE
FUNCT
DIRECTOR
SEF DEP
VINZATOR

DEP
45000
0
21200

Data:

DEP
0
71500
72850

DEP
0
107500
77700

Semntura:

3) S se afieze o situaie final cu salariile grupate pe funcii i depozite.


De asemenea, s se introduc o coloan cu suma salariilor pe fiecare funcie.
SQL>RUN
1 SELECT FUNCT,
2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10",
3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13",
4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16",
5 SUM(SALA)
6 FROM SALARIAI
7 GROUP BY FUNCT;
SITUATIE
FUNCT
DIRECTOR
SEF DEP
VINZATOR

DEP 10
45000
0
21200

DEP 13
0
71500
72850

DEP 16
0
107500
77700

SUM(SALA)
45000
179000
268500

Data:

Semntura:

4) S se afieze o situaie final cu salariile grupate pe funcii i depozite.


De asemenea, s se fac totalul salariilor pe fiecare depozit i fiecare
funcie.
SQL> BREAK ON DUMMY;
SQL> COMPUTE SUM OF "DEP 100000" ON DUMMY;
SQI> COMPUTE SUM OF "DEP 130000" ON DUMMY;
SQL> COMPUTE SUM OF "DEP 160000* ON DUMMY;
SQL> COMPUTE SUM OF "TOTAL" ON DUMMY;
SQI> COLUMN DUMMY NOPRINT;
SQL> TTITLE CENTER "SITUAIA SALARATILOR"
SKIP CENTER "PE DEPOZITE /FUNCII"
SKIP CENTER " "
SQL> RUN
1 SELECT FUNCT,
2 SUM(DECODE(CODB,lG0000SALA,0)) "DEP 10",
3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13",
4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16",
5 SUM(SALA,)
6 SUM(0) DUMMY
7 FROM SALARIAI
8 GROUP BY FUNCT
SITUATIA SALARIATILOR
PE DEPOZITE / FUNCTII
FUNCT
DIRECTOR
SEF DEP
VINZATOR

Data:

DEP 10
45000
0
21200
66200

DEP 13
0
71500
72850
144350

Semntura:

DEP 16
0
107500
77700
185200

SUM(SALA)
45000
179000
268500

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