ee
Viad DIACONITA
lon LUNGU
Anda VELICANU
BAZE DE DATE
Bye
BeaINTRODUCERE iN PL/SQL
(PROCEDURAL LANGUAGE EXTENSION TO SQL)
L1 Introducere
PL/SQL este un limbaj procedural structurat pe bloc, programele putand fi
imparfite in blocuri logice, constructiile PL/SQL continand structuri de control
procedurale si comenzi descriptive SQL. Blocurile PL/SQL sunt procesate de
motorul PL/SQL care poate fi rezident pe serverul ORACLE sau pe un alt
instrument de dezvoltare (ex.: Oracle Forms, Reports, JDeveloper etc.).
Programarea in PL/SQL este modularizata, in acest sens se utilizeazi
blocurile care grupeaza instructiunile. Tipurile de date din SQL pot fi folosite in
PL/SQL.
Pentru a putea lucra cu limbajul PL/SQL avem nevoie in primul rand de o
conexiune la o bazi de date Oracle si de un instrument de dezvoltare prin care si
interactionim cu serverul Oracle. Pentru instalarea si configurarea instantei bazei
de da date se poate utiliza ghidul electronic pus la dispozitie de catre compania
Oracle odata cu kit-ul de instalare. Ca instrument de dezvoltare se poate utiliza
SQL*plus care se instaleazi impreund cu instanfa Oracle sau se poate utiliza SQL
Developer, un mediu de dezvoltare mai prietenos disponibil gratuit pe site-ul
companiei Oracle (www. oracle .com).
Schema bazei de date pe care se bazeazi exemplele din aceasta carte se
poate vedea in figura 1.
Scriptul pentru crearea acestor tabele este redat in Anexa 1 si se poate
descirea de pe site-ul http://bd.ase.ro impreuni cu scriptul pentru
adiugarea inregistrarilor.Baze de date, Limbajul PL/SQL | Introducere in PL/SQL (Procedural Language Extension to SQL) 11
1.2 Blocuri PL/SQL
| Orice unitate PL/SQL contine unul sau mai multe blocuri, complet separate
sau imbricate. Fiecare bloc este compus din sectiuni care pot fi obligatorii sau
optionale.
Componentele unui bloc PL/SQL
| Un bloc PL/SQL este compus din pana la 3. sectiuni: declarativa
(optionald), executabilé (obligatorie) si de tratare a exceptiilor (optionala).
Structura unui bloc PL/SQL poate fi prezentata astfel:
DECLARE (Optional)
2 | variabile, cursori, exceptii
e BEGIN (Obligatoriu)
i g comenzi SQL (asigura accesul la baza de date)
z & structuri de programare procedurala PL/SQL
82 3 EXCEPTION (Optional)
2 actiuni ce se executi cfnd apare o eroare
5 END; (Obligatoriu)
= z fn cadrul blocului pot aparea instructiuni SQL care asigurai accesul la baza
| 3 de date, de exemplu pentru efectuarea unor actualizari, dar operatiile efectuate cu
: 3 | variabilele PL/SQL in cadrul instructiunilor procedurale nu presupun accesarea
- | bazei de date.
5
3 Observatii:
Lt * se foloseste (;) dupa fiecare instructiune SQL sau instructiune de
£ control PL/SQL;
Se
=
+ blocul PL/SQL se termina cu (;);
* comentariile se pot realiza folosind (--) pentru fiecare linie de cod
comentata sau (/* */) pentru mai multe linii comentate;
* se foloseste (/) pentru a lansa un bloc anonim in bufferul SQL;
* — instructiunile nu sunt CASE SENSITIVE.
Blocurile PL/SQL pot fi executate 0 singuré dat& (cazul blocurilor
anonime), pot fi stocate in baza de date pentru a fi apelate ulterior (cazul funetiilor,
Tipe
‘MuweeR
IREGIUNE VAnCHAPZa
procedurilor si pachetelor stocate) sau pot fi realizate si apelate la nivelul
programelor de aplicatii (functii, proceduri, triggeri de aplicatii). in paragrafele
DEHN
Toc nEGiNE
urmatoare ne vom referi pe scurt la fiecare dintre aceste tipuri de blocuri, urménd
si le detaliem in capitole separate.12 Baze de date. Limbajul PL/SQL
Blocurile anonime prezintd urmiatoarele caracteristici:
* nu sunt stocate in baza de date;
* se declara inline, in locul in care se doreste executia lor;
* se executé in momentul rularii;
Daca dorii si reutilizati un bloc anonim va sféituim s& salvati codul sursi
pe hard disk intr-un fisier de tip .sql sau xt.
La modul general un bloc PL/SQL anonim poate avea urmittoarea forma:
DECLARE
eventualele initializari;
~ de exemplu: v_variabila tip_de_date;
BEGIN
-- instructiuni executabile;
EXCEPTION
WHEN exceptie THEN actiune;
END;
/
pentru a putea fi ulterior accesate variabilele, adresare lor fiind realizata astfel:
eticheta_bloc.variabila
DECLARE
<< eticheta_bloc >>
DECLARE
BEGIN
END eticheta_bloc;
END;
-- declararea variabilelor se face precizand tipul de date si realizandu-se
Blocurile PL/SQL se pot imbrica gi se pot eticheta cu <>
Introducere in PL/SQL (Procedural Language Extension to SQL) 13
Proceduri si functii
Sunt blocuri PL/SQL care au nume si pot fi stocate la nivelul bazei de date
sau la nivel de aplicatie (de exemplu in mediul de dezvoltare Oracle Developer
Suite — Forms si Reports).
in cazul procedurilor si functiilor sectiunea DECLARE este inlocuita de
definitia acesteia prin sintaxa CREATE [or replace] PROCEDURE/FUNCTION
(lista parametrilor $i tipul acestora), de exemplu:
CREATE [OR REPLACE] PROCEDURE nume > procedura (lista
parametri)
Is
CREATE [OR REPLACE] FUNCTION nume_functie (lista parametri)
RETURN tip_data
RETURN valoare
[EXCEPTION]
END;
/
Pachetele de subprograme sunt utilizate pentru a grupa mai multe
proceduri si functii utilizate pentru un anumit tip de prelucrari.
Declansatorii pe baza de date sunt blocuri PL/SQL asociate tabelelor (de
baz& sau virtuale) si lansate automat in executie cand are loc 0 comanda de
manipulare (insert/update/delete).14 Baze de date. Limbajul PL/SQL
Declansatorii de aplicatie sunt blocuri PL/SQL asociate unor evenimente din
cadrul aplicatiei (de exemplu: deplasarea mouse-ului, apasarea unui buton) si
lansate in executie automat la aparitia acestor evenimente.
13 Utilizarea operatorilor si functiilor in PL/SQL
Operatorii utilizagi
In cadrul blocurilor PL/SQL se pot utiliza aceiasi operatori ca gi in cazul
limbajului SQL. In plus fafa de acestia apare operatorul de atribuire (:
| Operator Caracteristici
+5%4, ** (op. Operatori aritmetici
exponential)
AND, OR, NOT Operatori logici
| _S>=>5< numeric gi caracter <->data. Pentru conversii explicite se utilizeaza
funcfiile TO_DATE, TO_NUMBER, TO_CHAR in mod aseminator cu limbajul
sau.
Afisarea pe ecran a valorilor variabilelor sau a mesajelor in PL/SQL se
realizeazi prin apelarea functiilor PUT LINE sau PUT din pachetul standard
DBMS_OUTPUT. Aceste doua functii primesc ca parametru un sir de caractere gi-
| afigeazi. Diferenta dintre cele doua functii este aceea c& prima afiseazi mesajul
dupa care trece la linia urmitoare, iar cea de a doua afigeazi mesajul pe linia
curent, Functiile PUT_LINE si PUT sunt necesare deoarece nu putem accesa
variabilele declarate in blocurile PL/SQL direct din mediul SQL (pentru a le afiga
cu PROMPT).
in unele medii de dezvoltare, ca de exemplu in SQL*Plus, trebuie utilizata
la inceputul sesiunii comanda SET SERVEROUTPUT ON care activeazi
bufferul pentru afisare.
SET SERVEROUTPUT ON
DBMS_OUTPUT.PUT_LINE ('...
DBMS_OUTPUT.PUT (
END;
1
De exemplu, vom realiza un bloc PL/SQL care si afigeze un mesaj. Pentru
a executa blocul utilizim mediul de dezvoltare SQL Developer. Mai intai este
hecesara stabilirea conexiunii cu serverul Oracle: click dreapta pe eticheta
Connections din stanga ecranului si completim detaliile referitoare la conexiune:
ume utilizator si parola, adresa IP a serverului si portul, numele instantei bazei de
date,,
Introducere in PL/SQL (Procedural Language Extension to SQL) 17
4 oa Oza TY TEESE
ea Mow tore het Sapce Ys Bhratin Tee ep o
(St Yew Honote Bin Saye Verney Mein Toe BO
G58a 9 xem 0-0-5.
Goa 9° kam 0-0-5.
— : vss ‘ et 1 Oe
Baze de date. Limbajul PL/SQL
=
9 4 [pi omor.ror unm (tesbeat USL ete taba) precedes
ee he
[Prfenas sort one, WQerpan|fprniace | owns cam | Cov cape
eae
crew et ap
sept mh ene om ab) proce!
cenit comune tet secs DECI, ECU, 96 TATA A ecEEIOR
| Figura 2 Executia blocurilor PL/SQL in SQL. Developer
Figura 1 Realizarea conexiunii cu serverul Oracle
Codul sursa al blocului este redat mai jos:
SET SERVEROUTPUT ON
Dupi conectare apare fereastra in care putem serie si executa blocurile, in
~-INTRODUCEM COMENTARII: in acest caz sectiunea
mod asemanator cu modul de lucru cu instructiunile SQL. Pentru executia
a ¢ DECLARE lipsegte
blocurilor se da click pe unul dintre butoanele Execute Statement (F9) sau Run --blocul afigeaz& un mesaj
Script (F5).
BEGIN
DBMS_OUTPUT.PUT_LINE ('Limbajul PL/SQL este un
limbaj procedural!') ;
DBMS_OUTPUT.PUT_LINE('Un bloc PL/SQL contine
trei seciuni: DECLARATIVA, EXECUTABILA, DE
TRATARE A EXCEPTIILOR') ;
END;
/Baze de date. Limbajul PL/SQL
~S
Exercitii propuse
1. Recapitulati notiunile de baz ale limbajului SQL, precum si comenzile
utilizate.
2. Creati o conexiune noua in SQL Developer si testati programul clasic
Hello World!
VARIABILE PL/SQL
IL1 Declarare si initializare
Declararea variabilelor se realizeazi in zona declarativa delimitata prin
DECLARE a blocului sau sub-blocului. Initializarea variabilelor se poate face la
declarare sau in zona de executie intre BEGIN si END.
Variabilele vor fi vizibile si in blocurile imbricate, incluse in el, mai putin
in sub-blocurile in care numele lor este redefinit, la fel ca in cazul limbajelor de
Programare structurate, unde semnificatia unui nume definit de utilizator intr-un
bloc/sub-bloc este data de cea mai apropiata declaratie anterioara locului folosirii.
La declararea variabilelor PL/SQL se precizeaza obligatoriu tipul de dat si
optional anumite restrictii si un sir valid de valori. Declararea si initializarea se
realizeaza astfel:
nume_variabila [CONSTANT] TIP_DATA [NOT NULL] [:= |
DEFAULT expresie];
Constantele in PL/SQL trebuie obligatoriu initializate, iar ulterior nu isi vor
putea schimba valoarea. Variabilele pentru care se precizeaza restrictia NOT
NULL trebuie obligatoriu initializate, iar ulterior nu vor putea primi valoarea
NULL.
Pentru a putea urmari mai usor codul sursi se foloseste urmatoarea
conventie de notare:
¢_nume Constanta - pentru declararea constantelor;
v_nume Variabila - pentru declararea variabilelor;
_nume Variabila_globala —pentru variabilele globale definite in zona de
specificatii a unui pachet de subprograme si valabile pentru toate
procedurile si functiile pachetului.eee
20 Baze de date. Limbajul PL/SQL
11.2. Tipuri de variabile
Variabile PL/SQL
= Scalare
= Compozite
+ Referinti
+ LOB (Large Objects): NCLOB, CLOB, BLOB, BFILE
+ Obiect
Variabile non-PL/SQL: variabile de mediu (BIND VARIABLES)
11.2.1 Variabile scalare
Tipurile scalare contin valori simple, o variabila scalara poate confine la un
moment dat 0 singura valoare si corespunde in principal tipurilor de date Oracle.
Cele mai cunoscute si utilizate tipuri de date sunt prezentate in tabelul urmator:
char (lung_max) - lungime fix de max 32.767 bytes
= varchar? (lung_max) — lungime variabild de max 32.767 bytes
= long [sir de caractere de lungime variabili 2GB]
= number (precizie,scala)
= boolean (true, false, null)
= date
= binary_integer si pls_integer (numere intregi intre -
2147483647 $i 2147483647)
= binary_float si binary_double (pentru numere reale in
varianta Oracle 10g)
= timestamp (pentru fractiuni de secunda)
Pentru alte tipuri de date puteti consulta capitolul 3 din [ORAPL].
Exemple:
v_functie varchar2 (9);
v_numar binary integer
v_totalsal number (9,2)
v_datainceput date:=sysdate+7;
c_taxa constant number (3,2) :=8.25;
v_valid boolean not null:=true;
Variabile PL/SQL 21
Afisarea variabilelor PL/SQL se realizeaza prin intermediul functiei
PUT_LINE din pachetului DBMS OUTPUT. Se poate utiliza operatorul de
concatenare ( || ) pentru a afiga mai multe mesaje sau variabile pe aceeasi linie, de
exemplu:
DBMS_OUTPUT.PUT_LINE ('VALOAREA VARIABILEI ESTE:
|\variabila);
Popularea variabilelor cu valori din tabelele bazei de date
Se utilizeazi comanda SELECT cu clauza INTO pentru popularea
variabilelor PL/SQL cu valori ale atributelor din tabele, insd pentru aceasta cererile
SELECT din cadrul blocurilor PL/SQL trebuie si furnizeze o singura linie rezultat,
in caz contrar se va semnala o eroare. Pentru a putea accesa o anumit inregistrare
sau valoare a unei coloane dintr-o tabeld este obligatoriu s& utilizim variabile
PL/SQL, aga cum se observa si in exemplul urmator:
Exemplu: Sd se afiseze numele angajatului cu codul 100:
SET SERVEROUTPUT ON
DECLARE
--declaram variabila v_nume in care vom returna
numele angajatului:
v_nume VARCHAR2 (20) ;
BEGIN
-- utilizam instructiunea SELECT cu clauza INTO
pentru a popula variabila:
SELECT nume INTO v_nume
FROM angajati WHERE id_angajat = 100;
-- afisam valoarea varibilei:
DBMS_OUTPUT. PUT_LINE('NUMELE ANGAJATULUI ESTE: '
|| v_nume) ;
END;
/
Rezultatele executiei blocului sunt prezentate in figura 2.1_—
22 Baze de date. Limbajul PL/SQL Variabile PL/SQL 23
oe Ss Exemple:
2500 9¢ xan 0-0-5- eee ‘Sd se afiseze numele si prenumele angajatului cu codul 100:
ae 1a. DECLARE
Sree --declaram doua variabile pentru nume si
2G we come YOR): — i v_nume angajati.nume%TYPE;
rae suai ir v_prenume angajati.prenume%TYPE;
| aa [ BEGIN
paar
Figura 2.1 Executia blocului PL/SQL
1. Atributul %TYPE
Pentru a declara o variabili PL/SQL care sa aiba acelasi tip de date cu o
anumit& coloana dintr-o tabeli sau cu o alti variabilé declarati anterior putem:
folosi atributul %TYPE. Declararea unei variabile cu % TYPE se face astfel:
variabila
sau
variabilal tip_data;
variabila2 _variabilal%TYPE;
tabela.nume_coloani%TYPE;
-- populam si afisam variabilele:
SELECT nume, prenume
INTO v_nume, v_prenume
FROM angajati
WHERE id_angajat = 100;
DBMS_OUTPUT. PUT_LINE('NUMELE ANGAJATULUI
ESTE:' || v_nume||' '| |v_prenume) ;
END;
Observatie: Restrictia NOT NULL a unei coloane nu se aplica si variabilei
declarate prin folosirea atributului %TYPE.
2. Variabile de mediu sau variabile de legdtura ale aplicatiilor gazdi
(BIND VARIABLES)
Acestea sunt variabile de legaturi cu aplicatia in care ruleazi motorul
PL/SQL si trebuie declarate in aplicatie (in mediul gazda), putand fi accesate i
modificate in cadrul blocurilor PL/SQL.
Dupa terminarea executiei blocului PL/SQL, variabila rimane in mediul
gazdi cu valoarea primité in urma rul&rii blocului si poate fi pasati altui bloc,
realizind astfel transmiterea de valori intre blocurile PL/SQL. Variabilele de mediu
nu pot fi utilizate in cadrul procedurilor, functiilor sau pachetelor.
Variabilele de mediu se declara in afara blocului PL/SQL cu ajutorul
cuvantului cheie VARIABLE:
VARIABLE g_numevariabili TIP
Observagie: pentru declararea unei variabile de mediu de tip NUMBER nu
se specifica precizia si scala;"4 Baze de date. Limbajul PL/SQL
Variabilele de mediu se utilizeaza in cadrul unui bloc PL/SQL sau intr-o
instructiune SQL din afara blocului prefixate cu (:) astfel:
shost_variabila:=v_variabila;
Variabilele de mediu se afigeazi
fn afara blocului cu ajutorul comenzii
PRINT (la afigare variabila nu se va prefixa cu “:”);
PRINT g_numevariabili
Exemple:
1. St se afigeze mesajul: Bloc PL/SQL cu ajutorul unei variabile de mediu:
--declaram variabila de mediu:
VARIABLE g _mesaj varchar2 (30)
BEGIN
-- atribuim mesajul variabilei
"Bloc PL/SQL';
-- afisam valoarea variabilei in afara
blocului:
PRINT g_mesaj
2. Séi se afiseze numarul de comenzi a cdror modalitate de completare este
online:
SET SERVEROUTPUT ON
-- declaram variabila de mediu:
VARIABLE g_comenzi varchar2 (30)
BEGIN
-- utilizam o cerere SQL pentru a calcula si
popula variabila cu numarul de comenzi:
select count(*) into :g comenzi
from comenzi
where modalitate
END;
a
-- afisam variabila:
PRINT g_comenzi
‘online! ;
Variabile PL/SQL 25 |
Observatie: Se poate auto-afisa variabila prin setarea AUTOPRINT ON
Exemplu: Sa se selecteze produsele si pretul acestora pentru acele
produse care au prepul < preful mediu al produsului cu codul 3133 faré a utiliza 0
cerere imbricaté:
SET SERVEROUTPUT ON
SET AUTOPRINT ON
VARIABLE g pret number
BEGIN
select avg(pret) into :g pret
from rand_comenzi
where id _produs = 3133;
END;
/
--utilizam variabila de mediu intr-o interogare
SQL:
select * from rand_comenzi where pret< :g_pret;
Figura 2.2 Executia blocului PL/SQL26 Baze de date. Limbajul PL/SQL
3. Variabile de substitutie
De regula, variabilele de substitutie sunt folosite pentru a transmite valori
dinspre mediul SQL*Plus spre comenzile SQL sau blocurile PL/SQL, in timp ce
variabilele de legatura (bind variables) sunt folosite pentru a transmite valori
in sens invers sau pentru a transfera valori intre blocuri PL/SQL lansate succesiv
(primul bloc seteaz variabila, urmatorul o consult).
Prin variabilele de substitutie se pot transmite valori comenzilor SQL sau
blocurilor PL/SQL lansate (folosind "&" sau "&&"). Se pot utiliza in comenzile
SQL sau in blocurile PL/SQL prin "&nume_variabila" sau "&&nume_variabila".
Variabilele de substitutie sunt locale sesiunii SQL in care au fost declarate.
in mediul SQL variabilele de substitutie pot fi usor utilizate prin introducerea de
valori de Ja tastatura utilizind ACCEPT, se pot defini cu DEFINE sau afisa pe
ecran cu PROMPT;
Exemplu: Sa se afigeze numarul de comenzi ale angajatului al cérui cod
este introdus de la tastaturé de cdtre utilizator prin intermediul variabilei de
substitutie &id_angajat:
DECLARE
v_nr_comenzi number (2) ;
BEGIN
--introducem id-ul angajatului cu ajutorul
variabilei &id_angajat
select count (nr_comanda) into v_nr_comenzi from
comenzi
where id_angajat=&id_angajat;
dbms_output.put_line('Angajatul are: '| |
v_nr_comenzi||' comenzi') ;
END;
/
Variabile PL/SQL 27
(ea
i
f
i
3 STR
ml
=
Figura 2.3 Executia blocului PL/SQL
fntr-un bloc PL/SQL se pot utiliza toate tipurile de variabile, respectind
ins caracteristicile si regulile de utilizare ale acestora. in exemplul urmator se
utilizeazi atat variabila de substitutie s_mume definita si initializata prin comanda
DEFINE, cat si variabila de legatura g_salariul, dar si variabila local v_prenume
de acelasi tip cu coloana nume din tabela Angajati. Variabila de substitutie definita
cu DEFINE va fi implicit de tipul CHAR.
Exemplu: Si se afiseze salariul si prenumele angajatului cu numele Abel:
SET SERVEROUTPUT ON
-- definim variabila de mediu
VARIABLE g_salariul number
-- definim variabila de substitutie
DEFINE s_nume=Abel
DECLARE
--declaram variabila locala PL/SQL
v_prenume angajati.nume%type;
BEGIN
select prenume,salariul into v_prenume,
| salariul
from angajati where nume='&s_nume';28 Baze de date. Limbajul PL/SQL Variabile PL/SQL 29
DBMS_OUTPUT.PUT_LINE ('Prenumele angajatului rE St
ie = = a :
este: '||v_prenume) ; foae 90 xe
END; aio is EA ;
aay
Z | commas
print g salariul
11.2.2 Tipuri de date compuse
u radu eve Span di3138;
1. Tipul RECORD
Reprezinti un grup de date logic corelate (de exemplu, datele despre un
client: code, nume, adresa sunt diferite ca tip dar corelate logic). Atunci cand se
declard un PL/SQL record pentru aceste cimpuri, ele pot fi manipulate ca o unitate,
ficcare cémp (element al structurii) avand un nume si un tip de data, Atributele
unui record sunt referite astfel: nume_record.nume_cémp.
Declarea unui tip record se face astfel: |
TYPE nume record IS RECORD (numecimp TIP_DATA
[,nume_cimp TIP_DATA:=|DEFAULT valoare]...);
Tar declararea unei variabile de acest tip:
Variabili. NUME_RECORD;
Figura 2.4 Executia blocului PL/SQL
Exemplu: Utilizand un tip de data record definit de utilicator sd se afiseze '
Pretul minim al produsului cu codul 3133. Pentru a defini un record pe baza coloanelor unei tabele se foloseste
: Yorowtype . In acest caz numele elementelor din record au acelagi nume ca si
coloanele tabelei, acelasi tip de date si se gisesc in aceeasi ordine.
NUME_RECORD tabelaY%SROWTYPE;
DECLARE
TYPE tip _produse IS RECORD
(v_cod produse.id produsttype NOT NULL:=3000,
v_den produse.denumire_produs%type,
Exemplu: Sa se rescrie exemplul de mai sus utilizand atributul
v_pret_min produse.pret_minttype) ;
YROWTYPE:.
vrec_prod tip _produse;
a eS DECLARE
dusetrowtype;
SELECT id_produs, denumire produs, pret_min — prod produ; ‘YP!
into vrec_prod from produse where
id_produs=3133;
dbms_output .put_line('Produsul: | II
vrec_prod.v_den|| ' are pretul minim:
"| |vrec_prod.v_pret_min) ;
END;
/
SELECT * into vrec_prod from produse where
id_produs=3133;
dbms_output .put_line('Produsul: '| |
vrec_prod.denumire produs|| ' are pretul minim:
"| |vrec_prod.pret_min) ;
END;
/30 Baze de date. Limbajul PL/SQL Variabile PL/SQL at
2. Specificati ce se va afiga la rularea urmatorului bloc PL/SQL (care
contine blocuri imbricate, ilustrand domeniul de vizibilitate al unor variabile care
au acelasi nume):
DECLARE
EXERCITI PROPUSE var NUMBER;
BEGIN
var
1;
. DBM: ,
1. Specificati ce se va afisa la rularea urmiitorului bloc PL/SQL: S_OUTPUT. PUT_LINE (var) ;
‘bli
DECLARE see a
v_varl NUMBER :=100; nae
v_var2 NUMBER; | NUMBER ;
7 BEGIN
v_var3 NUMBER := v_var2; | 3
7 : : var :=2;
v_var4 VARCHAR (20) : 'variabila PL/SQL'; a our
v_var5 NUMBER NOT NULL := v_varl; | _ OUTPUT. PUT_LINE (var) ;
Ee END bloc1;
c_const1 CONSTANT DATE
TO_DATE ('12/02/2007', 'dd/mm/yyyy') +
| DBMS_OUT: A
c¢_const2 CONSTANT NUMBER NOT NULL := 2; }_OUTPUY. PUT_LINE (var) ;
c_const3 CONSTANT NUMBER := NULL; |
v_var6é NUMBER DEFAULT NULL; } ee
- | DECLARE
var NUMBER;
BEGIN a2 ER;
DBMS_OUTPUT. PUT_LINE('variabila 1 = '||v_varl); a
DBMS_OUTPUT. PUT_LINE('variabila 2 "| |v_var2) ; oe ae
DEMS_OUTPUT. PUT_LINE('variabila 3 = '||v_var3); s_OUTPUT. PUT_LINE (var) ;
DBMS_OUTPUT.PUT_LINE('variabila 4 = ' | |v_var4); I
DBMS OUTPUT. PUT LINE('variabila 5 = '||v_var5); <>
7 7 DECLARE
DBMS_OUTPUT. PUT_LINE('constanta 1 =
| |e_const1) ; var NUMBER;
7 BEGIN
DBMS_OUTPUT. PUT_LINE('constanta 2 =
var :=4;
"| |c_const2) ; i
DBMS_OUTPUT.PUT_LINE('constanta 3 = DBMS_OUTPUT. PUT_LINE (var) ;
‘| |e_const3) ; DBMS_OUTPUT. PUT_LINE (bloc2.var) ;
DBMS_OUTPUT.PUT_LINE('variabila 6 = '||v_var6); END b1OSeiToe STU .,
END; DBMS_ouUTPYfePUT_LINE (var) ;
a DEPARTAMENTU
BIBLIOTECA =
atlTe
Baze de date. Limbajul PL/SQL
32
DBMS_OUTPUT . PUT_LINE (var) ;
END;
/
3. Specificati ce se va afiga la rularea urmitorului bloc PL/SQL:
DECLARE
stoc NUMBER (3) :=600;
mesaj VARCHAR2 (50) :='Produsul 101';
BEGIN
DECLARE
stoc NUMBER (3) :=10;
mesaj VARCHAR2 (50) :='Produsul 102';
um VARCHAR2(10):= ' bucati ';
BEGIN
stoc:= stoc+l;
mesaj:='Stocul pentru ' | |mesaj||' este
de: '||stoc| |um;
DBMS_OUTPUT. PUT_LINE (mesaj) ;
END;
stoc:= stoc+100;
mesaj:='Stocul pentru '| |mesaj||' este
de: '||stoc| |um;
DBMS_OUTPUT. PUT_LINE (mesaj) 7
END;
i
4, Sa se calculeze suma a doua numere, iar rezultatul si se divid’ cu 3.
‘Numerele se vor introduce de la tastatura:
5, S& se afigeze salariul marit cu un procent. Salariul si procentul se
introduc de la tastatura.
INTERACTIUNEA CU SERVERUL ORACLE
PRIN COMENZI SQL
Interactiunea se realizeazi prin intermediul comenzilor de definire a
datelor - DDL (Data Definition Language), limbajul de gestiune a utilizatorilor -
DCL (Data Control Language), limbajul de manipulare a datelor - DML (Data
Manipulation Language), limbajul de control al tranzactiilor - TPL (Transaction
Processing Language) astfel:
° PL/SQL suport toate comenzile din limbajul de manipulare a datelor
(DML) si din cel de control al tranzactiilor (TPL). Un bloc PL/SQL nu e o
tranzactie, comenzile Commit/ Rollback/ Savepoint sunt independente de bloc dar
pot sa apara in interiorul sau.
Comenzi DMI/TPL Execufie
SELECT, INSERT, UPDATE, Se execut normal in cadrul bloculul
DELETE, MERGE
COMMIT, ROLLBACK, Pot aparea in bloc dar au efect asupra
SAVEPOINT tuturor —tranzacfiilor din _interiorul
si din afara acestuia.
* PL/SQL nu suporti comenzi de definire a datelor sau de gestiune a
utilizatorilor (DDL sau DCL) in cadrul unui bloc. Pentru executarea acestor
comenzi se utilizeaz’ comanda EXECUTE IMMEDIATE ‘comanda DDL’:
Comenzi DDL/DCL Execujie
CREATE, ALTER, DROP EXECUTE IMMEDIATE ' CREATE
GRANT, REVOKE TABLE.... '
Exemple:
1. Sa se creeze tabela PROD in cadrul unui bloc PL/SQL:
SET SERVEROUTPUT ON
BEGIN
EXECUTE IMMEDIATE 'CREATE table prod AS SELECT
* FROM produse where 1=2';
END;
/34 Baze de date. Limbajul PL/SQL
i
"
1
a)
uegepaBy p