Sunteți pe pagina 1din 74

CURS ORACLE

SQL si PL/SQL
SUPORT DE CURS

Data crearii:

11 Decembrie 2009

Autor:

Bogdan Oltei

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

Cuprins

Cuprins........................................................................................................ 2
1. INTRODUCERE - EVOLUTIA SI FACILITTILE SISTEMULUI ORACLE.............4
2. CONCEPTE GENERALE..............................................................................7
3. PREZENTAREA UNELTEI DE MANIPULARE A BAZEI DE DATE (PL/SQL
Developer)................................................................................................... 8
4. OBIECTELE SCHEMEI BAZEI DE DATE.....................................................12
5. TIPURI DE DATE.....................................................................................15
6. PRODUSELE ORACLE UNELTE DE DEZVOLTARE (RAPOARTE SI FORME) 17
7. SELECTAREA DATELOR DIN BAZA DE DATE............................................18
7.1 COMANDA SELECT........................................................................18
7.2 UTILIZAREA CLAUZEI FROM...........................................................20
7.3 DELIMITATORI...............................................................................21
7.4 UTILIZAREA CLAUZEI WHERE........................................................23
7.5 UTILIZAREA CLAUZEI ORDER BY - ordonarea liniilor rezultate in
urma unei cereri..................................................................................25
7.6 UTILIZAREA CLAUZEI GROUP BY - functii de grupare.....................26
7.7 SELECTAREA DATELOR DIN MAI MULTE TABELE.............................27
7.8 REALIZAREA CERERILOR INCLUSE.................................................28
7.9 Functii de conversie......................................................................30
7.10 Functii de prelucrare caractere.....................................................30
7.11 Functii aritmetice........................................................................32
7.12 Functii pentru prelucrarea datelor calendaritice..........................33
7.13 Functii generale...........................................................................33
7.14 Functii de grup............................................................................34
7.15 OPERATORUL ROLLUP..................................................................34
7.16 OPERATORII PENTRU MULTIMI......................................................35
7.17 OPERATII PE TABELE STRUCTURATE ARBORESCENT....................36
7.18 STRUCTURA SINTAXA CASE SI WITH............................................36
8. LIMBAJ DE DEFINIRE A DATELOR...........................................................38
8.1
8.2
8.3
8.4
8.5
8.6
8.7

CREATE CREATE............................................................................38
COMANDA ALTER...........................................................................39
COMANDA DROP...........................................................................39
COMANDA INSERT.........................................................................40
COMANDA UPDATE........................................................................41
COMANDA DELETE........................................................................42
COMANDA TRUNCATE.....................................................................43

9. LIMBAJ DE CONTROL AL DATELOR..........................................................45


10. CREARE, UTILIZARE, STEGERE VIZUALIZARI.......................................46
11. INTRODUCERE IN PL/SQL....................................................................49
11. 1 CE ESTE PL/SQL?.......................................................................49
11. 2 AVANTAJELE PL/SQL..................................................................49

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

11. 3 STRUCTURA PL/SQL..................................................................50


11. 4 FACILITATILE PL/SQL..................................................................51
11. 5 SINTAXA DE BA ZA A PL/SQL.....................................................51
11.5. 1 BLOCURI INCLUSE.....................................................................52
11.5.2 TIPURI DE DATE SCALARE.........................................................53
11. 6 DECLARAREA VARIABILELOR.......................................................54
11.7 DECLARAREA CONSTANTELOR.....................................................55
11.8 ATRIBUIRILE SI EXPRESIILE...........................................................55
11.9 STRUCTURA DE CONTROL............................................................56
11.9.1 TIPURI DE DATE COMPUSE.........................................................57
11.10 TRIGGERI - DECLANSATOARE.....................................................59
11.11 CURSOARE descriere si utilizare..............................................60
11.12 PROCEDURI SI FUNCTII...............................................................64

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

1. INTRODUCERE - EVOLUTIA SI FACILITTILE SISTEMULUI


ORACLE
Oracle este un sistem de gestiune a bazelor de date complet
relational, extins, cu facilitati din tehnologia orientata obiect
(OO). Sistemul Oracle este realizat de firma Oracle
Corporation care a fost infiintata in anul 1977 in SUA California si acum este cel mai mare furnizor de software de
gestiunea datelor. Acesta este operational pe toata gama de
calculatoare (micro, mini, mainframe) sub diverse sisteme de
operare.
Prima versiune de SGBD Oracle a fost realizata la sfarsitul
anilor '70 respectand teoria relationala. In cadrul sistemului a
fost implementat de la inceput limbajul relational SQL pe care
l-a dezvoltat ulterior fata de versiunea standard rezultand
SQL*Plus.
Incepand cu versiunea 5. 0 SGBD Oracle are urmatoarele
facilitati
suplimentare:
functioneaza
in
arhitectura
client/server; are limbaj procedural propriu PL/SQL; are
recompilatoare ca interfata cu limbajele universale.
In iunie 1997 s-a lansat SGBD Oracle versiunea 8. 0, inclusiv
in Romania, care a marcat o noua generatie de baze de date
Oracle deoarece initiaza trecerea de la arhitectura
client/server la arhitectura NC (Network Computing), are o
mare deschidere, are optimizari performante si pune accent
mai mare pe analiza (modelare-functionalitate) fata de
programare (codificare).
In noiembrie 1998 s-a lansat SGBD Oracle 8i ca sistem de
baze de date pe Internet. Aceasta versiune are urmatoarele
caracteristici:

Este reproiectat arhitectural in mod fundamental si se


incadreaza in tendinta de trecere de la arhitectura
client/server la arhitectura NC;

Permite dezvoltarea unei baze de date de orice


dimensiune, in mod centralizat sau distribuit;

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

Are facilitati
inteligente;

Permite partitionarea integrala pentru tabele si indecsi;

Are mesagerie integrala, prin comunicarea intre aplicatii


si procesare offline (chiar daca aplicatiile nu sunt
conectate);

Prelucrarea paralela
regasire, actualizare;

Ofera facilitati din tehnologia OO, prin care se permite


definirea si utilizarea de obiecte mari si complexe;

Optimizeaza cererile de regasire prin reutilizarea


comenzilor SQL identice lansate de utilizatori diferiti si
prin realizarea unui plan de executie a instructiunilor
SQL;

Are un grad de securitate sporit prin: server de criptare,


control trafic retea, niveluri de parolare etc. ;

Permite lucrul cu depozite de date (Data Warehouse)


care contin date multidimensionale (cu tehnologia
OLAP);

Contine foarte multe produse ceea ce-l face sa fie o


platforma pentru baze de date: servere (Oracle 8,
Application,
Security,
Internet
Commerce
etc),
instrumente (Designer, Developer, Express, WebDB
etc), aplicatii (Financials, Projects, Market Manager,
Manufacturing etc);

Este primul SGBD pentru Internet cu server Java inclus;

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

de

salvare/restaurare

pentru:

automate

replicare,

cereri

si

de

Reduce drastic costurilor pentru realizarea unei


aplicatii(de cca 10 ori fata de versiunea anterioara);

Este o platforma multipla permitand lucrul pe orice


calculator, orice sistem de operare, orice aplicatie, orice
utilizator;

Are instrumente diverse pentru dezvoltarea aplicatiilor:


bazate pe modelare (Designer, Developer, Application
Server), bazate pe componente (Java), bazate pe HTML
(browsere, editoare Web) si XML, prin programare:
proceduri stocate (PL/SQL, Java), obiecte standard,
obiecte ODBC, obiecte JDBC, fraze SQL etc., tip internet
(WebDB);

Ofera servicii multiple de Internet (Web,


e_bussines, etc) integrate cu servicii Intranet.

E_mail,

Ulterior a fost lansat sistemul Oracle 9i care a marcat trecerea


la o noua generatie de servicii internet. El este mai mult decat
un suport pentru baze de date deoarece ofera o infrastructura
completa de software pentru afaceri electronice (e-business)
si ruleaza pe o varietate de sisteme de calcul si de operare:
SUN-SOLARIS, HP-UX, IBM-AIX, PC_WINDOWS, XX-LINUX.
Componenta Oracle WebDB a evoluat in Oracle Portal.
Oracle 9i DATABASE are fata de versiunea anterioara o
protectie ridicata si automatizata, iar costul administrarii
bazei de date scade in mod drastic.
Oracle 9i REAL APPLICATION CLUSTERS (RAC) se bazeaza pe o
noua arhitectura de BD numita imbinare ascunsa (Cache
Fusion). Aceasta este o noua generatie de tehnologie de
clustere. Conform acestei arhitecturi la adaugarea unui
calculator inr-o retea cu BD Oracle, clusterele se adapteaza
automat la noile resurse, fara sa fie necesara redistribuirea
datelor sau rescrierea aplicatiei. Posibilitatea aparitiei unei
erori la o configuratie cu 12 calculatoare sub Oracle 9i RAC
este foarte mica, esimata ca durata in timp la cca 100. 000 de
ani.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

In Oracle 9i APPLICATION SERVER se pot creea si utiliza


aplicatii Web care sunt foarte rapides i permit integrarea
serviciilor de Internet.
Oracle 9i DEVELOPER SUITE este un mediu complet pentru
dezvoltarea aplicatiilor tip afaceri electronice (e-business) si
tip Web. El se bazeaza pe tehnologiile Java si XML si permite
personalizarea (Oracle Personalization).
In anul 2003 a fost lansata versiunea Oracle 10g care adauga
noi facilitati sistemului Oracle 9i.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

2. CONCEPTE GENERALE
In 1974 a fost lansat proiectul System/R de catre firma IBM. Tot
in acest an a aparut limbajul structurat de programare SEQUEL
(Structured English as Query Language) autori fiind Chamberlin
si Boyce.
In 1976 apare un nou limbaj SEQUEL 2 care a fost declarat
limbajul de interogare al SGBD System/R. Denumirea limbajului
este schimbata de Chamberlin in SQL (Structured Query
Language) in anul 1980. Ulterior limbajul a fost perfectionat
fiind considerat cel mai raspandit limbaj de interogare a
bazelor de date relationale.
Institutul National pentru Standarde in anul 1982 a lansat un
proiect de lucru pentru standardizarea limbajelor de interogare
care a fost finalizat in 1986 aparand standardul ANSI SQL-86.
Acesta defineste comenzile de baza ale SQL, dar nu contine
partea de actualizare si acordarea drepturilor de acces la o
baza de date.
Prin revizuire acest limbaj apare in 1989 SQL-1 ca fiind limbajul
fundamental al SGBD ralationale. In 1992 apare versiunea SQL2 care ofera noi facilitati cum ar fi:
-

jonctiune externa,

implementarea restrictiei referentiale,

modificarea schemei bazei de date, etc.

Cel mai recent standard este SQL-3 care a fost lansat in anul
1999, acesta este considerat un limbaj complet in vederea
definirii si gestiunii obiectelor complexe. Se considera ca prin
publicarea standardului propus in acest an a fost depasita
bariera relationalului, el fiind mult mai mult decat un
instrument de consultare a bazelor de date.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

3. PREZENTAREA UNELTEI DE MANIPULARE A BAZEI DE DATE


(PL/SQL Developer)
Asa cum s-a descris in documentul de conectare la baza de
date, fereastra de mai jos este cunoscuta si vom executa pasii
stiuti.

Se introduce userul si parola bazei de date si apoi se alege din


lista, baza la care dorim sa ne conectam.
Dupa ce se accepta userul si parola, aplicatia este activa, iar
ecranul principal este descris in imaginea alaturata.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

10

Meniul uneltei PL/SQL Developer este unul relativ comun


pentru operatiile minimale dar este si destul de complex in
cazul unei aprofundari mai amanuntite.
Astfel vom descrie meniul pe componente principale:
a) Meniul principal este cel din bara cea mai de sus.
b) Meniu de acces rapid (shortcut-uri).
c) In parea stanga jos se afla meniul de obiecte.
d) In centru se afla ecranul de vizualizare.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

11

Pentru a deschide o fereastra se apasa pe butonul NEW


iar apoi din lista aparuta se alege SQL WINDOW:

Astfel in partea ecranului de vizualizare va aparea un ecran


pentru interogare SQL. In aceasta fereastra se vor scrie
interogarile dorite.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

12

O interogare simpla se scrie in

ecran , iar pentru

vizualizarea datelorse apasa pe butonul RUN


poate apasa F8 de la tastatura.

, sau se

Exemplu simplu de interogare :

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

13

PL/SQL Developer este o unealta usor de utilizat si ofera o


miltime de facilitati itlizatorilor, printre care amintim :
-

Interogare simpla a bazei de date (sql window)

Creare de rapoarte in mod vizualizare (report window)

Ofera posibilitatea de import \export date , tabele sripturi

Ofera posibilitatea de a gestiona cu usurinta datele.

Etc.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

14

4. OBIECTELE SCHEMEI BAZEI DE DATE

