Documente Academic
Documente Profesional
Documente Cultură
SQL si PL/SQL
SUPORT DE CURS
Data crearii:
11 Decembrie 2009
Autor:
Bogdan Oltei
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
Are facilitati
inteligente;
Prelucrarea paralela
regasire, actualizare;
de
salvare/restaurare
pentru:
automate
replicare,
cereri
si
de
E_mail,
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,
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.
10
11
12
, sau se
13
Etc.
14
15
16
17
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.
19
20
21
22
23
24
sau
Select * from employees _;
sau
Select all from employees _;
25
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
+
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
26
-/*
*/
comentariu
comentariu
comentariu
27
28
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:
30
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
32
si
denumirea
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
34
de
de
de
de
la
la
la
la
35
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.
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)
36
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.
')
ASCII (expresie)
CHR(expresie)
37
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
CEIL(1.4) = 2
CEIL(1.6) = 2
CEIL(1234.56) = 1235
CEIL(-1234.56)= -1234
FLOOR (n)
FLOOR(1.4) = 1
FLOOR(1.6) = 1
FLOOR (1234.56) = 1234
FLOOR (-1234.56) = -1235
MOD (m,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)
(1234.56) = 1234
(123456, -2) = 123400
(1234.56) = 1234
(1234.56,1) = 1234.5
38
VARIANCE
Dispersia
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)
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)
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
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
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)
VARIANCE (dispersia).
Observaii:
40
41
Minus
Select * from employees where salary=4800;
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,
42
43
44
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;
46
47
poate
avea
una
dintre
48
Exemplu:
a) Modificarea valoare coloana transaction_source:
UPDATE employees SET salary=1 WHERE department_id=50
49
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):
50
PARTITIONED
TEMPORARY
NESTED
51
52
53
54
55
56
57
58
*/
59
60
[(precizia,
scala)]
[NOT
Exemple:
61
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;
/
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' ;
63
:= TRUE;
:= FALSE;
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
64
65
66
67
DELETE ON aaa
DECLARE
dummy INTEGER;
BEGIN
insert into aaa values (999, 888) ;
END;
68
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.
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,
71
72
73
.......
RETURN expr;
EXCEPTION
Comenzi tratare erori ...
.......
END nume_procedura;
/
74