Sunteți pe pagina 1din 25

Universitatea

Politehnica
Facultatea de Catedra de
Calculatoare
Cuprins Introducere n PL/SQL Blocuri anonime
Calculatoare

Introducere n PL/SQL PL/SQL este un limbaj structurat pe blocuri

Laborator 1 de tratare a erorilor Declare


Blocuri anonime

Blocuri anonime
Blocuri imbricate
Autori: Rularea blocurilor PL/SQL n SQL*Plus tratare a erorilor
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-

10.10.2016 Laborator 1 2 10.10.2016 Laborator 1 3 10.10.2016 Laborator 1 4

Blocuri anonime Blocuri anonime Blocuri anonime Blocuri anonime

Fiecare bloc ncepe cu unul dintre cuvintele


cheie declare sau begin este: id-ul 7839. Developer se va folosi comanda:
Cuvntul begin este punctul de nceput al DECLARE set serveroutput on;
blocului
BEGIN
bufferul SQL dbms_output.put_line(string);
EXCEPTION
folosind operatorul ||:
END; ||nume
10.10.2016 Laborator 1 5 10.10.2016 Laborator 1 6 10.10.2016 Laborator 1 7 10.10.2016 Laborator 1 8

Blocuri anonime Blocuri anonime Blocuri Blocuri

Obs. Pentru a folosi select ntr-un bloc se va -ul ;


Clerk, salariu ; DECLARE
INTO -ul 7566. Declararea variabilelor pentru toate blocurile
BEGIN
BEGIN blocul 1
EXEPTION
declare
DECLARE. END;
Obs. Blocurile declare exception nu sunt BEGIN bloc 2
obligatorii. EXCEPTION
END;
END;

10.10.2016 Laborator 1 9 10.10.2016 Laborator 1 10 10.10.2016 Laborator 1 11 10.10.2016 Laborator 1 12

Blocuri Blocuri Blocuri Blocuri imbricate

-ul Blocurile imbricate sunt blocuri care se


1235 introdus de la tastatura, numele Ionescu, ; ;
n exemplul de mai sus: -blocuri;
pentru acest angajat un comision de 200. ecuson emp.empno%type := &empid Variabile pot fi transmise de la bloc la sub-
bloc,

corelat %type.

10.10.2016 Laborator 1 13 10.10.2016 Laborator 1 14 10.10.2016 Laborator 1 15 10.10.2016 Laborator 1 16


Blocuri imbricate Blocuri imbricate Blocuri imbricate Blocuri Imbricate

Observatii:
DECLARE -- variabile bloc 1, bloc 2, bloc 3 modifice comisionul pentru acesta.
BEGIN
BEGIN -- bloc 1
/* ..... */
BEGIN -- bloc 2
BEGIN -- bloc 3 --
EXCEPTION -- tratare erori bloc 3
END; -- bloc 3 Primul bloc face o inregistrare folosind variabile
EXCEPTION -- tratare erori bloc 2 de substituire (&&ecuson);
END; -- bloc 2
EXCEPTION -- tratare erori bloc 1
END; -- bloc 1 ecuson (&ecuson .
END;
10.10.2016 Laborator 1 17 10.10.2016 Laborator 1 18 10.10.2016 Laborator 1 19 10.10.2016 Laborator 1 20

Rularea blocurilor PL/SQL n SQL*Plus Rularea blocurilor PL/SQL n SQL*Plus Rularea blocurilor PL/SQL n SQL*Plus Rularea blocurilor PL/SQL n SQL*Plus

Blocurile PL/SQL pot fi editate direct n linia de APPEND text


Abreviere
A text
Utilizare n linia
\ permite salvarea ntr-
CHANGE C/old/new
text CHANGE C/text/ Un bloc poate fi editat pe mai multe rnduri tastnd \
CLEAR BUFFER CL BUFF prealabil n buffer
n SQL*Plus, editorul setat implicit se DELETE DEL astfel: \
edit (sau INPUT I
a. \
prescurtarea ed) sau folosind meniul Editor INPUT text I text din text-ul respectiv
/ sau RUN
LIST L liniile din buffer-ul SQL (ultimul bloc)
din bara de meniu LIST n Ln
b. \
blocuri) astfel:
LIST m,n L m,n EXIT
SQL> @cale_fieier\nume_fisier.sql
RUN R curent din buffer
SQL> start cale_fieier\nume_fisier.sql
/ din buffer

10.10.2016 Laborator 1 21 10.10.2016 Laborator 1 22 10.10.2016 Laborator 1 23 10.10.2016 Laborator 1 24

Rularea blocurilor PL/SQL n SQL*Plus Exemple Exemple Exemple

Utilizare
set serveroutput on;
set lines n Permite tabel numit mesaje:
set pages n Permite printarea a n coloane

no_data_found
mesaje,
;
too_many_rows Pentru a vedea rezultatul procedurii se va face un select pe
tabela mesaje:
SQL> SELECT * FROM MESAJE;

10.10.2016 Laborator 1 25 10.10.2016 Laborator 1 26 10.10.2016 Laborator 1 27 10.10.2016 Laborator 1 28

Exemple Exemple Exemple Exemple

Ex. 6. n exem

unui angajat introducnd id- -ul


.

10.10.2016 Laborator 1 29 10.10.2016 Laborator 1 30 10.10.2016 Laborator 1 31 10.10.2016 Laborator 1 32


Exemple Universitatea
Politehnica
Facultatea de Catedra de
Calculatoare
Cuprins
Calculatoare

E ;

SQL>@cale_fisier\ex7.sql Tipuri de variabile


Tipuri scalare
nainte de utilizare;
Laborator 2 Tipuri de date calendaristice
departamentele 20, 40, 50. Tipuri corelate
Tipuri compuse ;

Tipuri LOB (Large Objects) domeniu valid de valori;


Autori Tipuri de operatori
Conf. Dr. Ing. Alexandru Boicea identificator [CONSTANT]{tip_de_date | identificator%TYPE |
As. Drd. Ing. Ciprian- Tipuri de simboluri identificator%ROWTYPE} [NOT NULL] [{:= | DEFAULT}
expresie_PL/SQL];

10.10.2016 Laborator 1 33 10.10.2016 Laborator 2 2 10.10.2016 Laborator 2 3

Tipuri scalare Tipuri scalare Tipuri scalare Tipuri scalare

Exemplu: nume_angajat are un


: ora cuprind tipurile DATE, TIMESTAMP, TIMESTAMP v_valoare NUMBER(15) NOT NULL := 0; venit orar de venit_orar
denumire_departament. A lucrat n firma un num
tipul NUMBER cu subtipurile DEC, DECIMAL, DOUBLE PRECISION, WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME v_data_achizitie DATE DEFAULT SYSDATE;
FLOAT, INTEGER, INT, NUMERIC, REAL, SMALLINT; zile_lucrate zile
tipul BINARY_INTEGER cu subtipurile NATURAL, NATURALN, POSITIVE,
ZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY TO v_material VARCHAR2(15) := 'Matase';
POSITIVEN, SIGNTYPE; SECOND; c_valoare CONSTANT NUMBER := 100000;
tipul PLS_INTEGER.
v_stare VARCHAR2(20) DEFAULT 'Buna';
: includ tipurile NCHAR si NVARCHAR2; v_clasificare BOOLEAN DEFAULT FALSE;
tipul VARCHAR2 cu subtipurile STRING, VARCHAR;
tipul de date CHAR cu subtipul CHARACTER;
int_an_luna INTERVAL YEAR TO MONTH :=
tipurile LONG, RAW, LONG RAW, ROWID. false sau null). INTERVAL '3-2' YEAR TO MONTH; --interval de 3 ani si 2 luni
http://docs.oracle.com/database/121/LNPLS/datatypes.htm#LNPLS003

10.10.2016 Laborator 2 4 10.10.2016 Laborator 2 5 10.10.2016 Laborator 2 6 10/10/2016 Laborator 2 7

Tipuri scalare Tipuri scalare Tipuri scalare Tipuri scalare

10.10.2016 Laborator 2 8 10.10.2016 Laborator 2 9 10.10.2016 Laborator 2 10 10.10.2016 Laborator 2 11