SQL este un limbaj neprocedural si opereaza asupra datelor


normalizate. Conceptele necesare a fi cunoscute pentru lucrul
cu acest limbaj sunt: tabela, cheie primara, coloana, rind,
viziune, index, sinonim, cluster, baza de date relationala,
comanda, blocul, cererea, raportul etc.
Asa cum am descris anterior, exista un meniu cu obiecte ale
bazei de date:

Tabela sau relatia este un ansamblu format din n coloane


(atribute/subansambluri) si m randuri (tupluri/linii) care
respecta urmatoarele conditii minime:

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

15

nu contine date la nivel agregat (valorile aflate la


intersectia liniilor cu coloanele sa fie la un nivel elementar);

liniile sunt distincte unele fata de altele; nu contine coloane


repetitive in descriere.

Cheia primara este un atribut care are valori distincte. Deci,


fiecare linie se identifica printr-o valoare distincta. Doua sau
mai multe attribute care pot fi chei primare se numesc chei
candidate.
Coloana tabelei este formata din valorile pe care le ia
atributul in liniile tabelei respective.
Randul/tuplul/linia este format din valorile coloanelor ce se
refera la o entitate a tabelei.
Baza de date relationala este un ansamblu de tabele
normalizate, grupate in jurul unui subiect, in principiu, bine
definit. Intr-o baza de date relationala, entitatile si legaturile
sunt transpuse in tabele.
Pentru realizarea unor operatii sau pentru a utiliza in cereri
nume mai scurte, se pot defini sinonime ale unor nume de
tabele sau viziuni (views).
Viziunea (view) este o tabela logica si reprezinta o fereastra la
date, dintr-una sau mai multe tabele.
Pentru ca accesul la date sa se faca mai rapid, se utilizeaza
indexarea.
Un index reprezinta o cheie pe una sau mai multe coloane.
Indexarea este dinamica deoarece se pot adauga sau sterge
indecsi oricind, fara ca datele memorate sau aplicatiile scrise
sa fie afectate.
Un cluster reprezinta o anumita modalitate de grupare a
randurilor uneia sau mai multor tabele. Aceasta grupare
mareste viteza de executie a unor operatii consumatoare de
timp.
Comanda este o instructiune emisa din SQL*Plus catre o baza
de date Oracle.
Blocul reprezinta un grup de instructiuni SQL si PL/SQL.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

16

Cererea este o comanda SQL (SELECT) care regaseste date


din baza de date. Rezultatul cererii il formeaza datele regasite
din baza de date.
Numele unei baze de date, al unei tabele, coloane sau variabile
utilizator trebuie sa aiba lungimea intre 1 si 30 caractere. Un
nume nu poate contine apostrofuri. Cu atit mai putin, un nume
utilizat intr-o comanda nu va fi introdus intre apostrofuri.
Literele mici si mari sunt echivalente (nu se face distinctia intre
literele mici si mari). Un nume trebuie sa inceapa cu o litera, sa
contina numai anumite caractere (A-Z, 0-9, $, #, @, -), sa nu
duplice numele unui alt obiect de acelasi tip si sa difere de un
cuvant rezervat ORACLE.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

17

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

18

5. TIPURI DE DATE
Pentru memorarea datelor numerice, tipurile cele mai
frecvent folosite sunt: NUMBER, INTEGER, FLOAT, DECIMAL.
Pentru memorarea irurilor de caractere, cele mai frecvent
tipuri de date utilizate sunt: CHAR, VARCHAR2 i LONG.
Exist restricii referitoare la folosirea tipului de date LONG.
- ntr-un tabel poate s fie o singur coloan de tip LONG.
- Nu pot fi comparate dou iruri de caractere de tip LONG.
- O coloan de tip LONG nu poate fi parametru ntr-o
procedur.
- O funcie nu poate ntoarce ca rezultat o valoare de tip
LONG.
- O coloan de tip LONG nu poate fi folosit n clauzele
WHERE, ORDER BY, GROUP BY, CONNECT.
- Operatorii sau funciile Oracle nu pot fi folosii n SQL pentru
a modifica coloane de tip LONG.
- O coloan de tip LONG nu poate fi indexat.
Alte tipuri de date scalare furnizate de SQL sunt NCHAR i
NVARCHAR2, folosite pentru reprezentarea caracterelor
limbilor naionale.
Informaii relative la timp sau dat calendaristic se obin
utiliznd tipul DATE. Pentru fiecare dat de tip DATE sunt
depuse: secolul, anul, luna, ziua, ora, minutul, secunda. Pentru
o coloan de tip DATE sistemul rezerv 7 bytes, indiferent
dac se memoreaz doar timpul, sau doar data calendaristic.
Formatul implicit al datei se definete cu ajutorul parametrului
de iniializare NLS_DATE_FORMAT. n general, acest parametru
este setat la forma DD-MON-YY. Dac nu este specificat
timpul, timpul implicit este 12:00:00.
n Oracle8, alturi de aceste tipuri scalare, au fost introduse
tipurile de date LOB (Large Objects), care specific locaia
unor obiecte de dimensiuni mari.
Oracle9i introduce noi tipuri de date pentr timp:
- TIMESTAMP (precizie_fraciuni_secund) cuprinde valori
pentru anul, luna i ziua unei date calendaristice, dar i valori
pentru or, minut, secund.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

19

- INTERVAL YEAR (precizie_an) TO MONTH stocheaz o


perioad de timp specificat n ani i luni, unde precizie_an
reprezint numrul de cifre din cmpul YEAR.
- INTERVAL DAY (precizie_zi) TO SECOND (prec_fraciuni_sec)
stocheaz o perioad de timp reprezentat n zile, ore, minute
i secunde.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

20

6. PRODUSELE ORACLE UNELTE DE DEZVOLTARE (RAPOARTE SI


FORME)
Realizarea unui raport care sa arate asa cum dorim este o
sarcina destul de dificila, din cauza multiplelor modalitati in
care se pot combina datele extrase din baza de date. Reports
Builder este folosit pentru a realize rapoarte profesionale, cu
un design de calitate. Se pot crea rapoarte intro combinatie de
stiluri si se pot lista intr-o varietate de formate, inclusiv HTML,
XLS sau PDF.
Fundamentul rapoartelor sunt datele extrase din baze de date
Oracle sau non-Oracle cu ajutorul interogarilor SQL. Oracle
Reports presupune 3 componente care conlucreaza, dar
considerate oarecum distincte: Reports Builder, Reports
Compiler si Reports Runtime.

Exista 2 tipuri astfel de elemente: grupuri de inregistrari


(record groups), cuprinzand datele fundamentale ale
raportului si grupuri de separare (break groups) folosite
pentru a concura o structura ierarhica intr-un raport si deci a
imparti datele in subgrupuri tinand seama de anumite criterii.
Suprafata imprimabila are 3 zone mari:
- Header (inceputul raportului);
- Main (zona principala a raportului);
- Trailer (zona finala a raportului).
Regiunile Body and Margins definesc cuprinsul, antetul si
subsolul paginii.
Reprezentarea vizuala a datelor are loc prin plasarea pe raport
a unor obiecte de tip Field. Datele sunt insotite de texte
explicative si de reprezentari grafice diverse.
De asemenea in raport se pot adauga imagini bitmap, spre a
le spori expresivivitatea. Delimitarea grupurilor de inregistrari
se efectueaza cu ajutorul obiectelor de tip Frame (chenar sau
cadru) ce alcatuiesc la randul lor o ierarhie.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

21

7. SELECTAREA DATELOR DIN BAZA DE DATE


7.1 COMANDA SELECT
Pentru a selecta datele din una sau mai multe tabele se
utilizeaza comanda SELECT a carei sintaxa este:
SELECT [ALL |
DISTINCT] {[numetabela. ]* |
expr [sinonim], expr [sinonim], }
FROM nume-tabela [@ legatura]
[sinonim], nume-tabela [@
legatura][sinonim],
[WHERE conditie]
[ CONNECT BY conditie [START WITH conditie] ]
[ GROUP BY { expr, expr.. | CUBE ( expr, expr..
) | ROLLUP ( expr, expr ) } ] [HAVING conditie]
[ {UNION | INTERSECT | MINUS} SELECT]
[ ORDER BY {expr | numar-pozitie} [ASC
| DESC] {expr | numar-pozitie}[ASC |
DESC],
[ FOR UPDATE OF nume-col, nume-col, [NOWAIT] ];
Clauzele comenzii trebuie utilizate in ordinea specificata in
sintaxa, exceptie facand clauzele CONNECT BY, START WITH,
GROUP BY si HAVING (care pot fi specificate in orice ordine).
Clauzele ORDER BY si FOR UPDATE OF pot fi schimbate intre
ele.
Clauza ALL determina afisarea tuturor randurilor rezultate in
urma
cererii, spre deosebire de clauza DISTINCT care determina
eliminarea
duplicatelor, afisind doar randurile distincte. Utilizarea
caracterului
asterisc (*) are ca efect selectarea tuturor coloanelor din
tabela
specificata prin clauza FROM, in ordinea in care au fost
definite
la
creare.
In situatia finala, fiecare expresie formulata in comanda devine

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

22

un nume de coloana. Totodata, orice sinonim, daca este


specificat, este folosit in scopul etichetarii expresiei
precedente din tabela afisata. Daca sinonimul contine blancuri
sau caractere speciale cum sunt + si -, trebuie incluse
intre apostrofuri. Pentru a evita ambiguitatea, in cazul in care
tabelele contin coloane cu acelasi nume, este necesara
calificarea coloanelor cu numele tabelei.
Identificarea tabelelor in care trebuie cautate datele
corespunzatoare coloanelor specificati se face prin specificarea numelor
lor
dupa
clauza FROM. In locul numelor de tabele se pot folosi sinonimele
acestora.
Clauza WHERE specifica o conditie care este folosita pentru a
selecta randurile.
Clauza CONNECT BY indica faptul ca randurile formeaza o
structura arborescenta. Prin aceasta clauza sunt definite
relatiile
necesare
pentru a conecta randurile tabelei intr-un arbore. Operatorul
PRIOR
folosit inaintea uneia din cele doua parti ale conditiei,
defineste
nodul
parinte iar in cealalta parte nodul fiu.
Clauza START WITH, prin specificarea unei conditii care
trebuie satisfacuta, stabileste randul folosit ca radacina a
arborelui.
Daca se omite, comanda SELECT va returna o serie de arbori
incepand cu fiecare rand selectat. Existenta clauzei CONNECT
BY intr-o comanda SELECT permite utilizarea pseudocoloanei
LEVEL, care returneaza valoarea 1 pentru nodul radacina, 2
pentru fiii nodului radacina, 3 pentru nepoti etc.
Clauzele GROUP BY si HAVING determina afisarea unor
informatii sintetice despre grupuri de randuri care au aceeasi
valoare in una sau mai multe coloane. Aceste coloane sunt, in
general, functii de grup.
ROLLUP activeaza o comanda SELECT pentru a calcula mai
multe niveluri de subtotaluri dintr-un grup specificat de
dimensiuni. Calculeaza de asemenea si un total general.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

23

ROLLUP este o extensie simpla a clauzei GROUP BY, deci


sintaxa este foarte usor de folosit. Extensia ROLLUP este
foarte eficienta si nu ingreuneaza o cerere. Rolul extensiei
ROLLUP este foare clar: creaza subtotaluri care pornesc de la
cel mai detaliat nivel pana la un total general dupa gruparea
care a fost precizata in clauza ROLLUP.
CUBE actioneaza asupra unui grup specificat de coloane si
creaza subtotaluri pentru toate combinatiile posibile intre
acestea.
Daca
sa specificat de exemplu: CUBE (timp, regiune, department),
rezultatul va include toate valorile care ar fi incluse intr-un
ROLLUP plus combinatii aditionale.
Pentru a combina rezultatele a doua comenzi SELECT intr-un
singur rezultat, se folosesc operatorii UNION, INTERSECT si
MINUS.
UNION returneaza rezultatele obtinute de la fiecare cerere
in parte,
INTERSECT returneaza doar rezultatele comune celor doua
cereri iar
MINUS returneaza rezultatele obtinute de la prima cerere si
care nu apar in urma celei de a doua selectii.
Pentru a putea folosi aceste clauze este necesar ca numarul si
tipul
coloanelor selectate de fiecare comanda SELECT sa fie
aceleasi,
lungimile lor putand fi diferite. Daca sunt combinate mai mult
de
doua
comenzi SELECT, ele vor fi evaluate de la stinga la dreapta.
Pentru
a
schimba ordinea de evaluare pot fi folosite parantezele.
Totodata,
cei
trei
operatori impun utilizarea cuvantului DISTINCT in toate
comenzile
SELECT.
Clauza ORDER BY specifica ordinea in care trebuie returnate
randurile distincte ale unei tabele.
Clauza FOR UPDATE determina blocarea randurilor selectate
ale tabelei astfel incat acestea nu vor mai putea fi

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

24

actualizate de alti utilizatori pana la deblocarea lor cu una


din comenzile COMMIT sau ROLL BACK.
Comanda SELECT... FOR UPDATE trebuie urmata de una sau mai
multe comenzi UPDATE... WHERE. Daca se foloseste clauza
NOWAIT, selectia este considerata terminata chiar daca
randurile selectate de FOR UPDATE nu pot fi blocate
deoarece alt utilizator lucreaza cu ele.

7.2 UTILIZAREA CLAUZEI FROM


Pentru a selecta una sau mai multe tabele si pentru a
specifica, eventual, identificatorul proprietarului si legatura cu
reteaua se foloseste secventa:
SELECT...
FROM [ident-proprietar] tabela [@LINK],... ;
Exemple:
a) Sa se selecteze toate coloanele din tabela employees:
Select * from hr.employees _;

sau
Select * from employees _;
sau
Select all from employees _;

b) Sa se selecteze coloanele EMPLOYEE_ID, FIRST_NAME,


