You are on page 1of 50

CURS 8

PL/SQL

M. Danubianu - Teoria si implementarea bazelor de date

Introducere
PL/SQL reprezint extensia procedural pentru SQL n Oracle Utilizarea PL/SQL permite:
Folosirea SQL pentru a manipula date Oracle Declararea de constante i variabile Definirea de proceduri i funcii Manipularea erorilor

Combin puterea de manipulare a datelor din SQL cu puterea de prelucrare a limbajelor procedurale
M. Danubianu - Teoria si implementarea bazelor de date 2

Arhitectura PL/SQL
PL/SQL este o tehnologie si nu un produs independent
Poate fi gndit ca un motor care compileaz i execut blocuri i subprograme PL/SQL

Poate fi instalat:
ntr-un server Oracle sau ntr-un instrument de dezvoltare a aplicaiilor (Oracle Forms sau Oracle Reports).

Cele doua medii n care poarte exista PL/SQL sunt indepenente

M. Danubianu - Teoria si implementarea bazelor de date

In orice situaie motorul PL/SQL accept ca intrri orice bloc sau subprogram valid Motorul PL/SQL execut instruciunile procedurale dar trimite ctre serverul Oracle instruciunile SQL

M. Danubianu - Teoria si implementarea bazelor de date

Avantaje
PL/SQL este un limbaj de procesare a tranzaciilor de nalt performan, complet portabil Avantaje:
Suport pentru SQL Suport pentru programarea orientat obiect Performane mbuntite Productivitate crescut Portabilitate complet Integrare complet cu Oracle Securitate sporit

M. Danubianu - Teoria si implementarea bazelor de date

Suport pentru SQL


PL/SQL permite utilizarea tuturor instruciunilor SQL de manipulare a datelor, comenzi de control al cursoarelor i control al tranzaciilor, funcii SQL operatori i pseudocoloane
pot fi manipulate flexibil i sigur date Oracle PL/SQL suporta setul complet de tipuri de date SQL
Se elimin necesitatea de a converti datele transmise ntre aplicaie i baza de date

PL/SQL suport SQL dinamic programele pot construi i prelucra instruciuni de definire a datelor, de control al datelor si de control al sesiunilor n timpul execuiei ("on the fly" )

M. Danubianu - Teoria si implementarea bazelor de date

Suport pentru programarea orientat pe obiecte


Tipurile obiect sunt un instrument ideal de modelare orientat-obiect utile pentru a reduce costul i timpul necesar pentru a construi aplicaii complexe
Permit crearea componentelor software modulare, care pot fi ntreinute i reutilizabile Permit echipelor de programatori s dezvolte concurent componente software

Prin ncapsularea operaiilor cu datele, tipurile obiect permit transferarea codului de ntreinere a datelor n afara scripturilor SQL sau a blocurilor PL/SQL ctre metode. Tipurile obiect ascund detaliile de implementare se pot schimba aceste detalii fr a afecta programele client. Tipurile obiect permit o abstractizare mai apropiata de realitate i programele reflect mai corect lumea ce se dorete simulat

M. Danubianu - Teoria si implementarea bazelor de date

Performane crescute 1
fr PL/SQL, Oracle trebuie sa prelucreze instruciunile SQL pe rnd.
Fiecare instruciune SQL apeleaz Oracle ceea ce conduce la performane reduse
mai ales n condiiile n care se lucreaz n reea traficul este foarte ridicat

cu PL/SQL, la un moment dat va fi trimis ctre Oracle un bloc ntreg ceea ce poate reduce drastic comunicaia dintre aplicaie i Oracle pentru aplicaiile care acceseaz intens baza de date se pot utiliza blocuri SQL i subprograme pentru a grupa instruciunile SQL nainte de a le trimite ctre Oracle pentru a fi executate.
M. Danubianu - Teoria si implementarea bazelor de date 8

Performane crescute 2
Procedurile stocate PL/SQL sunt compilate o singur dat i sunt memorate n format executabil apelurile sunt rapide i eficiente. PL/SQL mbunteste performanele prin adugarea posibilitilor de prelucrare procedural instrumentelor Oracle

M. Danubianu - Teoria si implementarea bazelor de date