Tipuri scalare Tipuri corelate Tipuri corelate Tipuri corelate

Tipurile corelate sunt folosite pentru a declara


variabile de tipul unui rnd de tabel sau al unei
coloane de tabel;

-un tabel
;
Tipuri corelate:
%type
%rowtype vector de tipul unui rnd de tabel

10.10.2016 Laborator 2 12 10.10.2016 Laborator 2 13 10.10.2016 Laborator 2 14 10.10.2016 Laborator 2 15


Tipul nregistrare Tipul RECORD Tipul RECORD Tipul RECORD

Tipurile scalare nu au componente interne, n timp Declararea tipului RECORD se face conform ncepnd cu Oracle9i, pentru tipul RECORD sunt Ex. 5. Un exemplu de utilizare a tipului RECORD.
ce tipurile compuse au componente interne care se
pot manipula. TYPE nume_tip IS RECORD Se poate insera (INSERT) o linie ntr-un tabel utiliznd tipul
Tipuri compuse RECORD;
record Se poate actualiza (UPDATE) o linie ntr-un tabel utiliznd
NULL] {:= | DEFAULT} expresie1], tipul RECORD (cu sintaxa SET ROW);

numele coloanelor sunt propr RETURNING a comenzilor UPDATE sau DELETE;


tabel NULL] {:= | DEFAULT} expresie2],
multe linii, atunci pot fi utilizate n sintaxa BULK COLLECT

10.10.2016 Laborator 2 16 10.10.2016 Laborator 2 17 10.10.2016 Laborator 2 18 10.10.2016 Laborator 2 19

Tipul RECORD Tipul RECORD Tipul RECORD Tipul RECORD

Ex. 6. Folosindu-se tipul compus RECORD :


;
ament folosind o
;
-un
record ;
-se
- ;

returneze ntr- .
10.10.2016 Laborator 2 20 10.10.2016 Laborator 2 21 10.10.2016 Laborator 2 22 10.10.2016 Laborator 2 23

Tipul Vector Tipul Vector


Descriere
Ex. 7. Exemplul folosire varray
COUNT
FIRST Indicele primului element din tablou
limbajele C sau Java;
Varrays LAST Indicele ultimului element din tablou ;
Index-by table EXISTS -to-many, atunci cnd
specificat
Nested tables NEXT
;
PRIOR
;
DELETE
EXTEND Tipul de date vector este declarat utiliznd sintaxa:
LIMIT
pentru tablouri imbricate OF tip_elemente [NOT NULL]
TRIM

Mai multe la adresa


http://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS00508
10.10.2016 Laborator 2 24 10.10.2016 Laborator 2 25 10.10.2016 Laborator 2 26 10.10.2016 Laborator 2 27

Tipul Index-by Table Tipul Index-by Table Tipul Index-by Table Tipul Nested Table

Ex. 8. Exemplu de folosire Index-by Table


Elementele unui tablou indexat nu sunt ntr-
tabloului; fi inserate cu chei arbitrare; folosesc drept indici numere consecutive;
;
Declararea tipului TABLE se face cu ;
;
;
TYPE nume_tip IS TABLE OF
chei);
;
;
nume_tabel%ROWTYPE} ; pentru a insera un element nou, tabloul trebuie extins cu
metoda EXTEND(nr_comp).
INDEX BY tip_indexare;

10.10.2016 Laborator 2 28 10.10.2016 Laborator 2 29 10.10.2016 Laborator 2 30 10.10.2016 Laborator 2 31


Tipul Nested Table Tipul Nested Table Tipul Nested Table

-un tablou imbricat, acesta Ex. 9. Exemplu de folosire al unui tabel imbricat.
Can Be
; Number of Subscript Dense or
pot fi stocate n baza de date; Collection Type Where Created Object Type
Elements Type Sparse
Tabelele indexate nu au constructori; Attribute
;
Associative array
; String or Only in PL/SQL
(or index-by Unbounded Either No
integer block
table)
Comanda de declarare a tipului de date tablou ; Starts dense, Either in PL/SQL
imbricat are sintaxa: Nested table Unbounded Integer can become block or at Yes
declarare. sparse schema level
TYPE nume_tip IS TABLE OF tip_elemente [NOT
Either in PL/SQL
NULL]; niciun element (vida), dar care are valoarea not null.
Variable-size array
Bounded Integer Always dense block or at Yes
(varray)
schema level

10.10.2016 Laborator 2 32 10.10.2016 Laborator 2 33 10.10.2016 Laborator 2 34 10.10.2016 Laborator 2 35

Ex. 10. Definirea tipurilor direct n baza de date Ex. 11. Folosirea BULK COLLECT INTO cu varray.
Pentru a insera mai multe valori ntr-o

COLLECT INTO;

10.10.2016 Laborator 2 36 10.10.2016 Laborator 2 37 10.10.2016 Laborator 2 38 10.10.2016 Laborator 2 39