LAST_NAME, EMAIL, SALARY :
select
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
EMAIL,
SALARY
from employees
c) sa se selecteze coloana PHONE_NUMBER din tabela
EMPLOYEES:
Select PHONE_NUMBER from EMPLOYEES_;

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

25

d) sa se selecteze in mod distinct coloana SALARY din tabela


EMPLOYEES:
Select distinct SALARY SALARIU from EMPLOYEES_;
7.3

DELIMITATORI
Delimitatorii sunt simboluri sau simboluri compuse, care au o
semnificatie speciala pentru PL/SQL. Veti recunoaste multe
dintre acestia ca operatori pentru SQL.
Simboluri simple caracter

Acestea sunt formate dintr-un singur

+
operatorul de adunare
operatorul de scadere/negare
*
operatorul de multiplecare
/
operatorul de impartire
=
operator relational
>
operator relational
<
operator relational
)
delimitator de lista sau expresii
(
delimitator de lista sau expresii
;
delimitator de instructiuni
, separator de obiect
.
selector de componenta
@
delimitator de access la distanta
'
delimitator de sir
:
delimitator de masina
Simboluri Compuse - sunt formate din doua caractere
**
exponential
<>
relational
!=
relational
^=
relational
<=
relational
>=
relational
:=
asignare
=>
asociere
.. rang
||
concatenare
<<
eticheta
>>
eticheta

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

26

-/*
*/

comentariu
comentariu
comentariu

Like operator relational


Not Like operator relational
Between... and .... operator pentru expresii
Is null operator relational
In ()
operator pentru expresii, multimi
Retineti ca spatiile nu sunt permise intre cele doua
caractere ale simbolurilor combinate.
Exemple :
Sa se selecteze numele si prenume si salariul marit cu 300
select firt_name, last_name, salary +300
from employees
Sa se selecteze numele si prenume si salariul micsorat cu 300
select firt_name, last_name, salary -300
from employees
Sa se selecteze numele si prenume si salariul dublat
select firt_name, last_name, salary *2
from employees
Sa se selecteze numele si prenume si salariul injumatatit
select firt_name, last_name, salary /2
from employees

7.4 UTILIZAREA CLAUZEI WHERE


Operatorii SQL*Plus pot aparea in orice parte a unei comenzi

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

27

si au intaietate fata de orice alt tip de operatori. Operatorii


aritmetici si logici sunt utilizati pentru formularea
conditiilor de selectie.
SELECT EMPLOYEE_ID , SALARY
FROM EMPLOYEES
WHERE SALARY = x
Aceasta este o interogare simpla in care am folosit clauza where
.
Exemple:
a) Sa se selecteze toate inregistrarile din tabela employees
care au salariul mai mare strict ca 4800 :
select * from employees
where salary_>4800
b) Sa se selecteze din tabela employees inregistrarile care sunt
corespund departamentului 50
select * from employees
where department_id=50
c) Sa se selecteze numele, prenumele, salariul si id-ul
managerului pentru inregistrarile angajatilor cu nume care
incep cu litera D. :
select
FIRST_NAME,
LAST_NAME , MANAGER_ID
from employees
where first_name like 'D%'
sau
select
FIRST_NAME,
LAST_NAME , MANAGER_ID
from employees
where first_name = 'D%'

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

28

d) Sa se selecteze toate inregistrarile din tabela employee care


nu au manager_id:
select * from employees
where employee_id is null
e) Sa se selecteze toate inregistrarile care au
salariul intre 1000 si 5000
select *
from employees
where salary between 1000 and 5000
sau
select *
from employees
where salary <5000
and salary >=1000
Folosirea aliasului pentru coloane , se foloseste pentru
redenumirea coloanei. Se foloseste foarte mult in cazut in care
coloanele afisate sunt coloane calculate.
select
FIRST_NAME,
LAST_NAME ,
MANAGER_ID id_manager
from employees
Exemplu:
Sa se afiseze id-ul angajatului , numele si prenumele si salariul
dublat cu alias pentru coloana salariu dublat sa fie salariul
nou
select
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME ,

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

29

SALARY*2 SALARIUL_NOU
from employees
Concatenarea coloanelor:
Concatenarea coloanelor este folosita uzual si se utilizaeaza
caracterele ||:
Exemplu :
Sa se afiseze id-ul angajatului , numele si prenumele
concatenate si salariul .
select
EMPLOYEE_ID,
FIRST_NAME || LAST_NAME ,
SALARY
from employees
Sa se afiseze id-ul angajatului , numele si prenumele
concatenate dar avand intre ele caracterul spatiu si salariul .
select
EMPLOYEE_ID,
FIRST_NAME || || LAST_NAME ,
SALARY
from employees
Sa se afiseze id-ul angajatului , numele si prenumele
concatenat dar avand inte ele caracterul spatiu si sa aiba ca
nume de coloana nume_prenume si salariul .
select
EMPLOYEE_ID,
FIRST_NAME || || LAST_NAME nume_prenume,
SALARY
from employees
7.5 UTILIZAREA CLAUZEI ORDER BY - ordonarea liniilor rezultate in
urma unei cereri
Limbajul SQL*Plus are posibilitatea ordonarii crescatoare sau
descrescatoare a liniilor rezultate in urma unei cereri. Aceasta
operatie se realizeaza prin intermediul secventei:

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

30

SELECT... FROM... WHERE...


ORDER BY {expr | numar-pozitie} [ASC | DESC], ;
unde:
expr reprezinta o expresie care face referire la una sau
mai
multe
coloane; numar-pozitie este un numar care identifica pozitia
coloanei
din
comanda
SELECT, dupa
care
se
doreste
sortarea.
Utilizarea
operatorului de tipul UNION, INTERSECT sau MINUS
impune
prezenta argumentului numar-pozitie. ASC sau DESC
precizeaza modul de ordonare ascendent, respectiv
descendent. In cazul in care clauzele ORDER BY si DISTINCT
sunt utilizate impreuna, clauza ORDER BY trebuie sa se refere
la coloane care n-au fost mentionate in comanda SELECT.
Exemplu:
Sa se selecteze din tabela employees toate inregistrarile
ordonate dupa numele angajatului.
select
*
from employees
order by first_name;
Sa se selecteze din tabela employees toate inregistrarile
ordonate dupa numele angajatului care au salariul mai mare
egal ca 5000.
select
*
from employees
where salary >=5000
order by first_name;

7.6 UTILIZAREA CLAUZEI GROUP BY - functii de grupare


Rezultatele obtinute in urma selectarilor pot fi grupate cu
ajutorul clauzei GROUP BY. Secventa utilizata pentru aceasta

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

31

operatie este:
SELECT
GROUP BY tabela. coloana1, tabela. coloana2, HAVING
conditie
;
Prin parcurgerea secventei se obtine cate un rand pentru
inregistrarile
care au aceleasi valori in coloanele specificate in clauza
GROUP
BY.
Prezenta clauzei HAVING determina obtinerea acelor
grupuri
care
indeplinesc conditiile specificate. Este de retinut faptul ca
GROUP
BY
si
HAVING trebuie sa fie declarate dupa clauzele WHERE,
CONNECT
BY si START WITH, in cazul cind acestea exista in comanda.
Exemplu:
Sa se selecteze cea mai mica data de angajare, grupat dupa
employee_id, first_name, last_name.
SELECT MIN(hire_date)
FROM employees
GROUP BY employee_id, first_name, last_name

7.7 SELECTAREA DATELOR DIN MAI MULTE TABELE


Operatia prin care se selecteaza si se grupeaza coloanele
din tabele diferite, in scopul obtinerii unor informatii coerente,
poarta numele de jonctiune (JOIN). Pentru a realiza o
jonctiune si pentru a preciza corespondenta intre randurile
tabelelor, se utilizeaza urmatoarea secventa:
SELECT...
FROM nume-tab1, nume-tab2,... WHERE conditie ;
unde:
conditie reprezinta orice expresie care compara campurile
diferitelor
tabele.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

32

Folosirea aliasului pentru tabele.


select
a.EMPLOYEE_ID
from employees a
sau fara alias
select
employees.EMPLOYEE_ID
from employees
Sa se afiseze id-ul angajatului , numele si prenumele avand
tabele cu alias a.
select
a.EMPLOYEE_ID,
a.FIRST_NAME || a.LAST_NAME ,
a.SALARY
from employees a
Vor fi selectate randurile pentru care conditia este indeplinita.
In conditie poate fi folosit operatorul (+) care simuleaza
existenta unor randuri vide in tabelele pentru care nu se gasesc
corespondente.
Exemplu:
Sa
se
selecteze
numele
prenumele
departamentului in care lucreaza angajatii.

si

denumirea

select a.first_name, a.last_name, d.department_name


from employees a, departments d
where a.department_id=d.department_id
Sa
se
selecteze
numele
prenumele
si
denumirea
departamentului in care lucreaza angajatii si au salariul mai
mare ca 4000.
select a.first_name, a.last_name, d.department_name
from employees a, departments d

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

33

where a.department_id=d.department_id
and salary >4000
Sa
se
selecteze
numele
prenumele
si
denumirea
departamentului in care lucreaza angajatii si au salariul mai
mare ca 4000.
select a.first_name, a.last_name, d.department_name
from employees a, departments d
where a.department_id=d.department_id
and salary >4000
Sa se selecteze numele, prenumele si denumirea tarii
pentru fiecare angajat:
select a.first_name, a.last_name, r.country_name
from employees a, departments d, locations l,
countries r
where a.department_id = d.department_id
and d.location_id = l.location_id
and l.country_id = r.country_id

7.8 REALIZAREA CERERILOR INCLUSE


Subcererile reprezinta cereri incluse in clauzele unor comenzi
SQL. Randurile selectate de o subcerere nu sunt afisate, ele
fiind utilizate in continuare de o comanda SQL.
Daca subcererea este folosita in partea dreapta a unei
expresii logice sau a unei expresii de atribuire, ea va returna o
singura valoare sau o coloana de valori. Compunerea valorii
rezultate cu cea din stanga expresiei se face in conformitate
cu operatorul care face legatura intre cele doua parti.
In cazul in care subcererea este folosita pentru a specifica
valori in comenzi ca INSERT, CREATE TABLE, UPDATE, ea va
returna cate o valoare pentru fiecare coloana specificata in
comanda. Clauze ca ORDER BY, FOR nu pot fi folosite in
subcereri.
Subcererile apar, in general, in urmatoarele comenzi:
COPY [FROM nume-utilizator/parola@baza-de-date] [TO
nume-utilizator/parola@baza-de-date]

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

34

{APPEND | CREATE | INSERT | REPLACE}


Tabela
(col1, col2, ) USING cerere;;
CREATE TABLE tabela
AS cerere ;
INSERT INTO tabela
| [(col1, col2, )]
[VALUES (val1, val2,... ) | cerere];
UPDATE tabela [sinonim]
SET (col1, col2, ) = (cerere) [WHERE conditie];
Exista si subcereri corelate cu cererile din comanda principala,
care apar doar in clauza WHERE a comenzii SELECT. Ele pot
utiliza sinonime pentru tabela precizata in comanda SELECT si
sunt evaluate cate o data pentru fiecare rand selectat in
comanda principala. Subcererile corelate pot apare in formule
ca:
1). SELECT
coloana1, coloana2,...
FROM tabela1, tabela2 tab2,...
WHERE coloana1 IN
(SELECT coloana1
FROM tabela1
WHERE conditie)
2) SELECT
coloana1, coloana2,...
FROM tabela1 tab1, tabela2 tab2,...
WHERE coloana2 IN
(SELECT functie (coloana)
FROM tabela2 tab2
WHERE tab2. coloana=coloana)

7.9 Functii de conversie


Conversiile implicite asigurate de server-ul Oracle sunt:
-

de
de
de
de

la
la
la
la

VARCHAR2 sau CHAR la NUMBER;