Productivitate ridicat
PL/SQL adaug funcionalitate instrumentelor non-procedurale precum Oracle Forms si Oracle Reports.
Inn aceste instrumente pot fi folosite construciile procedu rale din PL/SQL pentru a construi aplicaii. Ex. se poate utiliza un bloc PL/SQL complet ntr+un trigger in Oracle Forms
PL/SQL crete productivitatea prin furnizarea unor instrumente mai eficiente

PL/SQL este acelai n toate mediile


Scripturile scrise cu un instrument pot fi utilizate si de altele

M. Danubianu - Teoria si implementarea bazelor de date

10

Portabilitate complet
Aplicaiile scrise in PL/SQL sunt portabile pe orice sistem de operare i platform pe care ruleaz Oracle.
Se pot scrie biblioteci de programe portabile care pot fi reutilizate n diverse medii.

M. Danubianu - Teoria si implementarea bazelor de date

11

Integrare strns cu Oracle


PL/SQL si SQL sunt strns integrate PL/SQL suporta toate tipurile de date SQL plus NULL.
permite manipularea datelor Oracle simplu i eficient si ajut la scrierea de cod de mare performan

atributele %TYPE i %ROWTYPE integreaz PL/SQL cu SQL Exemplu: Se poate utiliza atributul %TYPE pentru a declara variabile pe baza definiia coloanei din baza de date.
dac aceasta definiie se schimb declararea variabilei se schimb corespunztor la urmtoarea rulare a programului. aceasta este o form de manifestare a independenei datelor se reduc costurile de ntreinere permit programelor adaptarea la schimbrile din baza de date

M. Danubianu - Teoria si implementarea bazelor de date

12

Securitate sporit
Procedurile stocare PL/SQL permit partiionarea logicii aplicaiei ntre client si server
Se poate evita ca aplicaiile client s manipuleze datele Oracle sensibile Trigger-ele scrise in PL/SQL pot restriciona, selectiv, posibilitile de actualizare ale aplicaiilor i pot face un audit bazat pe coninut pentru inserrile de date.

Se poate restriciona accesul la date dac se permite ca utilizatorii s aib le manipuleze numai prin intermediul procedurilor stocate pe care le pot executa doar conform privilegiilor pe care le dein.
Se poate permite utilizatorilor accesul la o procedur care actualizeaz un tabel, dar nu i accesul la tabelul nsui

M. Danubianu - Teoria si implementarea bazelor de date

13

Structura programelor PL/SQL


Limbaj structurat pe blocuri Unitatea de baz blocul logic, care poate conine orice numr de blocuri nglobate
n mod normal fiecare bloc corespunde unei probleme de rezolvat PL/SQL folosete pentru o problem abordare de tip divide i-cucerete -> rafinare pas cu pas

Blocul (sub blocul) permite gruparia logic a declaraiilor i instruciunilor nrudite


se pot plasa declaraiile ct mai aproape de locul n care sunt folosite declaraiile sunt locale

Un bloc are trei pri componente:


O seciune declarativ O seciune executabil O seciune de manipulare a excepiilor

Un bloc poate ngloba alte sub blocuri n seciunea executabil sau de manipulare a excepiilor Nu poate ngloba sub-blocuri n seciunea declarativa In seciunea declarativ se pot defini subprograme locale, ns acestea se pot apela numai n blocul n care au fost definite
M. Danubianu - Teoria si implementarea bazelor de date 14

Structura programelor PL/SQL


DECLARE (opional)
Variabile, cursoare, excepii definite de utilizator

BEGIN (obligatoriu)
Instruciuni SQL Instruciuni PL/SQL

EXCEPTION (opional)
Aciuni ce trebuie efectuate cnd apar erori

END; (obligatoriu)
M. Danubianu - Teoria si implementarea bazelor de date 15

Tipuri de blocuri
Anonim
[DECLARE]

Procedur
PROCEDURE nume_proc IS

Funcie
FUNCTION nume_func RETURN tip_data BEGIN instruciuni [EXCEPTION]

BEGIN instruciuni [EXCEPTION] BEGIN instruciuni [EXCEPTION] END; END;

END;

M. Danubianu - Teoria si implementarea bazelor de date

16

Medii de programare PL/SQL


iSQL*Plus jDeveloper

