Documente Academic
Documente Profesional
Documente Cultură
Obiective
Scopul lectiei
In aceasta lectie, veti invata sa scrieti cod executabil intr-un PL/SQL bloc. Veti mai
invata regulile de includere a blocurilor, precum si cum se executa si testeaza aceste
blocuri.
Delimitatori
Delimitatorii sunt simboluri simple sau compuse care au o semnificatie speciala
pentru PL/SQL.
1
simbol semnificatie simbol semnificatie
^ operator adunare <> operator relational
Identificatorii
pot contine pana la 30 caractere
nu pot contine cuvinte rezervate
exceptand cazul cand acestea sunt incluse
in ghilimele duble
trebuie sa inceapa cu un caracter alfabetic
nu trebuie sa aiba acelasi nume ca al
unei coloane dintr-o baza de date folosita
Identificatori
Identificatorii sunt folositi pentru a denumi unitati si obiecte de program PL/SQL,
adica constante, variabile, exceptii, cursoare, variabile tip cursor, subprograme, si
pachete.
Identificatorii pot contine pana la 30 caractere, dar trebuie sa inceapa cu un
caracter alfabetic.
Nu trebuie alese aceleasi nume pentru identificatori ca cele ale coloanelor
bazelor de date folosite in bloc. Daca apare acest caz si identificatorii se
gasesc in aceeasi parte declarativa SQL, atunci se considera ca se face referire
la coloana.
Cuvintele rezervate nu pot fi folosite ca identificatori, mai putin cand sunt
incluse intre ghilimele duble( de exemplu, “SELECT”).
Cuvintele rezervate ar trebuie scrise cu litere mari pentru o mai buna
lizibilitate a codului.
Constante
Constantele de tip caracter si data trebuie
sa fie incluse intre ghilimele simple
v_ename:=’Henderson’;
2
Constantele
O constanta este un numar, caracter, sir de caractere, sau valoare de tip boolean
nereprezentata de un identificator.
Constantele de tip caracter contin toate caracterele tiparibile din setul de
caractere PL/SQL: litere, numere, spatii si simboluri speciale.
Constantele numerice pot fi o valoare simpla (de exemplu, -32.5) sau o
notatie stiitifica (de exemplu,2E5, reprezinta 2*10 la puterea 5 adica 200000).
Comentarea codului
Exemplu
…
v_sal NUMBER(9,2);
BEGIN
/* Compute the annual salary based on
the monthly salary input from the user*/
v_sal:=v_sal * 12;
END; -- This is the end of the transaction
Comentarea codului
Este indicata comentarea fiecarei faze de programare pentru a usura
depanarea. Pentru a comenta o singura linie de cod se insereaza la incepul ei doua
caractere minus (--), iar in cazul a mai multor linii acestea se incadreaza intre /* si */.
Exemplu
Calculul salariului anual pe baza celor lunare:
…
v_sal NUMBER(9,2);
BEGIN
/* Compute the annual salary based on
the monthly salary input from the user*/
v_sal:=v_sal * 12;
END; -- This is the end of the transaction
3
Functii SQL in PL/SQL
Disponibile:
-de tip numeric
-de tip sir de caractere
-de tip conversie data
-de tip data
Nedisponibile:
-GREATEST
-LEAST
-DECODE
-de tip grup
v_total := SUM(number_table);
Functii PL/SQL
Exemple
Completarea unei liste cu adresele
angajatilor
v_mailing_address:=v_name||CHR(10)||v_address
||CHR(10)||v_state||CHR(10)||v_zip;
v_ename:= LOWER(v_ename);
Functii PL/SQL
4
PL/SQL pune la dispozitie utilizatorilor multe functii puternice pentru
manipularea datelor. Acestea se pot grupa:
de tip error-reporting
de tip numeric
de tip caracter
de tip conversie
de tip data
altele
5
Conversii de tipuri de date
v_comment:=USER||’: ‘||SYSDATE;
v_comment:=USER||’: ‘||TO_CHAR(SYSDATE);
Blocuri incluse
Unul din avantajele pe care PL/SQL le are asupra SQL este posibilitatea de a
include sectiuni de cod. Se pot include blocuri oriunde o sectiune de cod executabila
este permisa, blocurile incluse devenind astfel sectiuni de cod. De aceea, partile
executabile ale unui bloc pot fi impartite in blocuri mai mici. Sectiunea exception
poate include deasemenea blocuri.
6
care poate referi acel obiect. Se pot referi variabilele declarate in
cadrul sectiunilor executabile.
Identificatori
Un identificator este vizibil in blocul in care este declarat si in toate
subblocurile, procedurile si functiile incluse. Daca blocul nu gaseste indentificatorul
declarat local atunci cauta in
blocurile in care este inclus( blocurile parinte ) , si niciodata in
blocurile incluse( blocurile fiu ).
Aceste reguli se aplica tuturor obiectelor declarate, incluzand variabile, cursoare,
exceptii definite de utilizator si constante.
Exemplu
...
x BINARY_INTEGER;
BEGIN Scope of x
...
DECLARE
y NUMBER;
BEGIN Scope of y
...
END;
...
END;
In cadrul blocurilor incluse de mai sus, variabila y poate referi variabila x. Variabila x
nu poate referi variabila y. Valoarea unei variabile este valida doar in interiorul
blocutilor in care este inclusa si in interiorul blocurilor incluse, nu si in afara acestora.
7
Domeniu
Domeniu unui identificator este acea regiune a unui program ( bloc, subprogram sau
sectiune) din care se poate referi identificatorul.
Vizibilitate
Un identificator este vizibil numai in regiunile din care acesta se poate referi
nefolosind un nume specific.
Operatori in PL/SQL
Logici
Aritmetici
De concatenare
Paranteze de control al ordinii operatiilor
-- aceasi ca in SQL
Operatorul exponential(**)
Ordinea operatiilor
Operatiile din cadrul unei expresii sunt executate intr-o ordine particulara depinzand
de precedenta (prioritatea) lor. Urmatorul tabel arata ordinea operatiilor de sus in jos:
Operator Operation
**,NOT exponenta,negare logica
^,- identitate,negare
*./ inmultire,impartire
^,-,|| adunare,scadere,concatenare
a,!a,<,>,<a,>a,ISNULL, comparare
LIKE,BETWEEN,IN
AND conjunctie
OR incluziune
Nota: Nu este necesar sa folosim paranteze in cadrul expresiilor booleene, dar sunt
mai usor de citit daca le folosim.
8
Operatori in PL/SQL
Exemple
Incrementarea unui index pentru un loop
v_count :=v_count+1;
v_equal :=(v_n1av_n2);
Operatori in PL/SQL
Lucrand cu valori nule, se pot evita cateva greseli comune respectand urmatoarele
reguli:
Compararea cu valori nule are intotdeauna rezultat NULL;
Aplicarea operatorului NOT unei valori nule are ca rezultat NULL;
In cadrul instructiunilor de test daca o conditie este NULL, secventa asociata
respectivei instructiuni nu se executa;
Conventii de cod
Urmatorul tabel da reguli pentru scrierea codului cu caractere mari sau mici pentru a
ajuta la distingerea cuvintelor cheie de celelalte obiecte.
9
Categorie Case Convention Exemple
Blocuri SQL Uppercase SELECT,INSERT
Cuvinte cheie PL/SQL Uppercase DECLARE,BEGIN,IF
Conventii de notare
Conventii de notare
Tabelul urmator prezinta un de prefixe si sufixe utile pentru deosebirea
identificatorilor de alti identificatori, a obiectelor de tip baza de date, precum si a
altor obiecte.
Alinierea codului
10
DECLARE
v_deptno NUMBER(2);
BEGIN v_location VARCHAR2(13);
IF xa0 THEN BEGIN
ya1; SELECT deptno,
END IF; location
END; INTO v_deptno,
v_location
FROM dept
WHERE dnamea’SALES’;
END;
Alinierea codului
Pentru o mai buna lizibilitate a codului este indicata alinierea codului. Pentru
a evidentia structurile, liniile de cod se “rup” folosind carriage return si apoi se
insereaza spatii sau caractere tab. Comparatii urmatoarea structura IF din punct de
vedere al lizibilitatii:
IF x > y THEN
max := x;
ELSE
max := y;
END IF;
Determinarea domeniilor de
vizibilitate a variabilelor
Exercitiu
…
DECLARE
11
v_sal NUMBER(7,2):=60000;
v_comm NUMBER(7,2):=v_sal / .20;
v_message VARCHAR@(255):=‘ eligible for
commission’;
BEGIN …
DECLARE
v_sal NUMBER(7,2):=50000;
v_comm NUMBER(7,2):=0;
v_total_comp NUMBER(7,2):=v_sal+v_comm;
BEGIN
v_message:=’CLERK not’||v_message;
END;
v_message:=’SALESMAN’||v_message;
END;
Exercitiu
Analizati blocul PL/SQL de mai sus. Determinati urmatoarele valori conform
regulilor de vizibilitate:
1.valoarea v_message in blocul inclus
2.valoarea v_total_com in blocul principal
3.valoarea v_comm in blocul inclus
4.valoarea v_comm in blocul principal
5.valoarea v_message in blocul principal
Sumar
Exercitii recapitulative
12
Exercitii recapitulative
Aceasta recapitulare are ca scop aprofundarea conceptelor de baza PL/SQL
prezentate in aceasta lectie, adica regulile de includere ale blocurilor, de testare si
executare a lor.
1.Blocuri PL/SQL:
DECLARE
v_weight NUMBER(3):=600;
v_message VARCHAR2(255):=’Product 11002’;
BEGIN
SUB-BLOCK
DECLARE
v_weight NUMBER(3):=1;
v_message VARCHAR@(255):=’Product 11001’;
v_new_locn VARCHAR(50):=’Europe’;
BEGIN
v_weight:=v_weight+1;
v_new_locn:=’Wstern ‘||v_new_locn;
END;
v_weight:=v_weight+1;
v_message:=v_message||’ is in stock’;
v_new_locn:=’Western ‘||v_new_locn;
END;
2.Domenii de vizibilitate
DECLARE
v_customer VARCHAR2(50):=’Womansport’;
v_credit_rating VARCHAR(50):=’EXCELLENT’;
13
BEGIN
DECLARE
v_customer NUMBER(7):=201;
v_name VARCHAR2(25):=’Unisports’;
BEGIN
END;
END;
3. Creati si executati un bloc PL/SQL care accepta doua numere prin intermediul a
doua variabile de substitutie SQL*Plus. Primul numar trebuie impartit la al doilea
iar rezultatul adunat la cel deaal doilea numar. Rezultatul trebuie scris intr-o
variabila PL/SQL si afisat pe ecran.
V_RESULT
--------
4.5
14
4. Construiti un bloc PL/SQL care calculeaza compensatia totala pentru un an.
Salariul anual si bonusul anual sunt trimise blocului PL/SQL prin doua variabile
de substitutie SQL*Plus bonusul trebuind sa fie convertit dintr-un numar intreg in
zecimal ( de exemplu 15 in .15). Daca salariul este nul, dati-i valoarea zero
inainte de a calcula valoarea compensatiei. Folositi functia NVL pentru valorile
nule.
Nota: Pentru a test functia NVL datI NULL la prompt; apasand <return> rezulta un
mesaj de eroare (missing expression error).
G_TOTAL
-------
55000
15