Ex. 12. Folosirea BULK COLLECT INTO cu index-by table. Ex. 13. Folosirea BULK COLLECT INTO cu nested table. Pentru a crea un table Ex. 14. Crearea unui tabel cu coloanele definite de utilizator.
definite de dezvoltatori se va folosi un
table(index-by sau nested
RECORD.

10.10.2016 Laborator 2 40 10.10.2016 Laborator 2 41 10.10.2016 Laborator 2 42 10.10.2016 Laborator 2 43

Tipul LOB Tipul LOB


Data Description
Tipuri LOB (Large OBject) sunt folosite pentru Type
:
CLOB A character large object containing single-byte or multibyte characters. ;
adresa: . Both fixed-width and variable-width character sets are supported, both
using the database character set. Maximum size is (4 gigabytes - 1) * f
https://docs.oracle.com/database/121/ADOBJ/adobjint (database block size). lexicale;
.htm#ADOBJ001 NLOB A character large object containing Unicode characters. Both fixed- Cuvintele rezervate nu pot fi folosite ca identificatori dect ntre ghilimele
width and variable-width character sets are supported, both using the duble;
Mai multe detalii la adresa: database national character set. Maximum size is (4 gigabytes - 1) *
(database block size). Stores national character set data. ;
http://docs.oracle.com/database/121/LNPLS/composit
BLOB A binary large object. Maximum size is (4 gigabytes - 1) * (database ;
es.htm#LNPLS005 block size).
BFILE Contains a locator to a large binary file stored outside the database. --
Enables byte stream I/O access to external LOBs residing on the
database server. Maximum size is 4 gigabytes.

10.10.2016 Laborator 2 44 10.10.2016 Laborator 2 45 10.10.2016 Laborator 2 46 10.10.2016 Laborator 2 47


Tipuri de operatori Tipuri de operatori Tipuri de simboluri Tipuri de simboluri
Operator Descriere Operator Descriere
+ Adunare Tipuri de simboluri simple:
NOT BETWEEN ... AND ... Nu
- lor
NOT IN (list) -
* Multiplicare Ordine Descriere Simbol Descriere
/ NOT LIKE
1 ** , NOT () Delimitator
** Exponen IS NOT NULL
2 +, - ;
= Egalitate NOT numecoloana = Diferit de 3 *, /
> Mai mare , Separator de obiect
NOT numecoloana Mai mic sau egal | Mai mare sau egal | Mai mare 4 +, -, ||
< Mai mic . Selector
{>|<|<=|>=} | Mai mic
<> Diferit de
5 =, !=, <, >, <=,>=,IS NULL, LIKE, @ Delimitator de acces la baza de date
BETWEEN ... AND ... ntre BETWEEN, IN
!= Diferit de (Unix)
IN (list) Cuprins ntr- 6 AND
^= Diferit de (IBM) : Delimitator de server
<= Mai mic sau egal LIKE de caractere 7 OR incluziune
$ USD
>= Mai mare sau egal IS NULL
&
%

10.10.2016 Laborator 2 48 10.10.2016 Laborator 2 49 10.10.2016 Laborator 2 50 10.10.2016 Laborator 2 51

Tipuri de simboluri Domeniul v Domeniul v Domeniul v

-bloc se pot
Tipuri de simboluri compuse: PL/SQL permite o varietate de tipuri de date ce pot fi folosite
folosi att variabilele definite local
program n care acestea pot fi folosite; ;
;
Simbol Descriere
-un sub-bloc se
:= Asignare
care au fost definite sau n orice sub-bloc inclus n acesta; -
=> Asociere
Variabilele declarate ntr-un sub-bloc pot fi folosite doar n nume ca una dintr-un bloc blocului;
.. Rang
acesta sau n sub-blocurile acestuia; superior atunci are prioritate cea
|| Concatenare -se variabila
<< >> Variabilele se pot transmite de la un bloc la sub- ;
;
-- invers; Instructiunile PL/SQL nu sunt case sensitive;
/* */ Comentatiu pe mai multe linii
. confuzii. de la 0-
simboluri speciale.
compuse.

10.10.2016 Laborator 2 52 10.10.2016 Laborator 2 53 10.10.2016 Laborator 2 54 10.10.2016 Laborator 2 55

Universitatea Facultatea de
Catedra de
Cuprins Prezentare
Politehnica
Calculatoare
Calculatoare

, cu puterea IF conditions
Laborator 3 de manipulare a datelor, ; THEN statements;
END IF;
conditions
;
le; statements le;
u u
Autori
conditions sunt ndeplinite.
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
imbricate.

10.10.2016 Laborator 3 2 10.10.2016 Laborator 3 3 10.10.2016 Laborator 3 4

IF conditions
Testa i cu id-ul 7698. THEN statements_1; n companie. (testati cu 7876 si 7369)
ELSE statements_2;
END IF;
conditions
statements_1
statements_1
cnd conditions este TRUE
statements_2
cnd conditions este FALSE

10.10.2016 Laborator 3 5 10.10.2016 Laborator 3 6 10.10.2016 Laborator 3 7 10.10.2016 Laborator 3 8


conditions_1
IF conditions_1 statements_1
THEN statements_1; statements_1 ;
executate atunci cnd conditions_1 = TRUE ELSIF
ELSIF conditions_2
conditions_2 ELSE;
THEN statements_2; statements_2
Clauza ELSE
... statements_2 .
[ELSE statements_k;] executate atunci cnd conditions_2 = TRUE
END IF; statements_k
tre conditions_1..k-1 nu sunt
verificate
10.10.2016 Laborator 3 9 10.10.2016 Laborator 3 10 10.10.2016 Laborator 3 11 10.10.2016 Laborator 3 12

,
[<<label_name>>]
conducerii companiei care nu a primit comision, dar CASE expresion
WHEN value1 THEN statements_1; ;
WHEN value2 THEN statements_2;
;
...
[ELSE statements_k;]
END CASE [label_name]; 10%, 15%, 20% sau 25% din venit;
expresion
statements_1 din venit;
expresion = value1
statements_2
expresion = value2
statements_k expresion <>
value1, value2, ...

10.10.2016 Laborator 3 13 10.10.2016 Laborator 3 14 10.10.2016 Laborator 3 15 10.10.2016 Laborator 3 16

searched CASE ; :
searched case este:
[<<label_name>>]
CASE
WHEN search_condition1 THEN sequence_of_statements1;
WHEN search_condition2 THEN sequence_of_statements2;
...
WHEN search_conditionN THEN sequence_of_statementsN;
[ELSE sequence_of_statementsN+1;]
END CASE [label_name];

10.10.2016 Laborator 3 17 10.10.2016 Laborator 3 18 10.10.2016 Laborator 3 19 10.10.2016 Laborator 3 20

clauza where a unei cereri:


unii CASE n clauza SELECT.
Observatii:
Clauza ELSE
;
ELSE tre
clauzele WHEN
eroarea CASE_NOT_FOUND.

10.10.2016 Laborator 3 21 10.10.2016 Laborator 3 22 10.10.2016 Laborator 3 23 10.10.2016 Laborator 3 24


LOOP
;
;
EXIT
Sintaxa:
;
[<<label_name>>] parte dintr-un departament specificat.
EXIT -un IF n cadrul blocului LOOP,
LOOP ;
statements; WHEN IF, cum se vede n
EXIT [label_label] [WHEN conditions]; :
END LOOP [label_name]; LOOP
statements statements;
label_name IF conditions THEN
; statements_in_if;
conditions EXIT; -- exit loop immediately
END IF;
. END LOOP;

10.10.2016 Laborator 3 25 10.10.2016 Laborator 3 26 10.10.2016 Laborator 3 27 10.10.2016 Laborator 3 28

Instruc iunea WHILE Instruc iunea WHILE Instruc iunea WHILE Instruc iunea FOR

Instructiunea WHILE e FOR


; repetitive;
:
WHILE conditions FOR contor IN [REVERSE] value1 .. value2
LOOP
LOOP
statements
statements;
END LOOP;
END LOOP;
contor este contorul folosit pentru incrementarea
conditions
buclei; value1 .. value2
statements contorului (value1 <= value2)
cadrul buclei. statements
buclei
10.10.2016 Laborator 3 29 10.10.2016 Laborator 3 30 10.10.2016 Laborator 3 31 10.10.2016 Laborator 3 32

Instruc iunea FOR Instruc iunea FOR Instruc iunea FOR Instruc iunea FOR

Observatii: Observatii:
Incrementarea (cazul cu IN) sau decrementarea (cazul IN REVERSE)
; Buclele pot fi imbricate pe mai multe niveluri;
REVERSE n general,
;
bucle care o include, exceptnd cazul cnd este
;
adica nu are niciun
rezultat :
FOR contor IN maxVal .. minVal
GOTO
LOOP tre ;
statements GOTO
END LOOP
dintr-

10.10.2016 Laborator 3 33 10.10.2016 Laborator 3 34 10.10.2016 Laborator 3 35 10.10.2016 Laborator 3 36

Instruc iunea FOR Instruc iunea FOR

GOTO: - :

10.10.2016 Laborator 3 37 10.10.2016 Laborator 3 38 10.10.2016 Laborator 3 39 10.10.2016 Laborator 3 40


Structuri de control PL/SQL Universitatea Facultatea de Catedra de
Cuprins
Politehnica
Calculatoare
Calculatoare

http://docs.oracle.com/database/121/LNPLS/control
statements.htm#LNPLS004
Laborator 4
Tratarea excep ilor Predefinite
Nedefinite
coduri de eroare tip ORA-
programator;
Autori Definite
Conf. Dr. Ing. Alexandru Boicea de programator.
As. Drd. Ing. Ciprian-Octavian

10.10.2016 Laborator 3 41 10.10.2016 Laborator 4 2 10.10.2016 Laborator 4 3

Cod Eroare Cod SQL Descriere

Clauza WHEN OTHERS ACCESS_INTO_NULL


(ORA)
ORA-06530
(SQLCODE)
-6530
DECLARE excep
... memorie)

automat de SGBD; netratate; CASE_NOT_FOUND ORA-06592 -6592


BEGIN
...
EXCEPTION WHEN EXCEPTION ; COLLECTION_IS_NULL ORA-06531 -6531

. WHEN exception_1 [OR exception_2 ...] then statements_1; CURSOR_ALREADY_OPEN ORA-06511 -6511
... deschis. Cursorul trebuie nchis nainte de

WHEN exception_k [OR exception_k+1 ...] then statements_k;


http://docs.oracle.com/database/121/ERRMG/toc.htm redeschidere
DUP_VAL_ON_INDEX ORA-00001 -1
[WHEN OTHERS THEN statements_n;] valori duble ntr-
END; UNIQUE
INVALID_CURSOR ORA-01001 -1001
exception_i moment) cu un cursor. De exemplu
statements_i nchiderea unui cursor nedeschis.

10.10.2016 Laborator 4 7
10.10.2016 Laborator 4 4 10.10.2016 Laborator 4 5 10.10.2016 Laborator 4 6

Cod Eroare Cod SQL