VARCHAR2 sau CHAR la DATE;
NUMBER la VARCHAR2 sau CHAR;
DATE la VARCHAR2 sau CHAR.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

35

Conversiile explicite se realizeaz cu ajutorul funciilor de tip


TO_{tip}
Funcie

Semnificaie
Exemplu
Convertete o valoare de tip numeric sau dat
TO_CHAR('3') = ' 3'
calendaristic, la un ir de caractere conform
TO_CHAR(-12) = '-12'
TO_CHAR
cu formatul specificat sau cu setrile
(expr_number_sau naionale specificate (NLS - National
TO_CHAR(sysdate, 'DDMMYYYY')
_date[, format][, Language Support). Daca formatul sau
= ' 09122004'
nlsparameters]) parametrii lipsesc se utilizeaz formatul i
TO_CHAR (sysdate + 365 * 57,
parametrii implicii. Formatul este case
'ddmmyyyy') = ' 25112061'
sensitive.
Convertete o valoare de tip ir de caractere
TO_NUMBER
la o valoare numeric conform cu formatul
(expr_char[,
TO_NUMBER ('-12.22', 'S99.99')
specificat. Dac formatul sau parametrii
format][,
= -12.22
lipsesc se utilizeaz formatul i parametrii
nlsparameters])
implicii.
Convertete o valoare de tip ir de caractere
TO_DATE
la o valoare de tip dat calendaristic n
(expr_char[,
TO_DATE ('15-feb-2004','dd-monconformitate cu formatul specificat. Dac
format][,
yyyy')
formatul sau parametrii lipsesc se utilizeaz
nlsparameters])
formatul i parametrii implicii.

7.10 Functii de prelucrare caractere


Funcie

Semnificaie
Exemplu
Convertete un ir de
LOWER (expresie)
LOWER ('AbCdE') = 'abcde'
caractere la minuscule.
Convertete un ir de
UPPER (expresie)
UPPER ('AbCdE') = 'ABCDE'
caractere la majuscule.
Convertete un ir de
caractere la un ir care ncepe
INITCAP (expresie)
INITCAP ('AbCdE') = 'Abcde'
cu majuscul i continu cu
minuscule.
Concateneaz doua expresii
CONCAT (expr1, expr2)
de tip caracter. Echivalent cu CONCAT ('Ab', 'CdE') = 'AbCdE'
operatorul de concatenare '||'.
Extrage din expresia de tip
caracter, n caractere ncepnd
cu poziia m. Dac lipsete
argumentul n, atunci extrage
SUBSTR ('AbCdE', 2, 2) = 'bC'
toate caracterele pn la
SUBSTR (expresie, m[, n])
SUBSTR ('AbCdE', 2) = 'bCdE'
sfritul irului. Dac m este
SUBSTR ('AbCdE', -2) = 'dE'
negativ numrtoarea
poziiilor ncepe de la sfritul
irului de caractere spre
nceput.
Returneaz numrul de
LENGTH (expresie)
LENGTH ('AbCdE') = 5
caractere al expresiei.
INSTR (expresie, expr1[, m][, n]) Returneaz poziia la care se INSTR (LOWER('AbC aBcDe'), 'ab', 5, 2)

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

36

LPAD (expresie, n[, expr1]) sau


RPAD (expresie, n[, expr1])

LTRIM (expresie[, expr1]) sau


RTRIM (expresie[, expr1])

gsete a n-a ocurent a


expresiei 'expr1' n cadrul
expresiei 'expresie', cutarea
=0
ncepnd de la poziia m. Daca INSTR (LOWER('AbCdE aBcDe'), 'ab', 5)
m sau n lipsesc, valorile
=7
implicite sunt 1 pentru
ambele.
Completeaz expresia caracter
dat ca parametru (expresie),
la stnga (LPAD), respectiv la
RPAD (LOWER('AbCdE'), 10, 'X')
dreapta (RPAD) cu caracterele
= 'abcdeXXXXX'
specificate n expresia expr1,
LPAD (LOWER('AbCdE'),10)
pn la lungimea specificat
='
abcde'
de parametrul n. Implicit, dac
lipsete, expr1 este ' ' un
spaiu.
Reversul funciilor LPAD, RPAD.
Truncheaz expresia caracter
la stnga sau la dreapta prin RTRIM ('abcdeXXXX', 'X')
eliminarea succesiv a
= 'abcde'
caracterelor din expresia
LTRIM ('
abcde') = 'abcde'
expr1. Implicit, daca lipsete,
expr1 este ' ' un spaiu.

Permite eliminarea
caracterelor specificate
TRIM (LEADING | TRAILING | BOTH (caractere_trim) de la
caractere_trim FROM expresie)
nceputul (leading) , sfritul
(trailing) sau din ambele pri,
dintr-o expresie caracter data.

TRIM (LEADING 'X' FROM 'XXXabcdeXXX')


= 'abcdeXXX'
TRIM (TRAILING 'X' FROM 'XXXabcdeXXX')
= 'XXXabcde'
TRIM ( BOTH 'X' FROM 'XXXabcdeXXX') =
'abcde'
TRIM ( BOTH FROM ' abcde
= 'abcde'

')

REPLACE (expr, expr1, expr2)

REPLACE ('%1%11','%','2') = '21211'


nlocuiete n prima expresie
toate ocurentele irului expr1 REPLACE ('%1%11','%1','23') = '23231'
cu irul expr2.
REPLACE ('%1%11','%') = '111'

TRANSLATE(expr, expr1, expr2)

Fiecare caracter din irul de


caractere expr care apare i n
TRANSLATE('%1%11','%','2') = '21211'
expr1 este transformat n
caracterul corespunztor (aflatTRANSLATE('%1%111','%1','23')
pe aceeai poziie ca i n
= ' 232333'
expr1) din irul de caractere
expr2.

ASCII (expresie)
CHR(expresie)

Returneaz codul ASCII al


primului caracter din irul
'expresie'.
ntoarce caracterul
corespunztor codului ASCII
specificat.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

ASCII ('curs') = ASCII ('c') = 99


CHR(99)= 'c'

37

7.11 Functii aritmetice


Cele mai importante funcii aritmetice sunt: ABS (valoarea
absolut), ROUND (rotunjire cu un numr specificat de zecimale),
TRUNC (trunchiere cu un numr specificat de zecimale), EXP
(ridicarea la putere a lui e), LN (logaritm natural), LOG (logaritm
ntr-o baz specificat), MOD (restul mpririi a dou numere
specificate), POWER (ridicarea la putere), SIGN (semnul unui
numr), COS (cosinus), COSH (cosinus hiperbolic), SIN(sinus),
SQRT(rdcina ptrat), TAN(tangent), funciile LEAST i
GREATEST, care returneaz cea mai mic, respectiv cea mai mare
valoare a unei liste de expresii etc.
Funcie

ROUND (expresie [, n])

Semnificaie

Exemplu

ROUND(1.6) = 2
Returneaz valoarea rotunjit a expresiei
ROUND(1.4) = 1
pn la n zecimale. Daca n este negativ
ROUND (1234.56,1) = 1234.6
sunt rotunjite cifre din stnga virgulei.
ROUND (1230.56, -2) = 1200
Valoarea implicit pentru n este 0.
ROUND (1260.56, -2) = 1300

Partea ntreag superioar

CEIL(1.4) = 2
CEIL(1.6) = 2
CEIL(1234.56) = 1235
CEIL(-1234.56)= -1234

FLOOR (n)

Partea ntreag inferioare

FLOOR(1.4) = 1
FLOOR(1.6) = 1
FLOOR (1234.56) = 1234
FLOOR (-1234.56) = -1235

TRUNC (expresie[, n])

Returneaz valoarea trunchiat a expresiei TRUNC


pn la n zecimale. Daca n este negativ
TRUNC
sunt trunchiate cifre din stnga virgulei.
TRUNC
Valoare implicit pentru n este 0.
TRUNC

MOD (m,n)

Returneaz restul mpririi lui m la n.

ABS(n)
SQRT(n)
EXP(n)
LN(n)
LOG (n,m)
POWER(n,p)
SIGN(n)
COS, COSH
SIN, SINH
TAN, TANH
STDDEV

Valoarea absolut
Rdcina ptrat
Ridicarea la putere a lui e
Logaritm natural
Logaritm n baz n din m
Ridicarea la putere; n la puterea p
Semnul unui numr
Cosinus, cosinus hiperbolic
Sinus, sinus hiperbolic
Tangent, tangent hiperbolic
Deviaia standard

CEIL(n)

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

(1234.56) = 1234
(123456, -2) = 123400
(1234.56) = 1234
(1234.56,1) = 1234.5

MOD (11, 4) = MOD (11, -4) = 3


MOD(-11, 4) = MOD (-11, -4) = -3
ABS(-2) = 2

38

VARIANCE

Dispersia

7.12 Functii pentru prelucrarea datelor calendaritice


Funcie

Semnificaie
Exemplu
ntoarce data i timpul curent
Returneaz numrul de luni dintre
data date1 i data date2. Rezultatul
MONTHS_BETWEEN (date1, poate fi pozitiv sau negativ dup
ROUND(MONTHS_BETWEEN (SYSDATE +
date2)
cum date1 este mai recent sau nu 30, SYSDATE)) = 1
fa de date2. Zecimalele reprezint
pari dintr-o luna!
SYSDATE

ADD_MONTHS (date, n)

Adaug n luni la o data specificat. MONTHS_BETWEEN


Valoarea n trebuie s fie ntreag
(ADD_MONTHS(SYSDATE, 3), SYSDATE)
(pozitiv sau negativ).
=3

NEXT_DAY (date, char)

NEXT_DAY('15-dec-2004','Monday')
= '20-decReturneaz data corespunztoare
2004'
primei zile a sptmnii specificate
NEXT_DAY ('15-dec-2004',1)
(char) care urmeaz dup date.
= '20-dec2004'

LAST_DAY (date)

Returneaz data corespunztoare


ultimei zile din luna calendaristic
ce conine data specificat.

ROUND (date [, format)

Returneaz data calendaristic


rotunjit dup formatul specificat
Valoarea implicit este 'DAY'.

LAST_DAY ('15-feb-2004') = '29-feb2004'


TO_CHAR (ROUND (TO_DATE ('15-feb2004 13:50','dd-mon-yyyy hh24:mi')),
'dd-mm-yyyy hh24:mi')
= '16-02-2004 00:00'

TRUNC (date [, format)

TO_CHAR (TRUNC (TO_DATE ('15-feb2004 13:50','dd-mon-yyyy hh24:mi')),


Returneaz data calendaristic
trunchiat dup formatul specificat. 'dd-mm-yyyy hh24:mi')
Valoarea implicit este 'DAY'.
= '15-02-2004
00:00'

LEAST(d1, d2, , dn)


GREATEST(d1, d2, , dn)

Dintr-o list de date calendaristice,


funciile ntorc prima, respectiv
ultima dat n ordine cronologic.

7.13 Functii generale


Funcie
NVL (expr1, expr2)

Semnificaie
Exemplu
Returneaz expr1 dac aceasta nu este
NVL(NULL, 1) = 1
NULL, expr2 n caz contrar. Cele 2 expresii
NVL(2, 1) = 2
trebuie s aib acelai tip sau expr2 s
NVL('c', 1) = 'c' -- face conversie
permit conversia implicit la tipul
NVL(1, 'c') -- eroare

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

39

expresiei expr1.
Dac expr1 este nenul atunci returneaz
NVL2 (expr1, expr2, expr3)
expr2, altfel Returneaz expr3
Daca expr1 = expr2 atunci funcia
returneaz NULL, altfel returneaz
NULLIF (expr1, expr2)
expresia expr1. Echivalent cu CASE WHEN
expr1 = expr2 THEN NULL ELSE expr1
END
Returneaz expr1 dac nu este NULL,
COALESCE (expr1,
altfel expr2, dac expr2 nu este NULL,
expr2, ... , exprn)
altfel... exprn , dac expr2 nu este NULL.
ntorc ID-ul, respectiv username-ul
UID, USER
utilizatorului ORACLE curent

--nu face conversie


NVL2 (NULL, 1, 2) = 2
NULLIF (1, 2) = 1
NULLIF (1,1) = NULL
COALESCE (NULL, NULL, 1)
=1

SELECT VSIZE(hire_date)
ntoarce numrul de octei ai unei expresii
FROM employees
de tip DATE, NUMBER sau VARCHAR2
WHERE employee_id=104;

VSIZE(expresie)

7.14 Functii de grup

AVG (media aritmetic),

COUNT(*) (numrul de linii returnate de o cerere),

COUNT ([DISTINCT] numrul valorilor unui expresii),

SUM (suma valorilor unei expresii),

MIN (valoarea minim a unei expresii),

MAX (valoarea maxim a unei expresii),

STDDEV (deviaia standard),

VARIANCE (dispersia).

Observaii:

Funciile grup ignor valorile null.

Orice funcie grup ntoarce o singur valoare.

Ele ntorc valoarea null cnd sunt aplicate unei mulimi


vide, cu excepia operatorului COUNT care ntoarce valoarea
zero.

Spre deosebire de funciile COUNT, MIN i MAX care pot fi


aplicate unor cmpuri numerice sau nenumerice, restul funciilor
grup se aplic doar cmpurilor numerice.

Funciile grup pot s apar n lista de la SELECT sau n


clauza HAVING.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

40

7.15 OPERATORUL ROLLUP


Operatorul ROLLUP produce o mulime care conine liniile
obinute n urma gruprii obinuite i linii pentru
subtotaluri. Acest operator furnizeaz valori agregat i
superagregat corespunztoare expresiilor din clauza
GROUP BY.
Operatorul ROLLUP creeaz grupri prin deplasarea ntr-o
singur direcie, de la dreapta la stnga, de-a lungul listei
de coloane specificate n clauza GROUP BY. Apoi, se aplic
funcia agregat acestor grupri. Dac sunt specificate n
expresii n operatorul ROLLUP, numrul de grupri generate
va fi n + 1. Liniile care se bazeaz pe valoarea primelor n
expresii se numesc linii obinuite, iar celelalte se numesc
linii superagregat.
Exemplu:
S se afieze codurile de galerii mai mici dect 50, iar
pentru fiecare dintre acestea i pentru fiecare autor care
are opere expuse n galerie, s se listeze valoarea total a
lucrrilor sale. De asemenea, se cere valoarea total a
operelor expuse n fiecare galerie. Rezultatul va conine i
valoarea total a operelor din galeriile avnd codul mai mic
dect 50, indiferent de codul autorului.

7.16 OPERATORII PENTRU MULTIMI


Operatorii de multimi combina doua sau mai multe
interogari,
efectuand
operatii
specifice
multimilor:
reuniune, intersectie, diferenta. Acesti operatori se mai
numesc si operatori verticali deoarece combinarea celor
doua interogari se face coloana cu coloana. Din acest
motiv, numarul total de coloane si tipurile de date ale
coloanelor coresondente din cele doua interogari trebuie sa
coincida:
Exista urmatorii operatori pentru multimi:
UNION Returneaza rezultatele a doua sau mai multe
interogari eliminind toate inregistrarile duplicat;
UNION ALL - Returneaza rezultatele a doua sau mai multe
interogari incluzand inregistrarile duplicat;

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

41

INTERSECT - Returneaza toate inregistrarile distincte


gasite in ambele interogari;
MINUS - Returneaza toate inregistrarile distincte care se
gasesc in prima interogare dar nu in a doua interogare.
Exemple:
Sa se selecteze toate elementele din tabela employees unde
salariul este mai mic decat 5000 dar sa se excluda si cei cu
salariul 4800:
Select *

from employees where salary<5000

Minus
Select * from employees where salary=4800;

7.17 OPERATII PE TABELE STRUCTURATE ARBORESCENT


Limbajul SQL*Plus permite explorarea structurilor arborescente
existente in baza de date. Operatia se realizeaza cu ajutorul
clauzelor START WITH si CONNECT BY din comanda
SELECT.

Exemplu:
Structura arborescenta :
SELECT LEVEL, first_name
FROM employees
CONNECT BY manager_id = PRIOR employee_id
START WITH manager_id = (SELECT employee_id
FROM employees
WHERE employee_id =101)
7.18 STRUCTURA SINTAXA CASE SI WITH
Expresia CASE returneaza null daca nu exista clauza ELSE
si daca nici o conditie nu este indeplinita.
SELECT last_name,salary,

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

42

CASE WHEN salary< 5000 THEN 'mic'


WHEN salary> 10000 THEN 'mare'
ELSE 'mediu' END salariu
FROM employees;
Expresia WITH
Cu ajutorul clauzei WITH se poate defini un bloc de cerere
nainte ca acesta s fie utilizat ntr-o interogare. Clauza
permite reutilizarea aceluiai bloc de cerere ntr-o
instruciune SELECT complex.
WITH
val_a AS (SELECT first_name , sum(salary) as total
FROM employees
GROUP BY first_name),
val_m AS (SELECT sum(salary)/count(*) AS medie
FROM employees
)
SELECT *
FROM
val_a
WHERE total > (SELECT medie
FROM
val_m)
ORDER BY first_name

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

43

8. LIMBAJ DE DEFINIRE A DATELOR


8.1 CREATE CREATE
Crearea unui tabel const din generarea structurii sale,
adic atribuirea unui nume tabelului i definirea
caracteristicelor sale (se definesc coloanele, se definesc
constrngerile de integritate, se specific parametrii de
stocare etc.).
Tabelele pot fi create n orice moment, chiar i n timpul
utilizrii bazei. Structura unui tabel poate fi modificat
online. Nu este necesar s se specifice dimensiunea
acestuia. Totui, din considerente administrative, este
important s se cunoasc estimativ ct spaiu va utiliza
tabelul.
Comanda CREATE TABLE permite crearea unui tabel
relaional sau a unui tabel obiect. Tabelul relaional
reprezint structura fundamental pentru stocarea datelor
utilizatorului. Un tabel obiect utilizeaz un tip obiect pentru
definiia unei singure coloane i este folosit pentru a stoca
instanele unui obiect particular.
Pentru a crea un tabel, utilizatorul trebuie s aib acest
privilegiu i s dispun de spaiul de memorie n care s
creeze obiectul. La nivelul schemei sale, un utilizator are
toate privilegiile.
CREATE TABLE [<nume_schema>.] <nume_tabel> (
<nume_coloana_1> <tip_date> [DEFAULT
<expresie>],

<nume_coloana_n> <tip_date> [DEFAULT


<expresie>])
[CLUSTER <nume_cluster> (<coloana_1>,,
<coloana_m>)]
[ENABLE | DISABLE <clause>];
Comanda poate conine opional clauza TABLESPACE, care
specific spaiul tabel n care va fi stocat tabelul. De
asemenea, poate conine opional clauza STORAGE care
este folosit pentru setarea parametrilor de stocare prin
intermediul crora se specific mrimea i modul de
alocare a extinderilor segmentului tabel. La crearea unui
tabel nu este nevoie s se specifice dimensiunea maxim a
acestuia, ea fiind determinat pn la urm de marimea
spaiului alocat spaiului tabel n care este creat tabelul.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

44

Structura unui tabel poate fi creat n urmtoarele patru


moduri:
fr a indica cheile;
indicnd cheile la nivel de coloan;
indicnd cheile la nivel de tabel;
prin copiere din alt tabel.
Crearea structurii unui tabel fr a indica cheile:
CREATE TABLE
carte
(codel
CHAR(5),
titlu
VARCHAR2(30),
autor
VARCHAR2(30),
pret
NUMBER(8,2),
nrex
NUMBER(3),
coded
CHAR(5));
8.2 COMANDA ALTER
Comanda care realizeaz modificarea structurii tabelului (la
nivel de coloan sau la nivel de tabel), dar nu modificarea
coninutului acestuia, este ALTER TABLE.
ALTER TABLE realizeaz modificarea structurii unui tabel
nepartiionat sau partiionat, a unei partiii sau subpartiii
dintr-un tabel. Pentru tabele obiect sau tabele relaionale
coninnd coloane obiect, instruciunea poate fi utilizat
pentru a converti tabelul la ultima definiie a tipului referit,
dup ce acesta a fost modificat. Comanda nu schimb
coninutul tabelului.
Comanda ALTER TABLE permite:
adugarea (ADD) de coloane, chei (primare sau externe),
constrngeri ntr-un tabel existent;
modificarea (MODIFY) coloanelor unui tabel;
specificarea unei valori implicite pentru o coloan
existent;
activarea i dezactivarea (ENABLE, DISABLE) unor
constrngeri;
suprimarea unei coloane;
suprimarea (DROP) cheii primare, a cheii externe sau a
unor constrngeri.
Comanda ALTER TABLE are urmtoarea sintax simplificat:
ALTER TABLE [<nume_schema>.] <nume_tabel>

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

45

[ADD
(<nume_coloana> <tip_date>,
<constrngere>) |
MODIFY
(<nume_coloana_1>,, <nume_coloana_n>)
|
DROP
<clauza_drop>,]
[ENABLE | DISABLE <clause>];
8.3 COMANDA DROP
Pentru tergerea unui tabel este utilizat comanda DROP
TABLE:
DROP TABLE [nume_schema.]nume_tabel
[CASCADE CONSTRAINTS];
Clauza CASCADE CONSTRAINTS permite suprimarea tuturor
constrngerilor de integritate referenial corespunztoare
cheilor primare i unice din tabelul supus tergerii. Dac se
omite aceast clauz i exist constrngeri de integritate
referenial, sistemul returneaz o eroare i nu suprim
tabelul.
Suprimarea unui tabel presupune:
suprimarea definiiei sale n dicionarul datelor;
suprimarea indecilor asociai;
suprimarea privilegiilor conferite n legtur cu tabelul;
recuperarea spaiului ocupat de tabel;
permanentizarea tranzactiilor in asteptare;
invalidarea (dar nu suprimarea) funciilor, procedurilor,
vizualizrilor, secventelor, sinonimelor referitoare la tabel.
Odat executat, instruciunea DROP TABLE este
ireversibil. Ca i n cazul celorlalte instruciuni ale
limbajului de definire a datelor, aceast comand nu poate
fi anulat (ROLLBACK).
Oracle 10g introduce o noua maniera pentru suprimarea
unui tabel. Cand se sterge un tabel, baza de date nu
elibereaza imediat spatiul asociat tabelului. Ea
redenumeste tabelul si acesta este plasat intr-un recycle
bin de unde poate fi eventual recuperat ulterior prin
comanda FLASBACK TABLE.
Exemplu:
DROP TABLE exemplu;

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

46

8.4 COMANDA INSERT


Aceasta comanda este utilizata pentru adaugarea unor
randuri noi intr-o tabela creata anterior sau in tabelele de
baza ale unei vederi. Comanda INSERT poate fi utilizata in
doua moduri:
1.
Pentru introducerea datelor intr-un tabel, cate o
inregistrare la un moment dat. In acest caz sintaxa este
urmatoarea
INSERT INTO tabela [(coloana1, coloana 2)]
VALUES (valoarel, valoare2,.. )
In momentul inserarii datelor, trebuie respectate
urmatoarele reguli:
Coloanele pot fi specificate in orice ordine, insa trebuie
asigurata corespondenta intre coloane si valorile
furnizate (coloanei l ii corespunde valoarea l, coloanei 2
ii corespunde valoarea 2, s. a. m. d. ) iar coloanelor
nespecificate le va fi atasata valoarea Null;

In cazul in care coloanele nu sunt specificate explicit, se


impune sa fie specificate valori pentru toate coloanele si
ordinea acestor valori sa coincida cu cea in care
coloanele au fost definite la crearea tabelei (daca nu se
cunoaste ordinea de declarare a coloanelor se poate
folosi comanda DESCRIBE nume_tabela care va afisa
lista coloanelor definite pentru tabela respectiva, tipul,
lungimea si restrictiile de integritate);

Valorile trebuie sa aiba acelasi tip de data ca si


campurile in care sunt adaugate;

Dimensiunea valorilor introduse trebuie sa fie mai mica


sau cel mult egala cu dimensiunea coloanei (un sir de 20
de caractere nu poate fi adaugat intr-o coloana cu
dimensiunea de 15 caractere);

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

47

Valorile introduse trebuie sa respecte restrictiile de


integritate definite la crearea tabelei (de exemplu,
campuri definite ca NOT NULL sau UNIQUE).

2. Pentru introducerea datelor intr-un tabel, prin copierea


mai multor inregistrari dintr-un alt tabel sau grup de tabele;
aceste inregistrari sunt rezultatul unei comenzi SELECT, in
acest caz sintaxa este urmatoarea:
INSERT INTO tabela [(coloana1, coloana2,... )]
comanda_select

8.5 COMANDA UPDATE


Comanda UPDATE este folosita pentru a modifica valorile
datelor existente intr-un tabel sau in tabelele de baza ale
unei vederi si are urmatoarea sintaxa generala:
UPDATE tabela [alias]
SET atribuire_coloane, [atribuire_coloane,... ]
[WHERE conditie];
unde atribuire_coloane
urmatoarele forme:

poate

avea

una

dintre

coloana ={(expresie |(subinterogare)}


sau
(coloana [, coloana]... ) = (subinterogare)
Se observa ca exista doua posibilitati de modificare:

furnizarea in mod explicit a fiecarei valori sau expresii


pentru campurile ce trebuiesc modificate;
obtinerea valorilor cu ajutorul unei subinterogari.
Comanda UPDATE modifica valorile inregistrarilor in functie
de conditia clauzei WHERE. In lipsa clauzei WHERE, vor fi
actualizate toate inregistrarile din tabelul dat.
Expresia furnizata ca o noua valoare a unei coloane poate
cuprinde valorile curente ale campurilor din inregistrarea
care este actualizata.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

48

Exemplu:
a) Modificarea valoare coloana transaction_source:
UPDATE employees SET salary=1 WHERE department_id=50

8.6 COMANDA DELETE


Comanda DELETE realizeaza stergerea inregistrarilor dintr-o
tabela sau din tabelele de baza ale unei vederi in functie de o
anumita conditie si are urmatoarea sintaxa generala:
DELETE FROM tabela [WHERE conditie]
Similar comenzii UPDATE, comanda DELETE sterge anumite
inregistrari in functie de conditia din clauza WHERE. In lipsa
clauzei WHERE vor fi sterse toate inregistrarile din tabelul dat.
In aceasta clauza pot fi incluse si subinterogari.
Nota: Comanda DELETE nu poate fi folosita pentru stergerea
valorii unui camp individual (pentru aceasta folositi comanda
UPDATE) ci sterge inregistrari complete dintr-un singur tabel,
in plus, comanda DELETE sterge numai inregistrari din tabel
nu si tabelul. Pentru a sterge un tabel se foloseste comanda
DROP TABLE.
Un alt aspect important este faptul ca, similar comenzilor
INSERT si UPDATE, stergerea inregistrarilor dintr-un tabel
poate determina aparitia unor probleme legate de integritatea
referentiala. Pentru a evita aceste probleme se pot defini
constrangeri de integritate care impiedica operatiile de
inserare, actualizare sau stergere care ar distruge integritatea
referentiala a datelor.
8.7 COMANDA TRUNCATE
Pentru tergerea ntregului coninut al unui tabel i
eliberarea spaiului de memorie ocupat de acesta, sistemul
Oracle ofer instruciunea:

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

49

TRUNCATE TABLE nume_tabel;


Fiind o instruciune LDD, aceasta nu poate fi anulat
ulterior (printr-o operaie ROLLBACK). Ea reprezint o
alternativ a comenzii DELETE din limbajul de prelucrare a
datelor. De remarcat c instruciunea DELETE nu elibereaz
spaiul de memorie. Comanda TRUNCATE este mai rapid
deoarece nu genereaz informaie ROLLBACK i nu
activeaz declanatorii asociai operaiei de tergere. Dac
tabelul este printele unei constrngeri de integritate
referenial, el nu poate fi trunchiat. Pentru a putea fi
aplicat instruciunea TRUNCATE, constrngerea trebuie s
fie mai nti dezactivat.
In DD, informaiile despre tabele se gsesc n vizualizarea
USER_TABLES. Dintre cele mai importante coloane ale
acesteia, se remarca:
TABLE_NAME
TABLESPACE_NAM
E
CLUSTER_NAME
PCT_FREE
PCT_USED
INI_TRANS
NITIAL_EXTENT
NEXT_EXTENT
MIN_EXTENTS
MAX_EXTENTS
PCT_INCREASE
BACKED_UP
NUM_ROWS
BLOCKS
EMPTY_BLOCKS
AVG_SPACE
AVG_ROW_LEN
TABLE_LOCK

Numele tabelului
Spaiul tabel n care se afl tabelul
Numele cluster-ului din care face parte tabelul
Procentul de spaiu pstrat liber n interiorul
fiecrui bloc
Procentul de spaiu ce poate fi utilizat n fiecare
bloc
Numrul iniial de tranzacii concurente n
interiorul unui bloc
Dimensiunea spaiului alocat pentru prima
extensie
Dimensiunea spaiului alocat pentru urmtoarea
extensie
Numrul minim de extensii ce se aloc la
crearea unui tabel
Numrul maxim de extensii ce se aloc la
crearea unui tabel
Procentul cu care crete dimensiunea unei
extensii
Y sau N, dup cum tabelului i-a fost fcut o
copie de siguran de la ultima modificare
Numrul de nregistrri din tabel
Numrul de blocuri utilizate de tabel
Numrul de blocuri ce nu conin date
Spaiul mediu liber din tabel
Lungimea medie, n octei, a unei linii
ENABLED (activat) sau DISABLED (dezactivat):

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

50

PARTITIONED
TEMPORARY
NESTED

este activat sau nu blocarea tabelului


YES sau NO, indic dac tabelul este partiionat
(sau nu)
Y sau N, indic dac tabelul este temporar (sau
nu)
YES sau NO, indic dac tabelul este imbricat
(sau nu)

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

51

9. LIMBAJ DE CONTROL AL DATELOR


COMMIT - folosit pentru permanentizarea modificrilor
executate asupra BD (modificrile sunt nregistrate i sunt
vizibile tuturor utilizatorilor);
ROLLBACK - folosit pentru refacerea strii anterioare a BD
(sunt anulate toate reactualizrile efectuate de la nceputul
tranzaciei);
Execuia unei comenzi COMMIT implic anumite modificri.
Toate schimbrile (INSERT, DELETE, UPDATE) din baza de
date fcute dup anterioara comand COMMIT sau
ROLLBACK sunt definitive.
Comanda se refer numai la schimbrile fcute de
utilizatorul care d comanda COMMIT.
Toate punctele de salvare vor fi terse.
Starea anterioar a datelor este pierdut definitiv.
Toi utilizatorii pot vizualiza rezultatele.
Blocrile asupra liniilor afectate sunt eliberate; liniile pot fi
folosite de ali utilizatori pentru a face schimbri n date.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

52

10. CREARE, UTILIZARE, STEGERE VIZUALIZARI


Vizualizarea (view) este un tabel logic (virtual) relativ la
date din una sau mai multe tabele sau vizualizri.
Vizualizarea este definit plecnd de la o cerere a
limbajului de interogare a datelor, motenind
caracteristicile obiectelor la care se refer. Vizualizarea,
fiind virtual, nu solicit o alocare de memorie pentru date.
Ea este definit n DD cu aceleai caracteristici ca i un
tabel.
Textul cererii care definete vizualizarea este salvat n DD.
Nucleul Oracle determin fuzionarea cererii relative la
vizualizare cu comanda de definire a vizualizrii, analizeaz
rezultatul fuziunii n zona partajat i execut cererea.
Oracle transform cererea referitoare la o vizualizare ntr-o
cerere relativ la tabelele de baz. Vizualizarea este
memorata in DD sub forma unui SELECT.
Dac sunt utilizate clauzele UNION, GROUP BY i CONNECT
BY, atunci Oracle nu determin fuzionarea, el va rezolva
vizualizarea i apoi va aplica cererea rezultatului obinut.
O vizualizare reflect la orice moment coninutul exact al
tabelelor de baz. Orice modificare efectuat asupra
tabelelor se repercuteaz instantaneu asupra vizualizrii.
tergerea unui tabel implic invalidarea vizualizrilor
asociate tabelului i nu tergerea acestora.
Vizualizrile sunt definite pentru:
furnizarea unui nivel mai nalt de securizare a bazei;
simplificarea formulrii unei cereri;
mascarea complexitii datelor;
afiarea datelor ntr-o alt reprezentare dect cea a
tabelelor de baz;
asigurarea independenei datelor;
asigurarea confidenialitii anumitor informaii;
definirea constrngerilor de integritate;
restricionarea acesului la date.
SQL furnizeaz comenzi ce permit consultarea (SELECT) i
actualizarea (INSERT, UPDATE, DELETE) coninutului bazei
de date. Aceste comenzi definesc limbajul de prelucrare a
datelor (LMD).
Vizualizrile pot fi simple i complexe. O vizualizare simpl
extrage date dintr-un singur tabel, nu conine funcii sau

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

53

grupri de date i asupra ei pot fi efectuate operaii LMD.


O vizualizare este considerat complex dac extrage date
din mai multe tabele, conine funcii sau grupri de date i
nu permite ntotdeauna (prin intermediul su) operaii LMD
asupra tabelelor de baz.
Operaiile LMD asupra vizualizrilor complexe sunt
restricionate de urmtoarele reguli:
- nu se poate insera, actualiza sau terge o linie dintr-o
vizualizare dac aceasta conine funcii grup, clauza
GROUP BY, cuvntul cheie DISTINCT sau pseudocoloana
ROWNUM;
- nu se poate aduga sau modifica o linie dintr-o
vizualizare, dac aceasta conine coloane definite prin
expresii;
- nu pot fi adugate linii printr-o vizualizare, dac tabelul de
baz conine coloane care au constrngerea NOT NULL i
nu apar n lista SELECT a vizualizrii.
Pentru a obine informaii referitoare la vizualizrile
definite, se pot interoga vizualizrile USER_VIEWS i
ALL_VIEWS din dicionarul datelor. Textul instruciunii
SELECT care definete o vizualizare este stocat ntr-o
coloan de tip LONG, numit TEXT.
Atunci cnd datele sunt accesate prin intermediul unei
vizualizri, server-ul Oracle efectueaz urmtoarele
operaii:
recupereaz definiia acesteia din USER_VIEWS;
verific privilegiile de acces la tabelele ei de baz;
convertete cererea ntr-o operaie echivalent asupra
tabelelor de baz.
Crearea unei vizualizri se realizeaz cu ajutorul comenzii:
CREATE [OR REPLACE][FORCE | NOFORCE] VIEW
[<nume_schema>.]<nume_view> [(<alias>[,<alias>])]
AS <cerere_SELECT>
[WITH {CHECK OPTION [CONSTRAINT <nume_constrang
ere>] |
READ ONLY }];
- OR REPLACE recreeaz vizualizarea dac aceasta deja
exist.
- FORCE creeaz vizualizarea chiar dac tabelul de baz nu
exist sau chiar dac vizualizarea face referin la obiecte
care nc nu sunt create. Dei vizualizarea va fi creat,
utilizatorul nu poate s o foloseasc.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

54

- NO FORCE este implicit i se refer la faptul c


vizualizarea este creat numai dac tabelele de baz
exist.
Cererea este o comand SELECT care poate s conin
alias pentru coloane.
- WITH CHECK OPTION specific faptul c reactualizarea
datelor din tabele (inserare sau modificare) se poate face
numai asupra datelor selectate de vizualizare (care apar n
clauza WHERE).
- WITH READ ONLY asigur c nici o operaie LMD nu poate
fi executat asupra vizualizrii.
Exemplu:
Sa se creeze o vedere cu optiunea with check
option si sa aduca toate datele dar ce au conditia ca
salariul sa fie mai mare ca 5000.
CREATE VIEW imprumutare
AS SELECT *
FROM
EMPLOYEES
WHERE
SALARY>5000
WITH CHECK OPTION;

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

55

11. INTRODUCERE IN PL/SQL

11. 1 CE ESTE PL/SQL?


PL/SQL (Procedural Language /SQL) este o extensie la SQL,
incorporind multe facilitati ale limbajalor de programare din
ultimii ani. El permite ca manipularea datelor si procedurile de
interogare din SQL sa fie incluse in blocuri stucturate si
proceduri, PL/SQL devenind astfel un puternic limbaj de
procesare al tranzactiilor.

11. 2 AVANTAJELE PL/SQL


Structura de bloc. PL/SQL este un limbaj structurat, adica
programele pot fi impartite in blocuri logice, fiecare continind
resursele necesare in acel bloc. variabilele pot fi declarate
local in cadrul unui bloc in care vor fi folosite, iar tratarea
erorilor (sau Exceptiile) se poate face in blocul in care apar.
Controlul executiei. Deciziile, buclele si salturile pot fi
folosite pentru a controla executia programelor, decizind daca
si cand SQL si alte actiuni sa fie executate. Aceste facilitati
permit aplicatiilor ORACLE cum ar fi SQL*Forms, de a grupa
comenzi si de a controla executia lor prin PL/SQL.
Portabilitatea. Deoarece PL/SQL deriva din ORACLE,
programele pot fi portate pe toate masinile ce suporta ORACLE
si PL/SQL.
Integrarea. PL/SQL joaca un rol din ce in ce mai important in
RDBMS si in aplicatiile ORACLE. Variabilele si tipurile de date
din PL/SQL sunt compatibile cu cele din SQL. PL/SQL acopera
golul dintre nevoia de access la tehnologia bazelor de date si
nevoia de facilitati pentru programarea procedurala.
Performantele.
Utilizarea
PL/SQL
poate
ajuta
la
imbunatatirea performantelor aplicatiilor. Avantajele difera,
functie de mediul in care PL/SQL este folosit.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

56

11. 3 STRUCTURA PL/SQL


Fiecare unit al PL/SQL contine unul sau mai multe blocuri.
Aceste blocuri pot fi complet separate sau lipite unul de altul.
Astfel, un bloc poate fi numai o mica parte a altui bloc, care la
rindul lui poate fi numai o parte din intregul program.
De obicei, un bloc poate fi un bloc anonim sau un subprogram.
Blocuri anonime
Uzual sunt blocurile fara un nume. Aceste blocuri sunt
declarate in punctul din aplicatie unde vor fi folosite, si
transferate modulului PL/SQL la momentul executiei.
Sub-programe
Acestea sunt denumite blocuri PL/SQL. Pot fi declarate ca
proceduri sau ca functii. In ultimul caz, ele intorc o valoare
daca sunt apelate. SQL*Forms permite ca procedurile si
functiile sa fie declarate ca parte a Form-ului, si apelate din
orice punct.
Ne vom concentra mai mult asupra blocurilor anonime.
Definirea unui bloc anonim este urmatoarea:
DECLARE
--Definitia obiectelor PL/SQL care vor
--fi folosite in acest bloc.
BEGIN
--Actiuni executabile
EXCEPTION
--Tratarea erorilor (cazuri de exceptie)
--ce trebuie facut daca o actiune cauzeaza
--o eroare
END;
Cuvintele cheie BEGIN si END sunt obligatorii si delimiteaza
corpul actiunii ce urmeaza a fi executate.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

57

Sectiunea DECLARE este optionala si se foloseste pentru a


defini obiecte PL/SQL cum ar fi variabile folosite in cadrul
blocului sau un bloc inclus in acesta.
La sfarsit, sectiunea EXCEPTION este folosita pentru a minui
erori predefinite, si defineste actiunile ce vor fi intreprinse
daca astfel de conditii apar. De asemenea, sectiunea
EXCEPTION este optionala, si este plasata imediat inainte de
clauza 'END'.
Retineti ca sectiunea de cuvinte cheie DECLARE, BEGIN,
EXCEPTION nu sunt urmare de ';' dar END si toate celelalte
instructiuni PL/SQL au nevoie de ';'. Acest lucru permite sa
scriem mai multe instructiuni pe aceeasi linie daca avem
nevoie.
Daca instructiunea SELECT esueaza in a gasi o linia cu acest
produs, atunci se genereaza eroarea 'no_data_found' si
controlul este pasat imediat sectiunii EXCEPTION.

11. 4 FACILITATILE PL/SQL


Variabile si Constante pentru memorarea si manipularea
valorilor: tipurile de date includ NUMBER, CHAR si DATE.
SQL support: SELECT, INSERT, UPDATE, DELETE, COMMIT,
SAVEPOINT si ROLLBACK sunt instructiuni suportate.
Tipuri de date compuse - Recordurile permit definirea
grupurilor de campuri si folosirea in blocuri PL/SQL. Versiunea
2 suporta de asemenea tabele, la fel ca sirurile.
Controlul Executiei - Instructiunea IF, Bucle, salturi (GOTO)
si etichete ofera actiuni conditionale, teste complexe, bucle
iterative.
Functii Interne - Multe functii SQL sunt disponibile pentru a
manipula variabile si valori PL/SQL.
Tratarea Exceptiilor - Avertismentele si Erorile sunt definite
ca exceptii, care pot fi utilizate in fiecare bloc. Exceptiile

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

58

definite de user pot fi declarate si folosite la fel de bine ca


erorile standard ORACLE.

11. 5 SINTAXA DE BA ZA A PL/SQL


Din moment ce PL/SQL este o extensie pentru SQL, regulele
sintactice de baza aplicabile la SQL sunt aplicabile de
asemenea si la PL/SQL.
Iata un rezumat al acestor reguli:
Instructiunile pot avea mai multe linii daca este necesar,
dar cuvintele cheie nu pot avea mai multe linii.
Unitatile lexicale (identificatorii, numele de operatori)
pot fi separate de unul sau mai multe spatii, sau alt
delimitator care nu poate face parte din unitati lexicale
Cuvintele rezervate nu pot fi folosite ca identificatori
decit marcate in ghilimele duble( de ex. "SELECT")
Identificatorii trebuie sa inceapa cu o litera si pot
contine pina la 30 de caractere.
Sirurile trebuie marcate cu ghilimele simple.
Numerele pot fi reprezentate prin valoarea lor (ex. -32.
65) sau scrierea stiintifica ( ex. 2E5 inseamna 2x10 la
puterea 5 = 200000).
Comentariile pot fi marcate cu simbolurile /* si */, caz in
care comentariile se pot lungi pe mai multe linii ( tip 'C')
sau incepind cu '--' in care sfarsitul liniei marcheaza
sfarsitul comentariului.
Exemplu:
/*

Acesta comentariu se prelungeste pe


mai multe linii. Orice secventa de cod
aflata aici este considerata comentariu.

*/

COMMIT; --Aici se termina transferul

11.5. 1 BLOCURI INCLUSE

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

59

Anumite blocuri pot fi incluse in altele, in orice loc in care


instructiunea o permite (nu se recomanda sa se include
blocuri in cadrul unor bucle). Partea executabila a unui bloc
poate fi sparta in blocuri mai mici, si de asemenea sectiunea
EXCEPTION poate include alte blocuri.
Exemplu:
BEGIN
-- actiuni in bucla principala
DECLARE
-- declarare de obiecte
BEGIN
-- actiuni ale blocului
EXCEPTION
-- tratarea erorilor
END;
-- alte actiuni in blocul principal
EXCEPTION
WHEN errors_trickle_through THEN
BEGIN
-- tratarea erorilor in blocul propriu
EXCEPTION
-END;
END;
Retineti ca sectiunea DECLARE este optionala ; exemplul
prezentat contine cateva blocuri fare sectiunea DECLARE.

11.5.2 TIPURI DE DATE SCALARE


Aceste sunt tipurile de date care reprezinta o singura valoare.
Principalele tipuri de date sunt acelea ce corespund coloanei
de tipuri in tabela ORACLE. PL/SQL suporta de asemenea
tipurile booleene.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

60

TIPUL NUMERIC - NUMBER: Valoare numerica cu precizia de


38 de cifre. Valorile sunt rotunjite la numere intregi mai putin
atunci cand este data scala. (ex. NUMBER(7, 2) inseamna 7
cifre, cu 2 zecimale. Implicit precizia este de 38 cifre. )
TIPUL CARACTER - VARCHAR2: Folosit pentru a memora
variabile de tip caracter. Lungime implicita 1 caracter. Maxima
permisa 32767. ex. VARCHAR2(30)
TIPUL CARACTER - CHAR:
PL/SQL Versiunea 1: la fel ca VARCHAR2, dar cu lungimea
maxima de 255
PL/SQL Versiunea 2: Lungimea poate fi mai mare de 32767
caractere.
TIPUL BOOLEAN - BOOLEAN: Pentru minuirea valorilor
booleene TRUE si FALSE. Rezultatul expresiilor booleene poate
fi asignat acestor variabile si testat mai tirziu in instructiuni
conditionale.
TIPUL DATA - DATE: Datele valide sunt intre 4712 BC si
4712AD.

11. 6 DECLARAREA VARIABILELOR


Variabilele PL/SQL pot fi declarate si optional le pot fi asignate
o valoare initiala, in sectiunea DECLARE a unui bloc. Alte
variabile referite in partea declarativa trebuie declarate
separat in declaratiile anterioare.
Sintaxa:
indentificator tipdata
NULL] [ := expresie ] ;
Unde 'expresie' poate fi o
functii si operatori. Daca o
atunci variabila va contine
asignata ulterior o valoare.
permisa
in

[(precizia,

scala)]

[NOT

alta variabila, sau o expresie cu


valoare initiala nu este asignata,
o valoare nula pina cand ii va fi
Constanta NOT NULL nu mai este
aceasta
situatie.

Exemple:

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

61

v_count NUMBER NOT NULL := 0;


v_salary NUMBER(7, 2);
v_annsal NUMBER(9, 2) := month_sal * 12;
-- mount_sal trebuie sa existe deja
postcode CHAR(7);
surname VARCHAR2(25)
:= 'Skywalker' ;
v_message
VARCHAR2(80)
:= 'May the course
be with you!' ;
married
today

BOOLEAN
DATE

:= FALSE;
:= SYSDATE;

Exemplu :
declare
sal number(5);
nr_zile number(2);
sal_zilnic number(5,2);
begin
sal:=1000;
nr_zile:=21;
sal_zilnic := sal/nr_zile;
dbms_output.put_line('Salariul zilnic este'||to_char(sal_zilnic));
end;
/

Este indicat sa nu alegeti acelasi nume (identificator) pentru o


variabila ca nume pentru coloanele din tabela folosite in
cadrul blocului. Daca variabilele PL/SQL apar in instructiuni
SQL si au acelasi nume ca coloana, atunci ORACLE considera
ce se refera coloana.
11.7 DECLARAREA CONSTANTELOR
Constantele permit asignarea unei valori unui identificator,
pentru o viitoare referire in cadrul unui bloc. Orice incercare
de a modifica valoarea unei constante va cauza producerea
unei erori PL/SQL.
Sintaxa:

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

62

identificator
CONSTANT
scala)] := expresie ;

tipdata

[(precision,

Exemple:
pi CONSTANT NUMBER(9, 5) := 3. 14159 ;
vat CONSTANT NUMBER(4, 2) := 17. 5 ;
11.8 ATRIBUIRILE SI EXPRESIILE
Instructiunile de atribuire PL/SQL permit unei valori de a fi
atribuite sau reatribuite unei variabile dupa sectiunea
DECLARE din bloc.
Variabila care va primi noua valoare trebuie explicit numita in
partea stinga a operatorului de asignare.
Sintaxa:
identificator := expresie ;
Unde 'identificator' este numele variabilei tinta, sau camp,
pentru a primi valoarea 'expresie'.
'Expresie' poate fi literal, numele unei alte variabile existente,
sau alta expresie necesara pentru a determina valoarea ce va
fi asignata. De obicei, cele mai multe din expresiile disponibile
in inderogarile SQL, clauza SELECT sunt disponibile aici.
Exemple:
v_count := v_count +1;
ann_sal := mount_sal * 12 +NVL(comm, 0);
lev
:= 6;
mess
:= 'The current level is ' || TO_CHAR(lev) ;
v_ename := 'KING';
Valorile pe care le pot lua variabilele booleene pot fi TRUE si
FALSE, ca rezultat a unei expresii booleene.
Exemple:
overpaid := ann_sal > 35000 ;
male
:= UPPER(title) == 'MR' ;

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

63

salary_ok := NOT overpaid ;


female := NOT male ;
switch1
switch2

:= TRUE;
:= FALSE;

11.9 STRUCTURA DE CONTROL


Structurile de control ale unui program PL/SQL sunt expresiile
conditionale, salturile si buclele.
PL/SQL ofera facilitati de control al executiei conditionat si
neconditionat.
Acestea sunt:
- instructiunea IF (ofera controlul selectiv al actiunilor, bazat
pe indeplinirea unor conditii);
- instructiunea GOTO (se foloseste la saltul neconditionat la
o eticheta din program);
- ciclul simplu (asigura repetarea unor actiuni fara
impunerea de conditii);
- ciclul FOR (pentru control iterativ al actiunilor, bazat pe un
contor).
- cicluri WHILE (pentru control iterativ al actiunilor, bazat pe
indeplinrea unei conditii);
- instructiunea EXIT (Pentru a iesi dintr-un ciclu);
Instructiunea IF are o structura similara cu echivalentul din
limbajele procedurale. Ea permite executarea unor actiuni
selectiv, bazat pe indeplinirea unor conditii. Structura sa
generala este prezentata mai jos.
Sintaxa:
IF conditie THEN actiuni
actiuni ]
[ ELSE actiuni ]
END IF;

ELSIF

conditie

THEN

unde "actiuni" pot fi una sau mai multe instructiuni PL/SQL sau
SQL, fiecare terminata cu punct-virgula. Aceste "actiuni" pot
include alte instructiuni IF cu aceiasi structura, ceea ce

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

64

inseamna ca instruciunea poate contine IF, ELSE, ELSIF


imbricate.
Instructiunea IF simpla
Sa incepem cu un exemplu care implica numai o conditie, fara
nici una din clauzele optionale:
IF V_NUME = 'BOGDAN' THEN V_INVATA := 'YES';
COMMIT;
END IF;
Cele doua actiuni sind executate numai daca conditia este
adevarata (TRUE). Daca conditia este falsa (FALSE sau NULL)
atunci cele doua instructiuni sunt excluse. In oricare din caz,
executia continua cu urmatoarea instructiune din program de
dupa END IF.
Notati ca daca constructia 'END IF' nu este prezenta la
sfarsitul instructiunii, atunci PL/SQL va cauta in instructiunile
urmatoare cautind 'END IF'. Ca si in alte limbaje procedurale
aceasta poate provoca afisarea unor mesaje de eroare
confuze.
Urmatorul exemplu arata cum pot fi executate instructiuni
alternative prin intermediul clauzei ELSE. Actiunile specificate
prin ELSE sunt executate daca conditiila este FALSE sau NULL,
dupa care programul continua cu instructiunile ce urmeaza
dupa END IF.
IF V_NUME = 'BOGDAN' THEN V_INVATA := 'YES';
ELSE V_INVATA=NO;
END IF;

11.9.1 TIPURI DE DATE COMPUSE


In aceasta sectiune se arata cum se declara si utilizeaza
variabile compuse in PL/SQL. In mod normal, inregistrarile
permit aceasta facilitate, permitind reprezentarea unei linii de
la o tabela sau un view.
Inregistrari in PL/SQL
O inregistrare PL/SQL este o variabila care poate contine valori
separate, fiecare adresabila individual. Partile componente ale

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

65

unei inregistrari se numesc campuri, si au nume care pot fi


referentiate in atribuiri sau expresii. Campurile dintr-o
inregistare pot avea tipuri de date si marimi diferite. Aceasta
inseamna ca inregistrarile sunt foarte avantajoase cand
preluam o linie dintr-un tabel pentru procesare intr-un
program PL/SQL.
Atributul %ROWTYPE
Atributul ROWTYPE este folosit pentru declararea unei
inregistrari bazata pe o colectie de coloane in tabela de baze
de date. Campurile cu inregistrarea isi vor obtine numele si
tipul datei lor de la coloanele din tabela sau view referit in
declararea inregistrarii.
Campurile sunt declarate intr-o sectiune bloc DECLARE
impreuna cu celelalte tipuri de variabile pe care le-am vazut.
Sintaxa:
identifier reference%ROWTYPE ;
Unde 'identifier' este numele ales pentru inregistrare ca un
intreg, si reference este numele unei tabele, view sau cursor
pe care se bazeaza inregistrarea. Aceasta referinta trebuie sa
existe si sa fie valida la momentul cand inregistrarea este
declarata.
Exemplu:

In exemplul de mai sus, inregistrarile 'temp_rec' contine


campuri
bazate
pe
fiecare
coloana
in
tabla
'mtl_material_transactions'. Campul va fi populat cu linia
selectata de catre numele inregistrari din clauza INTO a
instructiunii SELECT.
Atributul %ROWTYPE poate fi utilizat pentru a declara
inregistrari bazate pe cursoare explicite. Aceste inregistrari
pot fi utilizate in FETCHuri si in cicluri cu cursor FOR.

11.10 TRIGGERI - DECLANSATOARE

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

66

Evenimentul sau comanda declansatoare (Triggering


Event).
Un eveniment sau o comanda declansatoare este comanda
SQL, evenimentul asupra bazei de date sau a utilizatorului
care provoaca declansarea. Aceste evenimente pot fi de
tipurile urmatoare:
Un INSERT, UPDATE, sau DELETE pe o anume tabela (sau
view, in unele
cazuri) Un CREATE, ALTER, sau DROP pe o schema
Database startup sau instance shutdown
Un anume mesaj de eroare sau orice mesaj de eroare
Un user logon or logoff
O restrictie de trigger specifica o expresie Booleana care
trebuie sa fie adevarata (TRUE) pentru a declansa triggerul.
Actiunea trigger-ului nu este executata daca restrictia e
evaluata ca FALSE sau UNKNOWN. In exemplu, restrictia e:
new.parts_on_hand < new.reorder_point
Asadar trigger-ul nu se declanseaza decat daca numarul de
piese disponibile este mai mic decat o valoare de la care se
face reordonarea.
Trigger Action
Actiunea trigger-ului este procedura (bloc PL/SQL , program
Java sau rutina C) ce contine comenzile SQL si codul ce
trebuie executat in cazurile urmatoare:
O comanda declansatoare este data
Restrictia trigger-ului este evaluata pe TRUE.
Tipuri de Triggere
- Row Triggers si Statement Triggers
- BEFORE si AFTER Triggers
- INSTEAD OF Triggers
- Triggere pentru System Events si User Events
Exemplu:
CREATE OR REPLACE TRIGGER emp_permit_changes
BEFORE

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

67

DELETE ON aaa
DECLARE
dummy INTEGER;
BEGIN
insert into aaa values (999, 888) ;
END;

11.11 CURSOARE descriere si utilizare


Aceasta sectiune va arata cum sa declarati si sa controlati
explicit cursoarele, care va permit sa multiplicati linii de
interogare pentru a fi executate in PL/SQL. Ne vom ocupa de
felul in care liniile pot fi aduse de la cursor in interiorul unei
bucle prin intermediul cursorului prin bucla.
ORACLE foloseste arii de lucru private SQL, arii care executa
declaratii SQL si sa memoreaza informatii de procesare.
Cursorul este o constructie PL/SQL, care iti permite sa
denumeste aceste arii de lucru si care acceseaza informatia.
Exista doua tipuri de cursor:
- cursor implicit - declarand PL/SQL cursor implicit pentru
toate declaratiile DML si pentru toate interogarile cu un singur
rand
- cursor explicit - declarand cursor explicit impreuna cu alti
identificatori care sunt folositi in bloc si manipuland prin
declaratii specifice si blocuri excutabile de actiune. Cursoarele
explicite sunt numai interogari si va permit multiple linii care
sa proceseze interogari.
Asa cum vedem, SELECT-uri care apar ca instructiuni separate
in PL/SQL pot intoarce o singura linie. Aceasta inseamna ca de
fapt PL/SQL incearca sa extraga doua linii de la cursorul
implicit :una sa satisfaca interogarea, si a doua care sa vada
daca viitoarele linii au fost returnate.
Cursoarele explicite va permit sa evitati aceasta a doua
extragere, aceasta imbunatatind eficienta cand o interogare
cu un singur rind este ceruta. Cursoarele explicite pot fi
utilizate pentru a rezolva multiple extrageri, si pentru a
reexecuta cereri trecute din aria respectiva.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

68

Restul acestui capitol va va explica mult mai pe larg aceste


probleme, despre cursorul explicit.
Controlul explicit al cursorului - pasii separati.
Cursorul explicit poate fi controlat prin 4 tipuri separate de
actiuni:
DECLARE
numeste cursorul si defineste structura interogarii care sa fie
efectuate cu el. La acest nivel, interogarea este parcursa
(coloane, tabele etc) dar nu este executata.
OPEN
executa interogarea, legand orice variabila care a fost
referentiata. Liniile intoarse de interogare, numita "set-activ"
sunt acum disponibile pentru extragere.
FETCH
memoreaza valorile din linia curenta in variabile. Linia curenta
este linia la care cursorul pointeaza. Fiecare FETCH produce
mutarea cursorului sa indice la linia urmatoare in setul activ, si
deci fiecare FETCH va accesa o linie diferita returnata de
interogare.
CLOSE
porneste un set de lucru de linii produse de OPENul cursorului.
Este posibil sa reOPEN (redeschideti) cursorul, stabilind astfel
un set de lucru nou.
Instructiunea CURSOR
Este folosit pentru a declara un cursor explicit. Parametrii pot
fi definiti pentru a permite substitutia valorilor in interogare
cand cursorul este OPEN. Variabilele pot fi deasemeni referite
in interogare, dar trebuie sa fie declarate inaintea instructiunii
CURSOR.
Sintaxa:
CURSOR identificator[( parameter details)] IS
query-expression;
unde query-expression este o instructiune SELECT care poate
include majoritatea clauzelor, dar nu o clauza INTO. Nu trebuie
definit NULL ca un obiect SELECT.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

69

Exemplu :
DECLARE
CURSOR c1 IS
SELECT first_name, salary, hire_date FROM
employees
WHERE departmnet_id= 20 AND job_id= " AD_ASST";
;
;
Instructiunea OPEN
Este utilizata in cadrul actiunilor executabile dintr-un bloc, si
stabileste un set activ de rinduri.
Sintaxa:
OPEN cursor-identif [(lista argumente)] ;
Exemplu:
OPEN c1;
Instructiunea FETCH
Este utilizata pentru a extrage rindul curent intr-o variabila
PL/SQL, sau intr-o variabila host, inclusiv campurile ecran din
SQL*forms. Trebuie amintit ca variabilele host necesita punctvirgula ca prefix, pentru a fi deosebite de variabilele PL/SQL.
Sintaxa:
FETCH cursor-id INTO var, var,... ;
Variabilele trebuie sa fie specificate pentru fiecare camp
selectat in cererea de cursor. O alta posibilitate este definirea
unei inregistrari pentru cursor, si transmiterea sa ca o clauza a
FETCH.
Exemplu:
FETCH c1 INTO v_ename, v_sat, v_hiredate;
Variabilele incarcate, care au fost declarate inainte de FETCH,
pot fi manipulate de alte instructiuni. FETCH-uri ulterioare vor
achizitiona alte rinduri individuale din cerere. De notat ca
primul FETCH care nu obtine nimic, adica daca nu mai ramin
rinduri, nu va cauza o eroare. Variabilele vor contine valori
nule.

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

70

Instructiunea CLOSE
Inchide in mod explicit un cursor, permitind redeschiderea sa
ulterioara. Aceasta inseamna ca un set activ poate fi restabilit
de mai multe ori.
Sintaxa:
CLOSE cursor-identif ;
Atribute explicite pentru cursoare
Ca si la cursoarele implicite, exista 4 atribute pentru a obtine
informatii de stare despre cursoare. Cind sunt utilizate,
numele atributului este precedat de identificatorul cursorului.
%FOUND
Evaluat la TRUE daca ultimul FETCH din cursor a obtinut un
nou rind, altfel FALSE
%NOTFOUND
Invers decit %FOUND
%ROWCOUNT
Numarul de rinduri preluate de la cursor pina acum
%ISOPEN
TRUE daca cursorul este deschis, FALSE daca a fost inchis sau
nu a fost inca deschis.
Exemple:
1. IF c1%ISOPEN THEN
FETCH c1 INTO v_1, v_2, v_3 ;
ELSE
OPEN c1;
2. LOOP
FETCH c1 INTO v_1, v_2, v_3;
EXIT WHEN c1%ROWCOUNT >10 ;
.
END LOOP;
Cicluri LOOP cursor
PL/SQL ofera un tip special de ciclu FOR pentru a prelucra
rindurile intoarse in cursorul explicit. Intr-un ciclu FOR cursor,

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

71

un cursor declarat este deschis, se efectueaza extrageri si


este inchis automat cand toate rindurile au fost prelucrate.
Fiecare iteratie a ciclului extrage un rind din setul activ intr-o
inregistrare, care este declarata implicit pentru utilizare in
cadrul ciclului. Ciclul este terminat automat la sfarsitul iteratiei
pentru ultimul rind extras.
Sintaxa:
DECLARE
CURSOR cursor_name [ (parameters)] IS queryexpresion;
BEGIN
FOR record-name IN cursor-name [ (parameters) ]
LOOP
--procesare valori din rindul curent.
.
END LOOP;
Inregistrarea numita in instructiunea FOR este declarata intern
in ciclu si valabilitatea expira cand se termina ciclul. Fiecare
iteratie provoaca extragerea rindului urmator din inregistrare.
Deoarece cursorul este declarat explicit in bloc, atributele sale
sunt disponibile in cadrul ciclului pentru testare, daca este
necesar.
Exemplu:
DECLARE
CURSOR c1 IS SELECT employee_id, first_name, last_name,
salary FROM employees;
result NUMBER;
BEGIN
FOR rec IN c1 LOOP
result := rec.salary / 2;
INSERT INTO aaa a VALUES (rec.employee_id, result);
END LOOP;
COMMIT;
END;
/

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

72

11.12 PROCEDURI SI FUNCTII


Subprogramele admise de PL/SQL sunt PROCEDURE si
FUNCTION.
Sintaxa comenzii pentru crearea une proceduri permite
specificarea explicita a parametrilor de intrare IN si iesire
OUT sau de intrare iesire IN OUT :
[CREATE [OR REPLACE] IN CURENT_USER
PROCEDURE nume _procedura (par1 OUT tip [:=expr]
[AUTHID DEFINER ]
IN OUT
AS
Var1 tip1; -- declaratii variabile, recorduri si cursoare locale
Var2 tip2;
Cursor c1 AS SELECT.....;
BEGIN
Comenzi executabile...
.......
EXCEPTION
Comenzi tratare erori ...
.......
END nume_procedura;
/
Procedurile fara CREATE sunt proceduri standalone si nu se
memoreaza.
O comanda de definire procedura se comporta ca un bloc
PL/SQL cu nume.
Sintaxa comenzii de creare a unei functii este
asemanatoare cu cea procedurii dar ea returneaza o
singura valoare si poate fi utilizata ca operator in expresii:
[CREATE [OR REPLACE] CURENT_USER
FUNCTION nume _functie (par1 tip [:=expr] [AUTHID
DEFINER ]
RETURN tip_functie
AS
Var1 tip1; -- declaratii variabile, recorduri si cursoare locale
Var2 tip2;
Cursor c1 AS SELECT.....;
BEGIN
Comenzi executabile...

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

73

.......
RETURN expr;
EXCEPTION
Comenzi tratare erori ...
.......
END nume_procedura;
/

CURS ORACLE SQL PL/SQL- SUPORT DE CURS

74

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