M. Danubianu - Teoria si implementarea bazelor de date

17

Uniti lexicale n blocul PL/SQL


Identificatori nume atribuite obiectelor PL/SQL Delimitatori simboluri cu o semnificaie aparte
Ex. simbolul ;

Literali orice valoare care este asignat unei variabile


Pot fi:
caractere date numerice date de tip boolean

Comentarii
pe o singura linie, comentariul este precedat de simbolul - - pe mai multe linii comentariul este lsat ntre perechile de simboluri /* i */.

M. Danubianu - Teoria si implementarea bazelor de date

18

Declararea i iniializarea variabilelor n PL/SQL


Trebuie declarate dup care pot fi utilizate n SQL sau n secvenele procedurale Este necesar ca declaraia s fie fcut naintea folosirii lor in alte instruciuni (inclusiv n alte declaraii)
Pot avea orice tip de dat SQL (CHAR, DATE, NUMBER ) sau PL/SQL (BOOLEAN sau BINARY-INTEGER) Se pot declara i ca tipuri de date compozite - nested tables, varray sau records prin utilizarea cuvintelor cheie TABLE, VARRAY i RECORD

Sintaxa:
identificator [CONSTANT] tip_data [NOT NULL] [:= | DEFAULT expresie];
M. Danubianu - Teoria si implementarea bazelor de date 19

Variabile - Exemple
DECLARE v_data_ang v_dep_id
v_sal V_loc

DATE; NUMBER (2) NOT NULL :=10;


REAL(7,2); CONSTANT VARCHAR2(20) :=Suceava;

SET SERVEROUTPUT ON DECLARE v_nume VARCHAR2 (20); BEGIN


DBMS_OUTPUT.PUT_LINE (Numele meu este: || v_nume); v_nume := Adriana; DBMS_OUTPUT.PUT_LINE (Numele meu este: || v_nume);

END; /

M. Danubianu - Teoria si implementarea bazelor de date

20

Atribuirea de valori variabilelor


Atribuirea valorilor se poate face n trei moduri:
Utilizarea operatorului :=
val:= cant * pret_unit

Extragerea valorilor din baza de date n variabil


SELECT salary*0.1 INTO bonus
FROM employees WHERE employee_id=100

Considerarea variabilei ca un parametru OUT sau IN OUT ntr-un subprogram

DECLARE
v_sal REAL(7,2); PROCEDURE modif_salary (emp_id INT, salary IN OUT REAL) IS ...

BEGIN
SELECT AVG(salARY) INTO v_sal FROM employees; modif_salary(100, v_sal); -- atribuie o valoare nou variabilei v_sal

M. Danubianu - Teoria si implementarea bazelor de date

21

Variabile legate (bind)


Sunt create ntr-un mediu gazd, motiv pentru care mai sunt denumite variabile host Sunt utilizate n instruciuni SQL i n blocuri PL/SQL Sunt accesate i dup ce blocul PL/SQL a fost executat La creare se utilizeaz cuvntul cheie VARIABLE
pot fi create n SQL*Plus sau iSQL*Plus

Sunt referite prin precedarea numelui cu simbolul (:) iSQL*Plus poate afia valoarea unei variabile legate prin comanda PRINT

M. Danubianu - Teoria si implementarea bazelor de date

22

Exemplu 1

M. Danubianu - Teoria si implementarea bazelor de date

23

Exemplu 2

M. Danubianu - Teoria si implementarea bazelor de date

24

Exemplul 3

M. Danubianu - Teoria si implementarea bazelor de date

25

Substituire variabilelor 1
Presupune introducerea valorilor de ctre utilizator in timpul execuiei In blocurile PL/SQL se folosete semnul (&)

M. Danubianu - Teoria si implementarea bazelor de date

26

Blocuri imbricate n PL/SQL


Blocurile PL/SQL pot fi imbricate n
Seciunea executabil (BEGINEND) a unui bloc Seciunea de manipulare a excepiilor

M. Danubianu - Teoria si implementarea bazelor de date

27