(ORA) (SQLCODE)
Descriere Cod Eroare Cod SQL
(ORA) (SQLCODE)
Descriere
ID
INVALID_NUMBER ORA-01722 -1722 -o valoare SUBSCRIPT_BEYOND_COUNT ORA-06533 -6533 S- - : deptno = 10 blocul
;
LOGIN_DENIED ORA-01017 -1017
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 -6532 S- - Pentru deptno = 50 se
NO_DATA_FOUND ORA-01403 +100 -
NOT_LOGGED_ON ORA-01012 -1012
SYS_INVALID_ROWID ORA-01410 -1410 -o 01403 deoarece n tabela
conectarea la aceasta
TIMEOUT_ON_RESOURCE ORA-00051 -51
PROGRAM_ERROR ORA-06501 -6501
departament;
TOO_MANY_ROWS ORA-01422 -1422
ROWTYPE_MISMATCH ORA-06504 -6504
mai mult de o nregistrare. Pentru a evita o astfel de
VALUE_ERROR ORA-06502 -6502 Un calcul aritmetic, o conversie sau o
SELF_IS_NULL ORA-30625 -30625
constrngere a valorii a generat o eroare.

STORAGE_ERROR ORA-06500 -6500 ZERO_DIVIDE ORA-01476 -1476


S- -
no_data_found.

10.10.2016 Laborator 4 8 10.10.2016 Laborator 4 9 10.10.2016 Laborator 4 10 10.10.2016 Laborator 4 11

Sintaxa erorilor nedefinite este:


precedent: DECLARE
une dar ...
pot fi tratate prin interceptarea codului de exception_name EXCEPTION;
PRAGMA EXCEPTION_INIT(exception_name,
eroare ORA-..... rea unui cod de exception_code);
program dorit. ...
BEGIN
...
EXCEPTION
...
WHEN exception_name THEN statements;
...
END;

10.10.2016 Laborator 4 12 10.10.2016 Laborator 4 13 10.10.2016 Laborator 4 14 10.10.2016 Laborator 4 15


exception_name
tabelul emp
error_code SQLCODE empno not null.

statements 0 -a ntlnit o eroare


SQLCODE a generat eroarea ORA-
1
01400 cu mesajul cannot insert NULL into
+100 NO_DATA_FOUND
DECLARE a blocului prin cuvintele cheie Valori negative pentru alte erori ale bazei
rezervate PRAGMA EXCEPTION_INIT insert_angajat, tratarea
ui Nu se accepta inregistrari noi in
tabela emp fara empno
10.10.2016 Laborator 4 16 10.10.2016 Laborator 4 17 10.10.2016 Laborator 4 18 10.10.2016 Laborator 4 19

-
n formatul PLS-xxxxx, unde xxxxx este codul de EXCEPTION
eroare;
Acest cod este diferit de codul ORA-yyyyy generat de catre programator;
SGBD; -
e PLS ;

-se

10.10.2016 Laborator 4 20 10.10.2016 Laborator 4 21 10.10.2016 Laborator 4 22 10.10.2016 Laborator 4 23

Sunt excep
exception_name - ID se
DECLARE RAISE introduce
... de programator
;
exception_name EXCEPTION
statements DECLARE;
...
BEGIN ; RAISE pentru generarea
... Limbajul PL/SQL permite astfel programatorului -
IF condition THEN ; RAISE exception_name
RAISE exception_name
END IF; EXCEPTION.
... DECLARE
EXCEPTION RAISE.
...
WHEN exception_name THEN statements;
...
END;
10.10.2016 Laborator 4 24 10.10.2016 Laborator 4 25 10.10.2016 Laborator 4 26 10.10.2016 Laborator 4 27

mesajului ;

IF
-un bloc, iar acesta nu are
EXCEPTION

superior sau n blocul apelant;

10.10.2016 Laborator 4 28 10.10.2016 Laborator 4 29 10.10.2016 Laborator 4 30 10.10.2016 Laborator 4 31


RAISE_APPLICATION_ERROR;
comision;

- procedurile apelate;
Sintaxa este:
raise_application_error(error_number, message [,
{TRUE | FALSE}])

10.10.2016 Laborator 4 32 10.10.2016 Laborator 4 33 10.10.2016 Laborator 4 34 10.10.2016 Laborator 4 35

error_number
eroare -20100.
valori ntre - -20999);
message catre sistemul de gestiune.
;
TRUE|FALSE

prelua mesaje de la alte niveluri.


10.10.2016 Laborator 4 36 10.10.2016 Laborator 4 37 10.10.2016 Laborator 4 38 10.10.2016 Laborator 4 39

-un

10.10.2016 Laborator 4 40 10.10.2016 Laborator 4 41 10.10.2016 Laborator 4 42 10.10.2016 Laborator 4 43

Universitatea Facultatea de Catedra de


Cuprins
Politehnica
Calculatoare
Calculatoare

- Cursoare implicite
http://docs.oracle.com/database/121/LNPLS/errors.ht Cursoare explicite
departamentul 40 nu are niciun angajat; m#LNPLS007 Laborator 5 Cursoare cu parametri
Cursoare PL/SQL Tipuri de variabile REF CURSOR,

no_data_found;
Autori
cererii SELECT, din cauza aceasta, Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
.

10.10.2016 Laborator 4 44 10.10.2016 Laborator 4 45 10.10.2016 Laborator 5 2


Cursoare Cursoare implicite Cursoare implicite Cursoare implicite

n PL/SQL se cree Ex. 3. Exemplu corect de folosire a unui cursor implicit care
- (SELECT, INSERT, DELETE, UPDATE); :
;
;
Implicite create implicit de catre sistemul de gestiune pentru toate e

nregistrare;
Explicite create de dezvoltatori pentru controlul comenzilor DML De exemplu, - Ex. 2. Exemplu corect de folosire a unui cursor implicit (clauza where
. by table, nested table) cu un BULK COLLECT INTO ntr-un SELECT care :

valori intr-

10.10.2016 Laborator 5 3 10.10.2016 Laborator 5 4 10.10.2016 Laborator 5 5 10.10.2016 Laborator 5 6

Cursoare explicite Cursoare explicite Cursoare explicite Cursoare explicite

Cursoarele explicite sunt declarate de catre utilizator cursore_name numele atribuit cursorului
DECLARE -based) este o
; column_names numele coloanelor returnate de cursor
;
table_names numele tabelelor folosite de interogare
; conditions
semnalndu-se eventualele erori de compilare;
atributul %ROWTYPE;
Sintaxa este: parameter
DECLARE parameter_type tipul parametrilor Referirea unui element al variabilei de tip cursor se face
maxim de cursoare care se pot deschide pe parcursul unei sesiuni: CURSOR cursor_name [(<parameter> <parameter_type>)] IS variable
for update lock) selectate de cursor n unei coloane din tabel):
SELECT column_manes FROM table_names
privilegiu de DBA enzile: WHERE conditions baza de date value := variable_name.element_name
select name, value from v$parameter where name like Observatii:
'open_cursors'; identificator, deci
variable cursor_name%rowtype;
ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH; ; nici folosi n expresii;
. c
.
cursorului.
10.10.2016 Laborator 5 7 10.10.2016 Laborator 5 8 10.10.2016 Laborator 5 9 10.10.2016 Laborator 5 10

Cursoare explicite Cursoare explicite Cursoare explicite Cursoare explicite


Fiecare cursor explicit are patru atribute care sunt setate automat de catre
Cursorul se deschide cu valorile actuale pentru fiecare Atribut
:
-se ca rezultat liniile care vor %NOTFOUND :
constitui setul activ de date; Atribut -
valori prestabilite; ;
Sintaxa este: %ISOPEN -
OPEN cursor_name [(<parameter> <parameter_type>)]; -a deschis cursorul se pot atribui parametrii actuali cursorul este nchis; executat;
cursor_name - numele atribuit cursorului la parametrii formali folosind operatorul de atribuire; %FOUND : - -a efectuat cu succes;
- - .
parameter numele parametrilor formali ai cursorului
;
parameter_type tipul parametrilor
- %ROWCOUNT :
cursor; executat; -
. - -a efectuat cu succes; ;
- . - .

10.10.2016 Laborator 5 11 10.10.2016 Laborator 5 12 10.10.2016 Laborator 5 13 10.10.2016 Laborator 5 14

Cursoare explicite Cursoare explicite Cursoare explicite Cursoare explicite

FETCH -o CLOSE se nchide setul de linii returnate


