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. 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;

ACOS(n)

Arc cosinus de n. Rezultatul este exprimat n radiani.

ASIN(n)

Arc sinus de n.

ATAN

Arc tangent de n.

ATAN2

Arc tangent de n i m sau arc tangent de n/m. Deci ATAN2(n,m) este identic cu ATAN2(n/m). Retureaz numrul ntreg cel mai mic care este mai mare sau egal cu n. Cosinus de n.

CEIL(n)

COS(n)

COSH(n)

Cosinus hiperbolic de n.

EXP(n)

Returneaz o valoare egal cu e ridicat la puterea n, unde e = 2.71828183. Returneaz numrul cel mai mare care este mai mic sau egal cu n. Returneaz logaritmul natural de n, unde n > 0.

FLOOR(n)

LN(n)

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)

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.

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

ROUND (n[,m])

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.

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

SIGN(n)

SIN(n)

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.

SINH

Returneaz sinus hiperbolic

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. Returneaz irul de caractere 'ir' astfel nct toate literele irului sunt de format liter mic.

LOWER ('ir')

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')

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

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

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')

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

UPPER('c1')

Tabelul 3.3 Funciile caracter care returneaz valori numerice


Funcia ASCII ('c1') Rolul funciei Returneaz valoarea zecimal a primului caracter din irul 'c1'. 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 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')

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

LENGTH

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. 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') )

LAST_DAY (d)

Returneaz data ultimei zile din lun.

MONTHS_ BETWEEN (d1, d2)

Returneaz numrul de luni dintre datele d1

NEXT_DAY (d, 'c1')

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.

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

ROUND (d[,fmt])

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

SYSDATE

TRUNC (d,[fmt])

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

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] ) 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;

HEXTOROW('c1')

RAWTOHEX(raw) ROWIDTOCHAR (rowid)

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

este tot impul un ir de 18 caractere. TO_CHAR pentru conversie de caractere, are sintaxa: TO_CHAR (d [, fmt]) TO_CHAR pentru conversie de numere, are sintaxa: TO_CHAR (n [, fmt]) CHARTOROWID ('c1') Convertete data d de tip DATE la o valoare de tip VARCHAR2 n formatul specificat.

ROWID -----------------AAAAZ6AABAAABr1AAB 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;

Convertete numrul n de tip NUMBER la o valoare de tip VARCHAR2. Convertete o valoare de tip CHAR sau VARCHAR2 la o valoare de tip ROWID

TO_DATE ('c1' [, fmt ])

TO_NUMBER ('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.

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 9999 0999 9990 Semnificaia elementului fmt Nr. semnificativ de digii care vor fi afiai Afieaz 0 n faa sau dup digiii semnificativi

$ B MI S D G , . RN sau rn

$999 B999 999MI S999 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 D DAY DD DDD HH sau HH12 HH24 J MI MM MON MONTH PM sau P.M. RR sau RRRR SS SSSS WW W YYYY,YYY,YY,Y Se specific n TO-DATE Da Da Da Da Nu Da Da Da Da Da Da Da Da Da Da Da Nu Da da Da 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]]]) 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();

EMPTY_ [B|C]LOB()

BFILENAME ('director', 'nume_fiier')

INSERT INTO tab1 VALUES (BFILENAME('lob_dir1',foto1.gif')) ;

GREATEST (expr [,expr] ...)

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)

UID USER

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. Returneaz informaii despre sesiune curent.

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

USERENV (option)

VSIZE(expr)

Returneaz lungimea n baii a expresiei expr.

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 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

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)

Returneaz maximul din expresia expr.

MIN([DISTINCT|ALL] expr)

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 MARCA NUME 2550 FRINCU ION 3500 DAN ION 1680 RADU ION FUNCT VINZATOR VINZATOR VINZATOR FUNCT SEF DEP VINZATOR VINZATOR CODD 100000 120000 120000 SALA 21200 25060 20750 VENS CODS 1000 1000 3500 2000 VENS CODS 37000 2500 350 3000

CODD SALA 160000 36000 160000 24500 130000 20750

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 AVG COUNT MAXIMUM MINIMUM NUMBER STD SUM VARIANCE Semnificaia 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 Data: DEP 45000 0 21200 DEP 0 71500 72850 Semntura: DEP 0 107500 77700

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 DEP 10 45000 0 21200 66200 DEP 13 0 71500 72850 144350 DEP 16 0 107500 77700 185200 SUM(SALA) 45000 179000 268500

Data:

Semntura:

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