Exemplu
SET SERVEROUTPUT ON DECLARE var_ext VARCHAR2(20) :=variabila globala; BEGIN DECLARE var_int VARCHAR2(20) := variabil locala; BEGIN DBMS_OUTPUT.PUT_LINE(var_int); DBMS_OUTPUT.PUT_LINE(var_ext); END; DBMS_OUTPUT.PUT_LINE(var_ext); END; /
M. Danubianu - Teoria si implementarea bazelor de date 28

Domeniul si vizibilitatea variabilelor


set serveroutput on DECLARE nume_p VARCHAR2(15):='Mihai'; ddn date := '20-mar-1970'; BEGIN DECLARE nume_c VARCHAR2(15):='Irina'; ddn date :='01-mai-1994'; BEGIN DBMS_output.put_line('numele tatalui este: '|| nume_p); DBMS_output.put_line('data nasterii: '|| ddn); DBMS_output.put_line('numele copilului este: '|| nume_c); END; DBMS_output.put_line('data nasterii:'|| ddn); END;

M. Danubianu - Teoria si implementarea bazelor de date

29

Calificarea unui identificator care apare n mai multe blocuri imbricate


Calificarea presupune utilizarea unei etichete asociate unui bloc
Etichetarea nu este limitat orice bloc poate fi etichetat

calificatorii se pot folosi pentru a accesa variabile care dei sunt in domeniu nu sunt vizibile

M. Danubianu - Teoria si implementarea bazelor de date

30

Calificarea unui identificator care apare n mai multe blocuri imbricate


set serveroutput on <<outer>> DECLARE nume_p VARCHAR2(15):='Mihai'; ddn date := '20-mar-1970'; BEGIN DECLARE nume_c VARCHAR2(15):='Irina'; ddn date :='01-mai-1994'; BEGIN DBMS_output.put_line('numele tatalui este: '|| nume_p); DBMS_output.put_line('data nasterii: '|| outer.ddn); DBMS_output.put_line('numele copilului este: '|| nume_c); DBMS_output.put_line('data nasterii:'|| ddn); END; END;

M. Danubianu - Teoria si implementarea bazelor de date

31

Tipuri de date predefinite in PL/SQL

M. Danubianu - Teoria si implementarea bazelor de date

32

Tipuri de date compozite


TABLE ARRAY RECORD

M. Danubianu - Teoria si implementarea bazelor de date

33

Abstractizarea datelor tipul RECORD definire i declarare


Pentru a crea nregistrri (records)
1. 2.

se definete un tip de data RECORD se declar nregistrri cu tipul respectiv


se pot defini tipuri RECORD n seciunea declarativ a oricrui bloc PL/SQL, subprogram sau pachet

TYPE type_name IS RECORD (field_declaration[,field_declaration]...);

unde field_declaration conine field_name field_type [[NOT NULL] {:= | DEFAULT} expr]
type_name specific tipul ce va fi folosit ulterior pt a declara nregistrrile field_type este orice tip e data PL/SQL cu excepia tipului REF CURSOR, expr furnizeaz o valoare de acelai tip ca field_type.

Not: spre deosebire de tipurile VARRAY si (nested) TABLE tipurile RECORD nu pot fi create si stocate n baza de date.

M. Danubianu - Teoria si implementarea bazelor de date

34

Abstractizarea datelor tipul RECORD definire i declarare


Se poate utiliza unul din atributele %TYPE sau %ROWTYPE pentru a specifica tipul unui cmp. EXEMPLU: DECLARE TYPE DeptRec IS RECORD ( dept_id dept.deptno%TYPE, dept_name VARCHAR2(14), dept_loc VARCHAR2(13)); BEGIN ... END;
M. Danubianu - Teoria si implementarea bazelor de date 35

PL/SQL permite definirea de nregistrri care conin obiecte, colecii, i alte nregistrri ( nested records).
In acest caz obiectele nu pot avea atribute de tip RECORD.

DECLARE TYPE TimeRec IS RECORD ( seconds SMALLINT, minutes SMALLINT, hours SMALLINT); TYPE FlightRec IS RECORD ( flight_no INTEGER, plane_id VARCHAR2(10), captain Employee, -- poate fi declarat anterior ca obiect passengers PassengerList, -- varray depart_time TimeRec, -- nested record airport_code VARCHAR2(10)); BEGIN ... END;
M. Danubianu - Teoria si implementarea bazelor de date 36