; DECLARE numele angajatului, salariul
Sintaxa este: de catre ; CURSOR cursor_name IS select ...; venit n companie n 1981.
LOOP Sintaxa este: variable cursor_name%rowtype;
FETCH cursor_name INTO variable_names; BEGIN
EXIT WHEN condition;
CLOSE cursor_name; OPEN cursor_name;
... cursor_name numele cursorului LOOP
END LOOP; FETCH cursor_name INTO variable;
cursore_name numele atribuit cursorului EXIT WHEN condition
variable_names pierde; ...
END LOOP;
condition CLOSE cursor_name;
FETCH cursor nchis trebuie redeschis cursorul. END
activ, ; n general, condition este cursor_name%NOTFOUND

10.10.2016 Laborator 5 15 10.10.2016 Laborator 5 16 10.10.2016 Laborator 5 17 10.10.2016 Laborator 5 18


Cursoare explicite Cursoare explicite Cursoare explicite Cursoare explicite

Setul activ de date definite de cursorul c_angajati Ciclul FOR este folosit pentru simplificarea sintaxei de prelucrare a liniilor
managerilor din companie. dintr-un cursor;
este procesat linie cu linie;
ciclul;
Sintaxa este:
DECLARE
liniilor din setul activ;
CURSOR cursor_name IS select ...;
variable cursor_name%rowtype;
BEGIN
; FOR variacle IN cursor_name
LOOP
...
resetate. END LOOP;
END;
10.10.2016 Laborator 5 19 10.10.2016 Laborator 5 20 10.10.2016 Laborator 5 21 10.10.2016 Laborator 5 22

Cursoare explicite Cursoare explicite Cursoare explicite Cursoare explicite

Ciclul FOR Ex. 6. Rescriere exemplu 5 folosind FOR. ntr-un ciclu FOR se poate folosi un SELECT care este tot un cursor, dar SELECT n ciclul FOR.
;
Sintaxa este:

OPEN ; BEGIN
FOR variable IN (SELECT column_manes FROM table_names
FETCH ; WHERE conditions)
LOOP
CLOSE. ...
END LOOP;
END;

10.10.2016 Laborator 5 23 10.10.2016 Laborator 5 24 10.10.2016 Laborator 5 25 10.10.2016 Laborator 5 26

Cursoare explicite Cursoare explicite Cursoare explicite Cursoare explicite

Cnd ne referim la rndul curent dintr-un cursor explicit Ex. 9. S din tabela EMP Parametrii permit transmiterea unor valori efective
comenzile SQL pot folosi clauza WHERE CURRENT OF peste 20 ani vechime n companie.
unui cursor cnd acesta este deschis;
cursor_name;

cursorului;
n clauza WHERE ;
FOR UPDATE n definirea scalare, dar nu primesc dimensiuni;
cursorului pentru a se bloca rndurile la deschidere (se face
un lock);
Clauza WHERE CURRENT OF cursor_name se poate folosi si in
.
.

10.10.2016 Laborator 5 27 10.10.2016 Laborator 5 28 10.10.2016 Laborator 5 29 10.10.2016 Laborator 5 30

Tipuri de variabile
Cursoare explicite Cursoare explicite Cursoare explicite

Ex. 10 -un departament Se poate asocia o interogare unui cursor astfel:


REF CURSOR
;
SYS_REFCURSOR.
Acest mod de a declara un cursor este util n

-
-un cursor folosind o
.

10.10.2016 Laborator 5 31 10.10.2016 Laborator 5 32 10.10.2016 Laborator 5 33 10.10.2016 Laborator 5 34


Tipuri de variabile Tipuri de variabile Tipuri de variabile Tipuri de variabile

Sintaxa REF CURSOR: unde: Sintaxa SYS_REFCURSOR: Ex. 11


DECLARE DECLARE
TYPE ref_cursor IS REF CURSOR;
ref_cursor numele variabilei de tip REF CURSOR c_variable SYS_REFCURSOR;
c_variable ref_cursor; c_variable numele variabilei cursor variable variable_type;
variable variable_type; BEGIN
BEGIN variable numele unei variabile normale OPEN c_variable FOR SELECT column_manes FROM table_names WHERE
OPEN c_variable FOR SELECT column_manes FROM table_names WHERE conditions LOOP
LOOP pentru c_variable FETCH c_variable INTO variable;
FETCH c_variable INTO variable; EXIT WHEN condition
EXIT WHEN condition ...
... END LOOP;
END LOOP; CLOSE c_variable;
CLOSE c_variable; END;
END;
10.10.2016 Laborator 5 35 10.10.2016 Laborator 5 36 10.10.2016 Laborator 5 37 10.10.2016 Laborator 5 38

Tipuri de variabile Tipuri de variabile

Ex. 12 listeze ii din tabela EMP. Ex. 13


salariul
: :

; prelucrat sunt stocate n variabile;

flexibil al liniilor din baza de date, dar fiecare INSERT sau cereri
RDBMS;
;
Efectuarea, pe ct posibil, a calculelor n cererea SELECT; ;
; -
-
.

10.10.2016 Laborator 5 39 10.10.2016 Laborator 5 40 10.10.2016 Laborator 5 41 10.10.2016 Laborator 5 42

Cursoare explicite Cursoare explicite Cursoare explicite

Ex. 14
shared pool) poate fi
;
- tabela EMP :
;

comision_sef = 10% * salariu_mediu_departament


;
Setarea parametrului pe TRUE face ca SGBD- comision_sef = 20% * salariu_mediu_departament
;

10.10.2016 Laborator 5 43 10.10.2016 Laborator 5 44 10.10.2016 Laborator 5 45 10.10.2016 Laborator 5 46

Universitatea Facultatea de Catedra de


Cuprins Subprograme Proceduri PL/SQL
Politehnica
Calculatoare
Calculatoare

Subprograme Un subprogram este un bloc PL/SQL cu nume (spre deosebire de

nu
Proceduri declarate n cadrul unui bloc dintr-un anumit mediu ( de exemplu, SQL*Plus, Oracle Forms,
programul apelant;
Laborator 6 Proceduri stocate
Oracle Reports etc.)
Subprogramele sunt bazate pe structura de bloc PL/SQL.
t fi
Proceduri PL/SQL Parametrii unei proceduri
Similar unui bloc PL/SQL
folosite
Cursoare n proceduri declarare a parametrilor.
Exista 2 tipuri de subprograme:
proceduri;
Autori
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
Cursoare ca parametric Subprogramele pot fi :
locale (n cadrul altui bloc PL/SQL sau subprogram)
stocate (create cu comanda CREATE)
sunt stocate n baza de date de aceea ele se numesc subprograme stocate.

10.10.2016 Laborator 6 2 10.10.2016 Laborator 6 3 10.10.2016 Laborator 6 4


Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc

Sintaxa BEGIN procedure_name numele procedurii


DECLARE [DECLARE parameter_name numele unui parametru formal din lista de parametri
bloc PL/SQL; parameter_type
PROCEDURE procedure_name [(parameter_name [IN|OUT|IN OUT] block_variables;]
numai parameter_type,...)] BEGIN
nume_param varchar(30)
CORECT: nume_param varchar
; {IS|AS} block_executable_section; procedure_declaration_section
[procedure_declaration_section] procedure_name [(parameters)];
BEGIN procedure_executable_section
block_executable_section;
procedure_executable_section; procedure_exception_section
[EXCEPTION
anent n SGBD; [EXCEPTION block_exception_section] block_variables
procedure_exception_section] END; block_executable_section
END [procedure_name]; END; block_exception_section
...
IN|OUT|IN OUT
interiorul sau exteriorul procedurii

10.10.2016 Laborator 6 5 10.10.2016 Laborator 6 6 10.10.2016 Laborator 6 7 10.10.2016 Laborator 6 8

Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc

-un bloc.

bloc care ntoarce salariu maxim pentru un ID de


departamen
-
joburile , n
cadrul procedurii.

10.10.2016 Laborator 6 9 10.10.2016 Laborator 6 10 10.10.2016 Laborator 6 11 10.10.2016 Laborator 6 12

Proceduri stocate Proceduri stocate Proceduri stocate Proceduri stocate

procedure_name numele procedurii IN|OUT|IN OUT


nivelul SGBD- ; sau modificat n interiorul sau exteriorul procedurii , dintr-un anumit
parameter_name numele unui parametru formal din lista departament.
Sintaxa
de parametri [AUTHID {DEFINER|CURRENT_USER}]
CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name
[IN|OUT|IN OUT] parameter_type, ... )] parameter_type se -o
[AUTHID {DEFINER|CURRENT_USER}] specifica (v
[PRAGMA AUTONOMOUS_TRANSACTION] declaration_section [PRAGMA AUTONOMOUS_TRANSACTION]
{IS|AS}
[declaration_section] executable_section -
BEGIN
exception_section
execution_section;
[EXCEPTION
exception_section;]
END [procedure_name];
10.10.2016 Laborator 6 13 10.10.2016 Laborator 6 14 10.10.2016 Laborator 6 15 10.10.2016 Laborator 6 16

Proceduri stocate Proceduri stocate Parametrii unei proceduri Parametrii unei proceduri

: : Parametrii sunt variabile disponibile att pentru programul principal

; parameter_name [IN|OUT [NOCOPY]|IN OUT [NOCOPY]]


Procedure created;
parameter_type [ {:= | DEFAULT } {expresion|value}]
Warning: Procedure created with
compilation errors; ; parameter_name numele parametrului
Pentru a vedea erorile de compilare se va folosi comanda show errors; parameter_name tipul parametrului
, atunci nu ;
NOCOPY
;
OUT IN
CREATE OR REPLACE, unor parametri OUT sau IN OUT), n timp ce parametrii formali sunt cei OUT care se transmit implicit prin valoare
, := |DEFAULT
alt dezvoltator, ; logicii procedurii.
expresion | value se pot atribui expresii sau valori
parametrilor
DROP PROCEDURE procedure_name.