Se poate specifica un tip RECORD in clauza RETURN din specificarea unei funcii.
Permite funciei s ntoarc o nregistrare de acelai tip cu o nregistrare definit de utilizator

DECLARE TYPE EmpRec IS RECORD ( emp_id NUMBER(4) l ast_name VARCHAR2(10), dept_num NUMBER(2), job_title VARCHAR2(9), salary NUMBER(7,2)); ... FUNCTION nth_highest_salary (n INTEGER) RETURN EmpRec IS ... BEGIN ... END;

M. Danubianu - Teoria si implementarea bazelor de date

37

Declararea datelor de tip RECORD


Odata ce un tip RECORD a fost definit, se pot declara nregistrri de acest tip DECLARE TYPE StockItem IS RECORD ( item_no INTEGER(3), description VARCHAR2(50), quantity INTEGER, price REAL(7,2)); item_info StockItem; -- declar o nregistrare BEGIN ... END; Identificatorul item_info reprezint o ntreag nregistrare

M. Danubianu - Teoria si implementarea bazelor de date

38

Declararea datelor de tip RECORD


Inregistrrile definite de utilizator pot fi declarate ca parametri formali pentru proceduri si funcii: DECLARE TYPE EmpRec IS RECORD ( emp_id emp.empno%TYPE, last_name VARCHAR2(10), job_title VARCHAR2(9), salary NUMBER(7,2)); ... PROCEDURE raise_salary (emp_info EmpRec); BEGIN ... END;

M. Danubianu - Teoria si implementarea bazelor de date

39

Iniializarea datelor RECORD


poate fi fcut n definiia tipului Exemplu: DECLARE TYPE TimeRec IS RECORD ( secs SMALLINT := 0, mins SMALLINT := 0, hrs SMALLINT := 0); BEGIN ... END;

M. Danubianu - Teoria si implementarea bazelor de date

40

Iniializarea datelor RECORD


Se pot impune constrngeri not null asupra oricror cmpuri.
In acest caz, cmpurile trebuie iniializate

DECLARE TYPE StockItem IS RECORD ( item_no INTEGER(3) NOT NULL := 999, description VARCHAR2(50), quantity INTEGER, price REAL(7,2)); BEGIN ... END;
M. Danubianu - Teoria si implementarea bazelor de date 41

Referirea nregistrrilor
Cmpurile unei nregistrri sunt accesate prin nume.
Se folosete notaia dot:

record_name.field_name Exemplu: emp_info.hire_date ... Cand se apeleaz o funcie care ntoarce o nregistrare definit de utilizator, se folosete urmtoarea sintax pentru a referi cmpurile din nregistrare: function_name(parameter_list).field_name
M. Danubianu - Teoria si implementarea bazelor de date 42

DECLARE TYPE EmpRec IS RECORD ( emp_id NUMBER(4), job_title VARCHAR2(9), salary NUMBER(7,2)); middle_sal NUMBER(7,2); FUNCTION nth_highest_sal (n INTEGER) RETURN EmpRec IS emp_info EmpRec; BEGIN ... RETURN emp_info; -- return record END; BEGIN middle_sal := nth_highest_sal(10).salary; -- call function ... END; Dac funcia nu are parametri se folosete: function_name().field_name -- note empty parameter list
M. Danubianu - Teoria si implementarea bazelor de date 43

Pentru a referi cmpuri nested ntr-o nregistrare ntoars de o funcie se folosete notaia dot extins: function_name(parameter_list).field_name.nested_field_name Exemplu: DECLARE TYPE TimeRec IS RECORD ( minutes SMALLINT, hours SMALLINT); TYPE AgendaItem IS RECORD ( priority INTEGER, subject VARCHAR2(100), duration TimeRec); FUNCTION item (n INTEGER) RETURN AgendaItem IS item_info AgendaItem; BEGIN .. . RETURN item_info; -- return record END; BEGIN ... IF item(3).duration.minutes > 30 THEN ... -- call function END;

M. Danubianu - Teoria si implementarea bazelor de date

44