10.10.2016 Laborator 6 17 10.10.2016 Laborator 6 18 10.10.2016 Laborator 6 19 10.10.2016 Laborator 6 20


Parametrii unei proceduri Parametrii unei proceduri Parametrii unei proceduri Cursoare n proceduri

sau prin valoare;


: Cursoarele declarate ntr-
IN parametrul poate fi referit n interiorul procedurii, dar nu poate fi
modificat; de ex. VARCHAR2(30) nu este permis); -un bloc
;
OUT parametrul nu poate fi referit n interiorul procedurii, dar poate fi
;
Parametrii pot avea o valoa
;
;
La transmiterea prin valoare are loc copierea valorii parametrului actual la IN OUT parameterul poate fi referit n interiorul procedurii, poate fi
cel formal; . apel;
Parametrul IN este tipul implicit; Se poate folosi operatorul de asociere (=>) pentru a trimite valori efective .
;
prin valoare;
; u
Folosindu-
intrare- ;
procedura.
.
e .

10.10.2016 Laborator 6 21 10.10.2016 Laborator 6 22 10.10.2016 Laborator 6 23 10.10.2016 Laborator 6 24

Cursoare n proceduri Cursoare n proceduri Cursoare n proceduri Cursoare n proceduri

Ex. 4. S , care
r,
,
algoritm:
a) manageri de departament
Vechimea < 32 de ani primesc 20 zile de concediu
Vechimea >= 32 de ani primesc 22 zile de concediu

b) angajatii care nu sunt sefi :


Vechimea < 32 de ani primesc 15 zile de concediu
Vechimea >= 32 de ani primesc 22 zile de concediu

10.10.2016 Laborator 6 25 10.10.2016 Laborator 6 26 10.10.2016 Laborator 6 27 10.10.2016 Laborator 6 28

Cursoare n proceduri Cursoare n proceduri Cursoare n proceduri Cursoare n proceduri

grupa 1 subalternii cu o vechime <= 31

grupa 2 subalternii cu o vechiime > 31

dintr- .

10.10.2016 Laborator 6 29 10.10.2016 Laborator 6 30 10.10.2016 Laborator 6 31 10.10.2016 Laborator 6 32

Tipul Colec ie ca parametr Tipul Colec ie ca parametr Tipul Colec ie ca parametr Tipul Colec ie ca parametr

etru pentru o Pasul II Pasul III - v_culori

de date. ntr-
nivelul bazei de date folosindu- a DDL
create;

de date sunt: Rezolvare:


Varray Pasul I
Nested table

10.10.2016 Laborator 6 33 10.10.2016 Laborator 6 34 10.10.2016 Laborator 6 35 10.10.2016 Laborator 6 36


Tipul Colec ie ca parametr Tipul Colec ie ca parametr Tipul Colec ie ca parametr

Pasul III -
table. date parametru un cursor;
Rezolvare: REF CURSOR
Pasul I crearea tipului nested table n

Pasul II crearea blocului

10.10.2016 Laborator 6 37 10.10.2016 Laborator 6 38 10.10.2016 Laborator 6 39 10.10.2016 Laborator 6 40

Ex. 8. Folosire cursor ca parametru IN: Ex. 9. Folosire cursor ca parametru OUT: Ex. 10. Folosire cursor ca parametru IN OUT:

10.10.2016 Laborator 6 41 10.10.2016 Laborator 6 42 10.10.2016 Laborator 6 43 10.10.2016 Laborator 6 44

Universitatea Facultatea de
Catedra de
Cuprins
Politehnica
Calculatoare
Calculatoare

-
valoare; procedurilor;
Laborator 7 n general,
;
PL/SQL au
;
; sunt declarate;

return din memorie;


Autori OUT)
Conf. Dr. Ing. Alexandru Boicea mai multe valori prin intermediul parametrilor de tip OUT ;
As. Drd. Ing. Ciprian-Octavian sau IN OUT.
;

10.10.2016 Laborator 7 2 10.10.2016 Laborator 7 3 10.10.2016 Laborator 7 4

function_name
Sintaxa : BEGIN block_variables
parameter_name numele unui parametru formal din lista de parametri
DECLARE DECLARE locale folosite n bloc
parameter_type se specifica
FUNCTION function_name [(parameter_name [IN|OUT|IN OUT] block_variables;
precizie block_executable_section
parameter_type,...)] var return_data_type; --
return_data_type se specifica blocului
RETURN return_data_type block_variables; precizie block_exception_section
{IS | AS} BEGIN function_declaration_section
[function_declaration_section] block_executable_section;
BEGIN -- var := function_name[(parametrii)]; function_executable_section IN|OUT|IN OUT
function_executable_section; block_executable_section; RETURN
[EXCEPTION [EXCEPTION date return_data_type var
function_exception_section] block_exception_section] function_exception_section valoare, are tipul return_data_type
END [function_name]; -- END;
cte un RETURN
... END;

10.10.2016 Laborator 7 5 10.10.2016 Laborator 7 6 10.10.2016 Laborator 7 7 10.10.2016 Laborator 7 8


function_name
.
parameter_name numele unui parametru formal din lista de
departamentrul respectiv. Sintaxa
parametri
CREATE [OR REPLACE] FUNCTION function_name [(parameter_name
[IN|OUT|IN OUT] parameter_type, ... )] parameter_type se specifica
RETURN return_data_type
[AUTHID {DEFINER|CURRENT_USER}] return_data_type se specifica
[PRAGMA AUTONOMOUS_TRANSACTION] precizie
{IS|AS} declaration_section
[declaration_section]
BEGIN executable_section
execution_section; RETURN
[EXCEPTION de date return_data_type
exception_section;] exception_section
END [function_name];

10.10.2016 Laborator 7 9 10.10.2016 Laborator 7 10 10.10.2016 Laborator 7 11 10.10.2016 Laborator 7 12

IN|OUT|IN OUT f_puncte Pasul I crearea tabelei Pasul II


sau modificat n interiorul sau exteriorul procedurii
[AUTHID {DEFINER|CURRENT_USER}]
-o Ani vechime > 32 => 30 puncte
(v Ani vechime <= 32 => 15 puncte
B) salariul maxim pe departament
[PRAGMA AUTONOMOUS_TRANSACTION]
Salariu angajat = salariu maxim din departament => 20 puncte
Salariu angajat < salariu maxim din departament => 10 puncte
- C) comision
Comision angajat > 0 => 10 puncte
Comision angajat = 0 => 5 puncte