Aceeai notaie este folosit pentru a referi atributele unui obiect stocat ntr-un cmp: DECLARE TYPE FlightRec IS RECORD ( flight_no INTEGER, plane_id VARCHAR2(10), captain Employee, -- declare object passengers PassengerList, -- declare varray depart_time TimeRec, -- declare nested record airport_code VARCHAR2(10)); flight FlightRec; BEGIN ... IF flight.captain.name = 'H Rawlins' THEN ... END;
M. Danubianu - Teoria si implementarea bazelor de date 45

Asignarea de valori null unei nregistrri


Pentru a seta toate cmpurile unei nregistrri ca null, i se asigneaz acestuia o nregistrare neiniializat, de acelai tip: DECLARE TYPE EmpRec IS RECORD ( emp_id emp.empno%TYPE, job_title VARCHAR2(9), salary NUMBER(7,2)); emp_info EmpRec; emp_null EmpRec; BEGIN emp_info.emp_id := 7788; emp_info.job_title := 'ANALYST'; emp_info.salary := 3500; emp_info := emp_null; -- nulls all fields in emp_info ... END;
M. Danubianu - Teoria si implementarea bazelor de date 46

Atribuirea de valori nregistrrilor


Unui anumit cmp dintr-o nregistrare i se poate asocia valoarea unei expresii: record_name.field_name := expr; Exemplu: emp_info.ename := UPPER(emp_info.ename); Se pot asigna valori, deodat, tuturor cmpurilor dintr-o nregistrare n dou moduri
Se poate atribui o nregistrare definit de utilizator unei alteia, daca au acelai tip de date
Nu este suficient sa existe cmpuri care corespund exact Consider the following example:

Second, you can use the SELECT or FETCH statement to fetch column values into a record, as the example below shows. The columns in the select-list must appear in the same order as the fields in your record.

Exemplu DECLARE TYPE DeptRec IS RECORD ( dept_num NUMBER(2), dept_name VARCHAR2(14)); TYPE DeptItem IS RECORD ( dept_num NUMBER(2), dept_name VARCHAR2(14)); dept1_info DeptRec; dept2_info DeptItem; BEGIN ... dept1_info := dept2_info; END;

-- gresit, deoarece sunt tipuri de date diferite

M. Danubianu - Teoria si implementarea bazelor de date

47

Atribuirea de valori nregistrrilor 2


Se poate atribui o nregistrare declarat cu %ROWTYPE unei nregistrri definite de utilizator daca, cmpurile celor dou corespund ca ordine i numr, iar cmpurile corespondente au tipuri de date compatibile: DECLARE TYPE DeptRec IS RECORD ( dept_num NUMBER(2), dept_name VARCHAR2(14), location VARCHAR2(13)); dept1_info DeptRec; dept2_info dept%ROWTYPE; BEGIN SELECT * INTO dept2_info FROM dept WHERE deptno = 10; dept1_info := dept2_info; ... END;

M. Danubianu - Teoria si implementarea bazelor de date

48

Atribuirea de valori nregistrrilor 3


Utilizarea unei instruciuni SELECT sau FETCH pentru a extrage valorile coloanelor ntr-o nregistrare
DECLARE TYPE DeptRec IS RECORD ( dept_num NUMBER(2), dept_name VARCHAR2(14), location VARCHAR2(13)); dept_info DeptRec; BEGIN SELECT * INTO dept_info FROM dept WHERE deptno = 20; ... END;
M. Danubianu - Teoria si implementarea bazelor de date 49

Atribuirea de valori nregistrrilor 4


NU este posibil asignarea unei liste de valori unei nregistrri printr-o instruciune de atribuire. Ex. urmtoarea sintax este INCORECT record_name := (value1, value2, value3, ...); Se poate atribui o inregistrare nested alteia, daca au acelai tip de date. Acest lucru este permis chiar daca nregistrrile ncapsulate au tipuri de date diferite.

DECLARE TYPE TimeRec IS RECORD ( mins SMALLINT, hrs SMALLINT); TYPE MeetingRec IS RECORD ( day DATE, time_of TimeRec, room_no INTEGER(4)); TYPE PartyRec IS RECORD ( day DATE, time_of TimeRec, place VARCHAR2(25)); Seminar MeetingRec; Party PartyRec; BEGIN ... party.time_of := seminar.time_of; END;

-- nested record

-- nested record

M. Danubianu - Teoria si implementarea bazelor de date

50