temp_puncte .

10.10.2016 Laborator 7 13 10.10.2016 Laborator 7 14 10.10.2016 Laborator 7 15 10.10.2016 Laborator 7 16

Pasul III crearea blocului apelant

10.10.2016 Laborator 7 17 10.10.2016 Laborator 7 18 10.10.2016 Laborator 7 19 10.10.2016 Laborator 7 20

mesajul: Function created; f_puncte


Warning: Function created with
compilation errors;
Pentru a vedea erorile de compilare se va folosi comanda show errors;
, atunci nu se
;
CREATE
OR REPLACE,
,
dezvoltator, ;

DROP FUNCTION function_name

10.10.2016 Laborator 7 21 10.10.2016 Laborator 7 22 10.10.2016 Laborator 7 23 10.10.2016 Laborator 7 24


; :
poate ntoarce mai multe valori prin parametrii de tip OUT sau IN OUT;
; , dar poate ntoarce mai multe valori -o cerere SELECT, functia NU
; De exemplu, ntr- n programul apelant prin parametrii de tip OUT sau IN OUT;
;
DELETE;
Procedurile stocare NU pot fi apelate direct din comenzi SQL;
algoritmului de calcul al salariului net, considernd
blocuri PL/SQL; ; sau DELETE, NU
Procedurile NU
salariale, etc.; ; ;
obtin toate
Oracle Forms Builder sau Oracle Reports
. impozitelor aferente; Builder
UPDATE sau DELETE , NU
comenzi TCL (COMMIT sau ROLLBACK).
nalt (Java, C++, C#, Python, etc) folosindu-se API-uri dedicate.

10.10.2016 Laborator 7 25 10.10.2016 Laborator 7 26 10.10.2016 Laborator 7 27 10.10.2016 Laborator 7 28

- Sistemul de gestionare ORACLE permite acordarea te n


-ul USER_SOURCE, care are
EXCEPTION sau de blocul superior, iar parametrilor de tip OUT sau
IN OUT nu li se transmite nicio valoare;
; (utilizatorul care le-a creat) sau administratorului care
-au avut nainte are privilegii de DBA;
de a se face apelul; Sintaxa comenzii este: Unde:
GRANT EXECUTE ON {procedure_name | function_name} TO name
, reveni n starea ENABLE. user_name;
-uri, pot modifica starea altor type
line
ntr- REVOKE, sintaxa este: text
REVOKE EXECUTE ON {procedure_name | function_name}
. FROM user_name;

10.10.2016 Laborator 7 29 10.10.2016 Laborator 7 30 10.10.2016 Laborator 7 31 10.10.2016 Laborator 7 32

n SQL*Plus
f_puncte, cerere SQL: cerere SQL:

10.10.2016 Laborator 7 33 10.10.2016 Laborator 7 34 10.10.2016 Laborator 7 35 10.10.2016 Laborator 7 36

Pasul II crearea blocului apelant


re (gradul se
Pasul I
SALGRADE), folosindu-
algoritm:

departament sau nu, gradul de salarizare, procentul,


.

10.10.2016 Laborator 7 37 10.10.2016 Laborator 7 38 10.10.2016 Laborator 7 39 10.10.2016 Laborator 7 40


Universitatea Facultatea de Catedra de
Politehnica
Calculatoare
Calculatoare

Laborator 8
Pachete PL/SQL

Autori
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian

10.10.2016 Laborator 7 41 10.10.2016 Laborator 7 42 10.10.2016 Laborator 7 43

Cuprins Pachete PL/SQL Pachete PL/SQL

Pachete PL/SQL Principalele avantaje oferite de un pachet sunt:


; ; CREATE [OR REPLACE] PACKAGE package_name {IS|AS}
Corpul unui pachet ; global (public) types and variable declarations
; ; global (public) subprogram specifications
; END [package_name]
create package Unde :
; .
package_name numele pachetului
Pachete standard package body) n care sunt global (public) types and variable declarations

(private).
global (public) subprogram specifications
.

10.10.2016 Laborator 8 2 10.10.2016 Laborator 8 3 10.10.2016 Laborator 8 4 10.10.2016 Laborator 8 5

Corpul unui pachet Corpul unui pachet

mesajul: package_name numele pachetului


Package created; local type and variable declarations
locale ale cursoarelor, exc
acestuia. avertizare: Warning: Package created with compilation errors; sunt folosite doar n interiorul pachetului. tipurilor de date
Referirea ntr-un program PL/SQL a unei componente globale (publice) a Pentru a vedea erorile de compilare se va folosi comanda: show Sintaxa este: subprogram bodies cod
unui pachet se face folosind numele componentei, avnd ca prefix numele
errors. CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
pachetului:
package_name.type_name local type and variable declarations initialization statements
package_name.item_name subprogram bodies
package_name.subprogram_name [BEGIN
Unde: initialization statements
package_name numele pachetului
type_name numele unui tip de date
end;]
item_name END [package_name]
subprogram_name

10.10.2016 Laborator 8 6 10.10.2016 Laborator 8 7 10.10.2016 Laborator 8 8 10.10.2016 Laborator 8 9

Corpul unui pachet Corpul unui pachet Corpul unui pachet Corpul unui pachet

, Pasul II
declarate n corpul pachetului vor avea caracter local (privat), deci ,
vor fi accesibile numai n blocurile n care au fost definite;
La primul apel al unui obiect dintr-un pachet, ntregul pachet este pachetului;
coloana mgr. Procedura va insera rezultatele n tabela lista.
Pasul I crearea tabelei lista

.
Fiecare sesiune de lucru are o copie proprie a variabilelor din
pachet;

10.10.2016 Laborator 8 10 10.10.2016 Laborator 8 11 10.10.2016 Laborator 8 12 10.10.2016 Laborator 8 13


Corpul unui pachet Corpul unui pachet Corpul unui pachet Corpul unui pachet

Pasul III crearea corpului pachetului Pasul IV

Pasul V

10.10.2016 Laborator 8 14 10.10.2016 Laborator 8 15 10.10.2016 Laborator 8 16 10.10.2016 Laborator 8 17

Exemplu de ambiguitate: , cu
: tipul number, atunci nu mai apare eroarea:

10.10.2016 Laborator 8 18 10.10.2016 Laborator 8 19 10.10.2016 Laborator 8 20 10.10.2016 Laborator 8 21

10.10.2016 Laborator 8 22 10.10.2016 Laborator 8 23 10.10.2016 Laborator 8 24 10.10.2016 Laborator 8 25

Deoarece pachetele sunt create ca oricare

pe view-urile sistemului de gestiune ORACLE.

10.10.2016 Laborator 8 26 10.10.2016 Laborator 8 27 10.10.2016 Laborator 8 28 10.10.2016 Laborator 8 29


body
SQL: SQL: folosind comanda DDL, DROP:
DROP PACKAGE pakage_name;

SQL:
DROP PACKAGE BODY package_name;

utilizatorul care a creat pachetul (sau administratorul) poate folosi


comanda DCL, GRANT:
GRANT EXECUTE ON package_name TO user_name;
Utilizatorul grantificat poate apela un obiect din pachetul respectiv,

EXECUTE user_name.package_nane.procedure_name;

10.10.2016 Laborator 8 30 10.10.2016 Laborator 8 31 10.10.2016 Laborator 8 32 10.10.2016 Laborator 8 33

Pachete standard Pachete standard Pachete standard

-un bloc SQL: UTL_FILE


DECLARE folosind view-urile de sistem DBA_OBJECTS DBA_SOURCE,
BEGIN Cteva din cele mai uzuale pachete standard sunt: fopen acesibile userului system sau celor care au privilegiul DBA;
DBMS_STANDARD get_line pentru citirea linie cu linie;
... cu Oracle. De exemplu, procedura raise_application_error UTL_HTML pachetele standard, se poate folosi cererea SQL:
user_name.package_name.procedure_name; definirea propriilor mesaje;
Internetul sau Oracle Web Server, folosind protocolul HTTP;
DBMS_OUTPUT
SELECT text FROM dba_source WHERE lower(name) =
... - 'package_name' AND lower(type)='package' ORDER BY line;
put_line
END; ; ;
DBMS_PIPE DBMS_SQL Pachetele standard pot fi activate sau dezactivate
pipe comenzi DDL sau comenzi SQL standard, n mod dinamic;
pack_message send_message (ENABLE/DISABLE) cu comanda SET:
REVOKE: - DBMS_ALERT permite utilizarea triggerelor pentru alertare, n SET standard_package {ON|OFF}
REVOKE EXECUTE ON package_name FROM user_name; receive_message unpack_message,

baza de date Oracle.

10.10.2016 Laborator 8 34 10.10.2016 Laborator 8 35 10.10.2016 Laborator 8 36 10.10.2016 Laborator 8 37

Exer Exer Exer Exer

a unui angajat din deprtamentul din care face parte;

n
propriul ;

DEPARTAMENT NUME VENIT VECHIME

10.10.2016 Laborator 8 38 10.10.2016 Laborator 8 39 10.10.2016 Laborator 8 40 10.10.2016 Laborator 8 41

Exer Exer Universitatea Facultatea de Catedra de


Cuprins
Politehnica
Calculatoare
Calculatoare

Triggeri PL/SQL
Crearea unui trigger
Triggeri de tip BEFORE
Laborator 9 Triggeri de tip AFTER
HEN
Triggeri PL/SQL

Autori
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian

10.10.2016 Laborator 8 42 10.10.2016 Laborator 8 43 19.12.2016 Laborator 9 2


Triggeri PL/SQL Triggeri PL/SQL Triggeri PL/SQL Crearea unui trigger

n general, triggerii se folosesc pentru: Sintaxa unui trigger este:


; ;
bazei de date; CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
; Lan ;
{BEFORE | AFTER | INSTEAD OF}
{DELETE | INSERT | UPDATE [OR {DELETE | INSERT | UPDATE
; unei baze de date distribuite; n baza de date; ]}
. ON [schema.]tabel _name
de date; [referencing_clauses]
; [FOR EACH ROW]
tabelelor; [WHEN (condition) ]
INSTEAD OF; DECLARE
.
Comenzi CREATE, ALTER, DROP trigger_variables
de date; BEGIN
trigger_body
END
.

19.12.2016 Laborator 9 3 19.12.2016 Laborator 9 4 19.12.2016 Laborator 9 5 19.12.2016 Laborator 9 6

Crearea unui trigger Crearea unui trigger Crearea unui trigger Crearea unui trigger

Unde: BEFORE | AFTER Sintaxa referencing_clauses: Sintaxa pentru crearea unui trigger de sistem este
trigger_name numele triggerului PL/SQL
schema INSTEAD OF REFERENCING {OLD [AS] old_variable NEW [AS] new_variable | CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
- NEW [AS] new_variable OLD [AS] old_variable} {BEFORE | AFTER}
utilizatorului curent
tabel _name numele tabelul/view- INSERT | UPDATE | DELETE {DDL_event_list | DB_event_list}
evenimentul ; ON {DATABASE | SCHEMA}
column numele coloanei (coloanelor) din tabelul/view-ul pe care FOR EACH ROW
Aceste valori se pot folosi att n clauza WHEN [WHEN (condition) ]
WHEN
(old_variable.row_field, new_variable.row_field DECLARE
condition PL/SQL folosindu- e : (de exemplu
:old_variable.row_field, :new_variable.row_field); trigger_variables
trigger_variables . BEGIN
triggerului
trigger_body
trigger_body
END
19.12.2016 Laborator 9 7 19.12.2016 Laborator 9 8 19.12.2016 Laborator 9 9 19.12.2016 Laborator 9 10

Crearea unui trigger Crearea unui trigger Crearea unui trigger Triggeri de tip BEFORE

Unde: Triggerii de tip BEFORE


-a consumat ;
DDL_event_list - CREATE, DROP, ALTER ;
n general, triggerii
DB_event_list - STARTUP, SHUTDOWN, LOGON, i, triggerul este executat o
i ; ori de cte ori se face un insert n tabela emp.
LOGOFF, SERVERERROR, SUSPEND afectate de eveniment;
Triggeri pe o linie este executat ori de cte ori o linie a unei inutile).

i,
atunci triggerul este executat de k ori. -a
efectuat cu succes;

;
.

19.12.2016 Laborator 9 11 19.12.2016 Laborator 9 12 19.12.2016 Laborator 9 13 19.12.2016 Laborator 9 14

Triggeri de tip BEFORE Triggeri de tip BEFORE Trigger de tip AFTER Trigger de tip AFTER

EMP: - Triggerii de tip AFTER


. comision n tabela EMP:

Trigger created;
- - ori de cte ori se face o modificare n tabela EMP.
succes; avertizare:
Warning: Trigger created with compilation errors.
ca Pentru a vedea erorile de compilare se va folosi comanda - .
show errors.
.

19.12.2016 Laborator 9 15 19.12.2016 Laborator 9 16 19.12.2016 Laborator 9 17 19.12.2016 Laborator 9 18


Trigger de tip AFTER Trigger de tip AFTER clauza WHEN clauza WHEN

- ceea ce este interzis prin definirea tabelei, ca urmare s-a ; ori de cte ori se face o modificare n tabela emp, dar doar pentru
.
i de
.
gerul nu s- ;
EACH ROW;
n clauza WHEN
.

;
S-
.

19.12.2016 Laborator 9 19 19.12.2016 Laborator 9 20 19.12.2016 Laborator 9 21 19.12.2016 Laborator 9 22

clauza WHEN clauza WHEN clauza WHEN clauza WHEN

noului angajat este strict mai mare

- -a
.
UPDATE s-
.

19.12.2016 Laborator 9 23 19.12.2016 Laborator 9 24 19.12.2016 Laborator 9 25 19.12.2016 Laborator 9 26

auza WHEN

old new Pasul II creare trigger


: momentul n care se face un insert, delete sau update pe coloanele
din tabela EMP
7566, rezultatul este: INSERTING TRUE triggerului n tabela MESAJE.
INSERT; Pasul I tabela mesaje
UPDATING TRUE
UPDATE;
UPDATING TRUE
UPDATE
column_name;
DELETING TRUE
DELETE.

19.12.2016 Laborator 9 27 19.12.2016 Laborator 9 28 19.12.2016 Laborator 9 29 19.12.2016 Laborator 9 30

Pasul III testare trigger -uri, ; Orice view, aflat ntr-un astfel de caz, se poate face sefi
Unele view-uri nu pot fi modificate prin comenzi DML, dar folosind
;
View-urile care nu pot fi modificate prin comenzile UPDATE,
INSERT sau DELETE sunt cele create printr-o interogare care
view-ul respectiv;
-ul creat
Un operator SET sau DISTINCT; -
; acestea nu pot fi modificate direct printr-
Clauzele GROUP BY, ORDER BY, CONNECT BY sau START WITH;
UPDATE, dar pot fi modificate prin trigger.
- ;
O subcerere ntr- ;
Unele metode de JOIN. inserarea ntr-un astfel de view.

19.12.2016 Laborator 9 31 19.12.2016 Laborator 9 32 19.12.2016 Laborator 9 33 19.12.2016 Laborator 9 34


EMP inserare n tabela DEPT. afecteze starea tabelei sau view-
evenimentul;
comision
:

-a generat o eroare.

inserarea s-
deoarece s-
echivalente comenzii INSERT, prin inserarea n tabelele DEPT
EMP.

19.12.2016 Laborator 9 35 19.12.2016 Laborator 9 36 19.12.2016 Laborator 9 37 19.12.2016 Laborator 9 38

LOG ori
Pentru a vedea structura unui trigger se va interoga view-ul sal din tabela EMP.
; user_source: DROP TRIGGER trigger_name; Tabela LOG
i

:
ALTER TRIGGER trigger_name {ENABLE | DISABLE}

-o, pentru ce
-mm-dd hh-
mi-ss).
19.12.2016 Laborator 9 39 19.12.2016 Laborator 9 40 19.12.2016 Laborator 9 41 19.12.2016 Laborator 9 42

Crearea triggerului: Testarea triggerului:

19.12.2016 Laborator 9 43 19.12.2016 Laborator 9 44 19.12.2016 Laborator 9 45

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