Sunteți pe pagina 1din 32

Proiectarea bazelor de date - Laborator 1

Sintaxa instructiunilor PL/SQL


Interactiunea cu Serverul Oracle

Obiective - Sintaxa instructiunilor PL/SQL


• Sa recunoasteti blocuri de baza PL/SQL si sectiunile lor
• Sa descrieti semnificatia variabilelor in PL/SQL
• Sa faceti distinctia intre variabilele PL/SQL si cele non PL/SQL
• Sa declarati variabile PL/SQL
• Sa executati blocuri PL/SQL
• Descrieti regulile blocurilor incluse
• Executa si testa un bloc PL/SQL
• Folosi conventiile de programare

Scopul lectiei
Lectia prezinta regulile de baza si structura blocurilor PL/SQL. Este prezentat modul de
declarare a variabilelor si declararea tipurilor de datee pentru aceste variabile. Veti mai invata regulile
de includere a blocurilor, precum si cum se executa si testeaza aceste blocuri.

Structura unui bloc PL/SQL

• DECLARE - Optional
- Variabile, cursori, exceptii utilizators
• BEGIN - Obligatoriu
- Instructiuni SQL
- Instructiuni PL/SQL
• EXCEPTION - Optional
- Actini care trebuie executate cand apar erori
• END - Obligatoriu

Structura blocurilor PL/SQL


PL/SQL este un limbaj structurat pe blocuri, adica programele pot fi impartite in blocuri logice.
Un bloc PL/SQL cuprinde trei sectiuni: declarativa (optionala), executabile (obligatorie) si de tratare a
exceptiilor (optionala). Numai cuvintele cheie BEGIN si END sunt obligatorii. Se pot declara variabile
locale blocului pe care le foloseste. Conditiile de eroare (exceptiile) pot fi gestionate in cadrul blocului
in care apar. Poti pastra si schimba valori intr-un bloc PL/SQL declarand si referind variabile si alti
identificatori.

Urmatorul tabel descrie cele trei sectiuni ale blocului.

Seciune Descriere Incluziune


Declarativa Contine toate variabilele, constantele, cursorii si exceptiile Optionala
definite de utilizator care sunt referite in sectiile executabile si de
tratare a exceptiilor.
Executabila Contine instructiuni SQL pentru manipularea datelor din baza de Obligatorie
date si instructiuni PL/SQL pentru manipularea datelor in cadrul
blocului.
1
Tratarea Specifica actiunile care se declanseaza atunci cand apar erori sau Optionala
exceptiilor conditi anormale in sectiunea executabila.

Exemplu
DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT column_name
INTO v_variable
FROM table_name;
EXCEPTION
WHEN exception_name THEN

END;

Executarea instructiunilor si blocurilor PL/SQL din SQL*Plus


• Puneti (;) la sfarsitul unei instructiuni SQL sau PL/SQL
• Puneti un slash (/) pentru executarea unui bloc anonim PL/SQL in buferul SQL. Atunci cand blocul
este executat fara erori atunci mesajul de iesire este urmatorul:
PL/SQL procedure successfully completed
• Puneti un punct (.) pentru a inchide un buffer SQL. Un bloc PL/SQL este tratat ca o singura
instructiune in buffer, si (;) din cadrul blocului nu inchide sau executa buffer-ul.

Nota: In PL/SQL o eroare se numeste exceptie.


Sectiile DECLARE, BEGIN si EXCEPTION nu sunt urmate de (;). Totusi, END si orice alta
sintaxa PL/SQL cere (;) la sfarsitul instructiunii.

Tipuri de blocuri in PL/SQL

Anonim Procedura Functie

[DECLARE] PROCEDURE name FUNCTION name


IS RETURN datatype
IS
BEGIN BEGIN BEGIN
-statements - statements - statements
RETURN value;
[EXCEPTION] [EXCEPTION] [EXCEPTION]

END; END; END;

Fiecare modul PL/SQL contine unul sau mai multe blocuri. Aceste blocuri pot fi separate sau
imbricate unul in altul.
Blocurile anonime
Blocurile anonime nu au nume. Ele sunt declarate in cadrul aplicatiilor si executate la run-time.

2
Subprogramele
Subprogramele sunt blocuri PL/SQL care au nume, care pot lua parametri si poti fi apelate. Pot
fi declarate ca proceduri sau functii. In general se folosesc proceduri pentru a executa o actiune si o
functie pentru a calcula o valoare.
Subprogramele se pot stoca la nivel de server de date sau la nivelul aplicatiilor. Daca folositi
componentele Developer/2000 (Forms,Reports,Graphics) puteti declara proceduri si functii ca parte
componenta a aplicatiei si pot fi apelate din alte proceduri, functii sau triggere.
Nota: O functie este similara cu o procedura, cu exceptia faptului ca trebuie sa intoarca o
valoare.

Modul Descriere Disponibilitate


Anonymous Blocuri PL/SQL fara nume care sunt incluse in aplicatie In toate mediile PL/SQL
block sau sunt lansate interactiv.
Stored Blocuri PL/SQL cu nume care sunt stocate de Serverul Server Oracle
procedure or Oracle si care pot accepta parametri si care pot fi apelate
function dupa nume.
Application Blocuri PL/SQL cu nume care sunt stocate in aplicatiile Modulele Developer/200
procedure or dezvolatate cu Developer/2000 sau in biblioteci si care pot
function fi apelate dupa nume.
Package Modul PL/SQL care grupeaza impreuna proceduri, functii Server Oracle,
sau identificatori care sunt in relatie. Developer/2000
Database Bloc PL/SQL asociat cu o tabela a bazei de date si care este Oracle Server
trigger lansat automat cand o instructiune DML este executata.
Application Bloc PL/SQL asociat cu un eveniment al aplicatie si care Developer/2000
trigger este lansat automat.

3
Folosirea variabilelor

Variabilele se folosesc pentru:


• Stocarea temporara a datelor
• Manipularea valorilor stocate
• Reutilizare
• Usurinta gestionarii

In PL/SQL se pot declara variabile si se pot folosi in instructiuni SQL si in sintaxe procedurale.

Manipularea variabilelor in PL/SQL

• Variabilele se declara si initializeaza in sectiunea de declarare


Se pot declara variabile in sectiunea declarativa a unui bloc PL/SQL, subprogram sau package.
Declaratiile aloca spatiu pentru valori, specifica tipul de date si numeste locatia de memorie astfel
incat sa poata fi referita. Declaratiile pot asigna o valoare initiala si constrangeri de tip NOT NULL.
• Se asigneaza valori noi variabilelor in sectiunea executabila
- Valorile existente ale variabilelor pot fi inlocuite cu altele noi.
- Referintele inainte nu sunt permise. O varibila trebuie declarata inainte de a fi referita.
• Se pot pasa valori blocurilor PL/SQL prin parametri
Sunt trei moduri de pasare a parametrilor: IN (predefinit), OUT si IN OUT. Se foloseste IN pentru
a pasa valori subprogramului apelat. Se foloseste OUT pentru a returna valori din subprogramul
apelat. Se foloseste IN OUT pentru a pasa valori initiale subprogramului apelat si a returna valoarea
actualizata din subprogram.
• Se pot vizualiza rezultatele prin variabilele de iesire
Se pot folosi variabilele pentru intrari si iesiri in instructiuni SQL de manipulari de date.

Tipuri de date

• Variabile PL/SQL
- Scalare (contin o singura valoare; corespund tipurilor de coloane din tabelele din baza
de date; PL/SQL suporta si variabile logice – Boolean)
- Compuse (inregistrari care permit gruparea campurilor impreuna)
- Referinta (pointeri, sunt explicati in ultimul laborator)
- LOB (obiecte largi) (specifica locatiile unor obiecte foarte mari – grafice sau imagine)
• Variabile non-PL/SQL
– variabile de legatura sau gazda

Toate variabilele PL/SQL au un tip de date care specifica formatul de stocare, constrangeri si
limitele valide pentru valori.
Tipuri de variabile
- TRUE este o valoare Boolean
- 25-OCT-99 reprezinta DATE
- o fotografie este de tipul BLOB
- un text este de tipul LONG RAW
- 245120.08 este de tip NUMBER cu precizie
- un video este de tip BFILE
- numele unui oras e de tipul VARCHAR2

4
Declararea variabilelor PL/SQL

Sintaxa

Identifier [CONSTANT] datatype [NOT NULL]


[ := | DEFAULT expr];

Exemple
Declare
V_hiredate DATE;
V_deptno NUMBER(2) NOT NULL := 10;
V_location VARCHAR2(13) := ‘Atlanta’;
C_comm CONSTANT NUMBER := 1400;

Identificatorii PL/SQL trebuie declarari inainte de a fi referiti. Exista optiunea de a asigna o


valoare initiala. Nu este obligatoriu sa asignezi o valoare initiala la declarare. Daca te referi la alte
variabile in declaratie acestea trebuie sa fi fost declarate anterior.
Identifier - numele variabilei
CONSTANT - valoarea variabilei nu poate fi schimbata; constantele trebuie initializate
Datatype - un tip de date scalar, compus, referinta sau LOB
NOT NULL - constrange variabila sa contina tot timpul valori; trebuie initializate
Expr - o expresie PL/SQL

Sfaturi
- Folositi conventiile de notare
- Initializati variabilele NOT NULL
- Initializati variabilele folosind operatorul (:=) sau folosind cuvantul cheie DEFAULT
- Declarati un identificator pe linie

Reguli de numire a variabilelor


- Doua variabile pot avea acelasi nume daca sunt in blocuri diferite
- Numele variabilei nu poate fi acelasi cu numele tabelei sau coloanei din tabela folosita in
acelasi bloc
Nota: Identificatorii nu pot fi mai mari de 30 caractere. Primul caracter trebuie sa fie o litera,
celelalte pot fi litere, numere sau simboluri speciale.

Asignarea de valori variabilelor

Sintaxa

Identifier := expr;

Exemple
V_hiredate := ‘31-DEC-99’;
V_ename := ‘John’

Unde : identifier - numele variabilei


expr - variabila, sir de carctere sau apel de functie, dar nu o coloana de tabel
Un alt mod de asignare a variabilelor este de selecta valori din tabele.
5
Exemplu:
SQL> SELECT sal * 0.10
INTO bonus
FROM emp
WHERE empno = 7369;
Nota: Pentru a asigna o valoare din baza de date unei variabile se folosesc instructiunile SELECT
si FETCH.

Tipuri de date scalare

Un tip de date scalar poate stoca o singura valoare si nu are componente interne. Tipurile de
date scalare pot fi clasificate in 4 categorii: numarice, caracter, data calendaristica si Boolean.
• VARCHAR2(maximum_length)
• NUMBER[(precision_scal)]
• DATE
• CHAR[(maximum_length)]
• LONG
• LONG_RAW
• BOOLEAN
• BINARY_INTEGER
• PLS_INTEGER

Tip de date Descriere


VARCHAR2 Tip sir de caractere de maxim 32767 octeti. Nu este marime predefinita pentru
(maximum_length) variabile si constante VARCHAR2
NUMBER Tip real pentru numere in virgula fixa sau mobila
[(precision_scale)]
DATE Tip data calendaristica. Limitele sunt 4712 I.C. si 9999 D.C.
CHAR Sir de caractere de lungime fixa de maxim 32767 octeti. Daca nu specificati
[(maximum_length)] maximum_length atunci valoarea predefinita este 1.
LONG Tip sir de caractere de lungime variabila pana la 32760 octeti. Latimea
maxima pentru coloane de tabele de tip LONG este de 2147483647 octeti.
LONG RAW Tip pentru date binare sau sir de caractere pana la 32760 octeti. LONG RAW
nu este interpretat de PL/SQL
BOOLEAN Tip de date logic care stocheaza 3 valori: TRUE, FALSE, NULL.
BINERY_INTEGER Tip de date pentru intregi intre –2147483647 si 2147483647
PLS_INTEGER Tip de date pentru intregi cu semn intre –2147483647 si 2147483647. Valorile
PLS_INTEGER cer spatiu de memorare mai mic decat cele de tip NUMBER
si BINARY_INTEGER.

Nota: Tipul de date LONG este similar cu VARCHAR2, cu exceptia faptului ca lungimea maxima
pentru LONG este 32 760.

Exemple
V_job VARCHAR2(9);
V_count BINARY_INTEGER := 0;
V_total_sal NUMBER(9,2) := 0;
V_orderdate DATE := SYSDATE + 7;
6
C_tax_rate CONSTANT NUMBER(3,2) := 8.25;
V_valid BOOLEAN NOT NULL := TRUE;

Atributul %TYPE

• Declara o variabila in acord cu:


- defintia unei coloane din baza de date
- o declarare anterioara de varibila
• Se prefixeaza cu %TYPE:
- o tabela sau coloana din baza de date
- numele unei variabile declarate anterior

Atunci cand se declara o variabila PL/SQL pentru a avea valori dintr-un camp al bazei de date
trebuie sa fim siguri ca tipul de date si precizia acesteia sunt corecte. Daca nu sunt corecte atunci va
apare o eroare la executie. Pentru a asigura acest deziderat se foloseste atributul %TYPE la declararea
variabilei. Acest atribut se foloseste atunci cand variabila va contine valori din baza de date. Atributul
prefixeaza numele tabelei sau coloanei din baza de date.
PL/SQL determina tipul de date si marimea variabilei atunci cand blocul este compilat, deci va
fi totdeauna compatibil cu tipul coloanei. Astfel daca tipul coloanei din baza de date se schimba nu sunt
necesare schimbari in codul aplicatiilor. De asemenea, atributul se poate folosi prin prefixarea unei
variabile declarate anterior.
Exemple

v_ename emp.ename%TYPE;
v_balance NUMBER(7,2);
v_min_balance v_balance%TYPE := 10;

Nota: O constrangere de coloana de tip NOT NULL nu se aplica variabilelor declarate prin
atributul %TYPE ce prefixeaza o coloana din baza de date definita ca NOT NULL. Variabila poate lua
valoare NULL.

Declararea variabilelor BOOLEAN

• Pot fi asignate valorile TRUE, FALSE si NULL variabilelor de acest tip


• Variabilele pot fi conectate prin operatori logici: AND, OR, NOT
• Expresii aritmetice, sir de caractere si date calendaristice pot fi folosite pentru a returna
valori logice

Exemple
V_sal1 := 5000;
V_sal2 := 6000;
Expresia: v_sal1<v_sal2 va intoarce TRUE.
Se pot declara si initializa variabile BOOLEAN:
V_comm_sal BOOLEAN := (v_sal1<v_sal2);

7
Tipuri de date compuse

• Tabele PL/SQL
• Inregistrari (Records) PL/SQL

Tipurile de date compuse (cunoscute ca si colectii) sunt TABLE, RECORD, Nested TABLE si
VARRAY. Se poate folosi tipul de date RECORD pentru a trata date inrudite ca un modul logic. Tipul
de date TABLE se foloseste pentru a referi si manipula colectii de date ca un singur obiect.

Tipuri de date LOB

Folosind tipul de date LOB (large object) Oracle8 poate stoca blocuri de date nestructurate (texte,
video, grafice, imagini, sunete) pana la 4Gb in marime.
• CLOB (character large object) permite stocarea blocurilor mari de caractere in baza de date
• BLOB (binary large objects) este folosit pentru stocarea obiectelor binare in baza de date
• BFILE (binary file) este folosit pentru stocarea fisierelor binare in sist de operare, in afara bazei
de date
• NCLOB (national language character large object) este folosit pentru stocarea blocurilor mari
de siruri de caractere in baza de date

Variabile de legatura

Variabila de legatura este variabila pe care o declari in mediul gazda, este folosita pentru a pasa
valori la executie in programe PL/SQL, si poate fi folosita ca orice alta variabila.
In mediul SQL*Plus pentru a declara o variabila de legatura se foloseste comanda VARIABLE.
Exemplu
VARIABLE return_code NUMBER

Atat SQL cat si mediul SQL*Plus poate referi variabila de legatura, iar SQL*Plus poate afisa
valoarea acesteia prin comanda PRINT.
Exemplu
SQL> VARIABLE n NUMBER

SQL> PRINT n

Referirea variabilelor Non-PL/SQL

Stocam salariul lunar intr-o variabila de legatura a mediului SQL*Plus


:g_monthly_sal := v_sal / 12;
• Referirea variabilelor non-PL/SQL ca variabile de mediu
• Se prefixeaza referinta cu (:)

Exemplu
:host_var1 := v_sal;
:global_var1 := ‘YES’;

8
Sintaxa blocurilor PL/SQL

Deoarece PL/SQL este o extensie SQL, regulile de sintaxa SQL se pot aplica si limbajului
PL/SQL. Unitatile lexicale (de exemplu identificatori sau valori) pot fi separate de unul sau mai multe
spatii sau de alti delimitatori care nu apartin unitatii lexicale. Nu pot fi incluse spatii in unitatile
lexicale exceptie facand constantele de tip sir de caractere sau comentariile. Declaratiile pot fi “taiate”
de linii, dar nu si cuvintele rezervate.

Delimitatori
Delimitatorii sunt simboluri simple sau compuse care au o semnificatie speciala pentru PL/SQL.

Simboluri simple Simboluri compse


simbol semnificatie simbol semnificatie
+ operator adunare <> operator relational
- operator scadere/negare != operator relational
* operator multiplicare || operator concaternare
/ operator divizare -- indicator comentariu linie
# operator relational /* inceput comentariu
@ indicator acces */ sfarsit comentariu
; indicator sfarsit := operator asignare
** operator putere

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.

Constantele
O constanta este un numar, caracter, sir de caractere sau valoare de tip boolean nereprezentata
de un identificator. Constantele de tip sir de caractere contin toate caracterele tiparibile din setul de
caractere PL/SQL: litere, numere, spatii si simboluri speciale. Constantele de tip caracter si data
trebuie sa fie incluse intre ghilimele simple(apostroafe). Constantele numerice pot fi o valoare simpla
(de exemplu, -32.5) sau o notatie stiitifica.

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 “*/”.

9
Exemplu:
DECLARE
v_sal NUMBER(9,2);
BEGIN
/* Calculeaza salarul anual bazat pe
salarul lunar al angajatului*/

v_sal:=v_sal * 12;
END; -- Sfarsitul tranzactiei

Functii SQL in PL/SQL


Majoritatea functiilor din SQL se regasesc si in PL/SQL:
y functii numerice
y functii siruri de caractere
y functii conversie data
y altele
Urmatoarele functii nu mai sunt disponibile:
y GREATEST, LEAST si DECODE.
y Functiile grup: AVG, MIN, MAX, COUNT, SUM, STDDEV si VARIANCE. Functiile grup
aplicate grupurilor de linii a unei baze de date pot fi folosite numai intr-o instructiune de tip SQL.

Functii PL/SQL

Exemple
yCompletarea unei liste cu adresele angajatilor:

v_mailing_address := v_name||CHR(10)||v_address ||CHR(10)||v_state||CHR(10)||v_zip;

yConvertirea in litere mici a numelor angajatilor


v_ename := LOWER(v_ename);

PL/SQL pune la dispozitie utilizatorilor multe functii puternice pentru manipularea datelor.
Acestea se pot grupa:
y de tip error-reporting
y de tip numeric
y de tip caracter
y de tip conversie
y de tip data
y altele

PL/SQL incearca sa converteasca dinamic tipurile de date daca intalneste intr-o atribuire tipuri
diferite. De exemplu, daca se atribuie o valoare numerica uneia de tip caracter, atunci PL/SQL automat
converteste numarul in tip caracter, pentru ca sa-l poata retina intr-o variabila caracter. La fel este
tratata si situatia inversa.
Analog, se poate asigna o variabila caracter uneia de tip data, precum si invers.
Intr-o expresie trebuie avut grija ca tipurile de date sa fie aceleasi. Daca totusi apar astfel de
situatii, trebuie folosite functiile de conversie corespunzatoare.

10
Sintaxa
TO_CHAR (value, fmt)
TO_DATE (value, fmt)
TO_NUMBER (value, fmt)

unde: value =este un sir de caractere, numar sau data, fmt =este un model de conversie.

Aceasta linie de cod va da o eroare de compilare


v_comment := USER||’: ‘||SYSDATE;
Pentru a corecta aceasta eroare, se foloseste functia TO_CHAR
v_comment := USER||’: ‘||TO_CHAR(SYSDATE);

Conversii de tipuri de date


Conversiile date ca exemplu mai sus se definesc astfel:
yse atribuie variabilei v_comment o valoare ce este compusa din numele utilizatorului si
data curenta.
Aceasta atribuire va cauza o eroare de sintax:.
ypentru a corecta aceasta eroare, se converteste SYSDATE la un sir de caractere cu
ajutorul functiei TO_CHAR.

Blocuri incluse si domeniul de valabilitate al variabilelor


yO secventa de cod poate fi inclusa oriunde o secventa de cod executabila este permisa.
yUn bloc inclus devine o secventa de cod.
yO sectiune exception poate include blocuri.
yAria de valabilitate a unui obiect este regiunea de program care poate referi acel obiect.

Aria de valabilitate a variabilelor


Aria de valabilitate a unui obiect este regiunea de program care poate referi acel obiect. Se pot
referi variabilele declarate in cadrul sectiunilor executabile.
Domeniul de vizibilitate a unui identificator in cadrul unui bloc se stabileste dupa urmatoarele
reguli:
y un identificator declarat intr-un bloc inclus nu este vizibil in exteriorul acelui bloc
yun identificator declarat in interiorul unui bloc este vizibil in orice bloc inclus

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.

11
Blocuri incluse si domeniul de valabilitate al variabilelor

Exemplu
...
x BINARY_INTEGER;
BEGIN Zona de actiune a variabilei x
...
DECLARE
y NUMBER;
BEGIN Zona de actiune a variabilei 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 imbricate, nu si in afara acestora.

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.

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 Ridicarea la putere, negare logica
=,- identitate,negare
*,/ inmultire,impartire
+,-,|| adunare,scadere,concatenare
a,!a,<,>,<a,>a, ISNULL, LIKE, comparare
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.

12
Operatori in PL/SQL

Exemple
yIncrementarea unui index pentru o bucla:
v_count := v_count+1;

ySetarea valorii unui flag logic:


v_equal := (v_n1 AND v_n2);

yVerifica daca o variabila este nula:


v_valid := (v_empno IS NOT NULL);

Operatori in PL/SQL

Lucrand cu valori nule, se pot evita cateva greseli comune respectand urmatoarele reguli:
y Compararea cu valori nule are intotdeauna rezultatul NULL;
y Aplicarea operatorului NOT unei valori nule are ca rezultat NULL;
y In cadrul instructiunilor de test daca o conditie este NULL, secventa asociata respectivei instructiuni
nu se executa;

Reguli de respectat in programare

Faceti codul mai usor de inteles prin:


y Documentarea codului cu comentarii
y Stabilirea unor conventii case (litere mari si mici) pentru cod
y Stabilirea unor conventii de denumire a identificatorilor si celorlalte obiecte
y Alinierea liniilor de cod

Conventii de codare

Urmatorul tabel da reguli pentru scrierea codului cu caractere mari sau mici pentru a ajuta la
distingerea cuvintelor cheie de celelalte obiecte.

Categorie Case Convention Exemple


Blocuri SQL Uppercase SELECT,INSERT
Cuvinte cheie PL/SQL Uppercase DECLARE,BEGIN,IF
Tipuri de date Uppercase VARCHAR2,
BOOLEAN
Identificatori si Lowercase v_sal,emp_cursor,
variabile g_sal,p_empno
Baze de date si coloane Lowercase emp,orderdate,
deptno

13
Pentru a se evita ambiguitatile de notare:
y Denumirile variabilelor locale si a parametrilor formali sunt prioritare numelor tabelelor.
y Denumirile coloanelor sunt prioritare variabilelor locale.

Conventii de notare
Tabelul urmator prezinta un sir de prefixe si sufixe utile pentru deosebirea identificatorilor intre ei:

Identificator Conventie de notare Exemplu


Variabila v_name v_sal
Constanta c_name c_company_name
Cursor name_cursor emp_cursor
Exceptie e_name e_too_many
Tip baza de date name_table_type amount_table_type
Baza de date name_table order_total_table
Tip inregistrare name_recor_type emp_record_type
Inregistrare name_record customer_record
SQL*Plus parametru p_name p_sal
substitutie
SQL*Plus variabila globala g_name g_year_sal

Alinierea codului

Pentru claritate, este indicata alinierea fiecarui nivel de cod.


Exemplu:

DECLARE
v_deptno NUMBER(2);
BEGIN v_location VARCHAR2(13);
IF x=0 THEN BEGIN
y=1; SELECT deptno,
END IF; location
END; INTO v_deptno,
v_location
FROM dept
WHERE dname = ’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;

14
IF x > y THEN
max := x;
ELSE
max := y;
END IF;

REZUMAT

• Blocurile PL/SQL sunt alcatuite din urmatoarele sectiuni:


- Declarativa (optionala)
- Executabila (obligatorie)
- Tratarea exceptiilor (optionala)
• Un bloc PL/SQL poate fi un bloc anonim, o procedura sau o functie
• Identificatorii PL/SQL:
- sunt definit in sectiunea declarativa
- pot fi de tip scalar, compus, referinta sau LOB
- pot fi bazati pe structura altor variabile sau a obiectelor din baza de date
- pot fi initializati
• Structura blocurilor PL/SQL:
-blocuri incluse si domenii de vizibilitate
• Programarea PL/SQL:
-functii
-conversii de tipuri de date
-operatori
• Conventii de codare

Aplicatii practice - prima parte

1. Evaluati fiecare din urmatoarele declaratii. Determinati care nu sunt corecte si explicati de ce :
a. DECLARE
V_id NUMBER(4);
b. DECLARE
V_x, v_y, v_z VARCHAR2(10);
c. DECLARE
V_birthdate DATE NOT NULL;
d. DECLARE
V_in_stock BOOLEAN := 1;
e. DECLARE
TYPE name_table_type IS TABLE OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
Dept_name_table name_table_type;

2. Determinati tipul de date pentru rezultatele expresiilor urmatoare:


a. v_days_to_go := v_due_date – SYSDATE;
b. v_sender := USER || ‘: ‘ || TO_CHAR(v_dept_no);
c. v_sum := $100,000 + $250,000;

15
d. v_flag := TRUE;
e. v_n1 := v_n2 > (2 * v_n3);
f. v_value := NULL;

3. Creati un bloc anonim si afisati urmatoarea fraza pe ecran: “My PL/SQL Block Works”.

4. Creati un bloc si declarati 2 variabile. Asignati valorile acestor variabile PL/SQL unor variabile de
legatura SQL*Plus si afisati-le pe ecran. Executati blocul PL/SQL si salvati-l intr-un fisier.

5.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 VARCHAR2(255) := ’Product 11001’;
v_new_locn VARCHAR2(50) := ’Europe’;
BEGIN
v_weight := v_weight+1;
v_new_locn := ’Western ‘||v_new_locn;
END;

v_weight := v_weight+1;
v_message := v_message||’ is in stock’;
v_new_locn := ’Western ‘||v_new_locn;

END;

Analizati acest bloc si determinati urmatoarele valori:


a. valoarea v_weight in sub-bloc
b. valoarea v_new_locn in sub-bloc
c. valoarea v_weight in blocul principal
d. valoarea v_message in blocul principal
e. valoarea v_new_locn in blocul principal

16
6.Domenii de vizibilitate

DECLARE
v_customer VARCHAR2(50) := ’Womansport’;
v_credit_rating VARCHAR(50) := ’EXCELLENT’;
BEGIN

DECLARE
v_customer NUMBER(7) := 201;
v_name VARCHAR2(25) := ’Unisports’;
BEGIN

v_customer v_name v_credit_rating


END;

v_customer v_name v_credit_rating

END;

Fie structura de mai sus. Variabilele v_customer si v_credit_rating sunt declarate in blocul
principal, iar v_name si o alta variabila v_customer in sub-bloc. Determinati:

a.valoarea v_customer in subbloc este:


b.valoarea v_name in subbloc este:
c.vaoarea v_credit_rating in subbloc este:
d.valoarea v_customer in blocul principal este:
e.valoarea v_name in blocul principal este:
f.valoarea v_credit_rating in blocul principal este:

7.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 de al doilea
numar. Rezultatul trebuie scris intr-o variabila PL/SQL si afisat pe ecran.

Please enter the first number: 2


Please enter the second number: 4

PL/SQL procedure successfully completed.

V_RESULT
--------
4.5

17
8.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).

Please enter the salary amount: 50000


Please enter the bonus percentage: 10

PL/SQL procedure successfully completed.

G_TOTAL
-------
55000

18
Interactiunea cu Serverul Oracle

Obiective

Dupa completarea acestei lectii, veti putea realiza urmatoarele:

• Scrierea unei sintaxe SELECT corecte


• Declararea dinamica a tipului datei si dimensiunii a unei variabile în
PL/SQL
• Scrierea unei sintaxe DML în PL/SQL
• Controlarea tranzactiilor în PL/SQL
• Determinarea efectului sintaxelor SQL DML

Scopul lectiei

În aceasta lectie, veti învata sa corelati sintaxe SQL ca SELECT, INSERT, UPDATE si
DELETE în blocuri PL/SQL.

Sintaxe SQL în PL/SQL

• Extragerea unei linii de date din baza de date folosind comanda SELECT. Doar
un singur set de valori pot fi returnate.

• Modificarea liniilor din baza de date folosind comenzi DML

• Controlarea unei tranzactii cu ajutorul comenzilor COMMIT, ROLLBACK sau


SAVEPOINT.

• Determinarea efectului DML cu cursoare implicite.

Când este necesara extragerea de informatii din sau efectuarea de modificari


asupra bazelor de date, trebuie folosit SQL. PL/SQL suporta limbajul de manipulare de
date si comenzile de control ale tranzactiilor din SQL. Se pot folosi sintaxe SELECT
pentru a da variabilelor valori specificate într-o linie dintr-un tabel. Comenzile DML pot
procesa linii multiple.

19
Compararea tipurilor de sintaxa în SQL si PL/SQL

9 Un bloc PL/SQL nu este o unitate de tranzactie. COMMIT, SAVEPOINT si


ROLLBACK-urile sunt independente de blocuri dar se pot intercala in interiorul unui
block.

9 PL/SQL nu suporta limbaj de definitie de date (DDL), cum ar fi: CREATE TABLE,
ALETR TABLE sau DROP TABLE.

9 PL/SQL nu suporta limbaj de control de date (DCL), cum ar fi: GRANT sau
REVOKE.

Sintaxe SELECT în PL/SQL

Returnarea datei din baza de date cu SELSCT

Syntaxa:

SELECT select_list
INTO {variable_name,[, variable_name]... | record_name}
FROM table
WHERE condition;

Returnarea datelor folosind PL/SQL

Folosirea sintaxie SELECT pentru returnarea datei din baza de date:

În sintaxa,
select_list o lista de cel putin o coloana, si poate include expresii
SQL, functii linie sau functii grup.
variable_name este variabila scalara în care se pastreaza valoarea
returnata.
record_name este RECORD-ul PL/SQL în care se pastreaza valorile
returnate.
table specifica numele de tabelului bazei de date.
condition este compusa din nume de coloane, expresii, constante si
operatori de comparatie, incluzând variabile si constante
PL/SQL.

Observatie: Trebuie profitat de întraga gama a sintaxei Oracle Server pentru SELECT.

20
Sintaxe SELECT în PL/SQL

Clauza INTO este necesara

Exemplu:

DECLARE
V_deptno NUMBER(2);
V_LOC VARCHAR(15);
BEGIN
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept
WHERE dname = ‘SALES’;
...
END;

Clauza INTO

Clauza INTO este obligatorie si apare între clauzele SELECT si FROM. Este folosita
pentru a specifica numele variabilelor care retin valorile pe care SQL le returneaza din
clauza SELECT. Trebuie data o variabila pentru fiecare obiect selectat, si ordinea lor
trebuie sa corespunda cu cea a obiectelor selectate.

Se foloseste clauza INTO pentru a da valori si variabilelor PL/SQL si variabilelor host.

Interogarile trebuie sa returneze o linie si numai una !!!

Atentie: PL/SQL rezolva aceste erori ridicand exceptiile standard, care se pot
gestiona în sectiunea de exceptii a blocului cu exceptiile
NO_DATA_FOUND si TOO_MANY_ROWS (gestionarea exceptiilor
este tratata într-o lectie ulterioara).

21
Returnarea datelor în PL/SQL

Returnarea datei order si datei ship pentru ordinea specificata.

Exemplu:

DECLARE
V_orderdate order.orderdate%TYPE;
V_shipdate order.shipdate%TYPE;
BEGIN
SELECT orderdate, shipdate
INTO v_orderdate,v_shipdate
FROM order
WHERE id = 157;
...
END;

Algoritm:
• Se termina fiecare sintaxa SQL cu o semicoloana (;).
• Clauza INTO este necesara pentru sintaxa SELECT când este inclusa în PL/SQL.
• Clauza WHERE este optionala si poate fi folosita pentru a specifica
variabilele,constantele,comentariile sau expresiile PL/SQL de intrare.
• Se specifica acelasi numar de variabile de iesire în clauza INTO ca cel de coloane de
date din clauza select. Trebuie asigurata corespondenta pozitionala si compatibilitatea
tipurilor de date.
Returnarea datelor în PL/SQL

Returnarea sumei salariilor pentru toti angajatii în departamentul specificat

Exemplu:

DECLARE
V_sum_sal emp.sal%TYPE;
V_deptno NUMBER NOT NULL := 10;
BEGIN
SELECT SUM(sal)
INTO v_sum_sal
FROM emp
WHERE deptno = v_deptno;
END;

22
Algoritm(continuare)
• Pentru a ne asigura ca tipurile de date ale identificatorilor se potrivesc cu tipurile de
date ale coloanelor se foloseste atributul %TYPE. Tipul de date si numarul de
variabile din clauza INTO se potrivesc celor din lista SELECT.

• Se folosesc functii de grupare, ca SUM, într-o sintaxa SQL, deoarece functiile de


grupare se aplica grupurilor de linii într-un tabel.

Nota: functiile de grupare nu pot fi folosite in sintaxa PL/SQL, ele sunt folosite în
sintaxe SQL în interiorul unui bloc PL/SQL.

Manipularea datelor folosind PL/SQL

Modificarea bazezor de date folosind comenzi DM:

• INSERT

• UPDATE

• DELETE

Manipularea datelor folosind PL/SQL

Manipularea datelor în baze de date se realizeaza folosind comenzi DML. Se pot folosi
comenzi DML ca: INSERT, UPDATE si DELETE în PL/SQL. Incluzând sintaxele
COMMIT sau ROLLBACK în codul PL/SQL, blocarile liniilor (si blocarile tabelelor)
sunt deblocate.

• INSERT adauga linii de date noi în tabel.

• UPDATE modifica liniile existente în tabel.

• DELETE sterge liniile nedorite în tabel.

23
Inserarea datelor

Adaugarea de noi angajati în tabela emp.

Exemplu:

DECLARE
V_empno emo.empno%TYPE;
BEGIN
SELECT empno_sequence.NEXTVAL
INTO v_empno
FROM dual;
INSERT INTO emp(empno, ename, job, deptno)
VALUES(v_empno, ‘HARDING’, ‘CLERC’, 10);
END;

Inserarea datelor

• Folosind functii SQL, cum ar fi USER si SYSDATE.

• Generarea valorilor cheie primare folosind secvente de baze de date.

• Derivarea valorilor în blocul PL/SQL.

• Adaugarea valorilor de pe coloana.

Nota: Nu exista nici o posibilitate de ambiguitate intre identificatori si cu numele de


coloana în sintaxa INSERT. Orice identificator din clauza INSERT trebuie sa fie
un nume de coloana din tabela.

24
Actualizarea

Marirea salariilor tuturor salariatilor din tabela emp care sunt Analisti.

Exemplu:

DECLARE
V_sal_increse emp.sal%TYPE := 2000;
BEGIN
UPDATE
SET sal = sal +v_sal_increase
WHERE job = ‘ANALYST’;
END;

Actualizarea si stergrea datelor

Poate exista ambiguitate în clauza SET din sintaxa UPDATE deoarece desi
identificatorul din stânga operatorului de alocare este întotdeauna o coloana din baza de
date, identificatorul din dreapta poate fi fie o coloana din baza de date fie o variabila
PL/SQL.
De retinut este faptul ca clauza WHERE este folosita pentru a determina care linie
afectata. Daca nici o linie nu este modificata, nu apare nici o eroare, spre deosebire de
SELECT în PL/SQL.
Nota: Atribuirile de variabile în PL/SQL folosesc întotdeauna „:=” iar atriburiile de
coloane folosesc întotdeauna „=”. De retinut este faptul ca daca numele coloanelor si
numele identificatorilor sunt identice în clauza WHERE, serverul Oracle cauta dupa
nume, mai întâi, în baza de date.

Stergera datelor

Stergerea liniilor care apartin departamentului 10 din tabela emp

Exemplu:

DECLARE
V_deptno emp.deptno%TYPE := 10;
BEGIN
DELETE FROM emp
WHERE deptno = v_deptno;
END;

25
Stergera datelor

Stergera unei comenzi specificate:

DECLARE
v_ordid emp.ordid%TYPE := 605;
BEGIN
DELETE FROM item
WHERE ordid = v_ordid;
END;

Conventii de numire

• Folosirea unei conventii de numire pentru a evita ambiguitatea în clauza


WHERE

• Coloanele si identificatorii trebuie sa aiba nume distincte

• Erorile de sintaxa pot aparea deoarece PL/SQL verifica mai întâi baza de date
pentru o coloana în tabela

Ambiguitatea din clauza WHERE este evitata aderând la o conventie de numire care
diferentiaza numele coloanelor din baza de date de numele variabilelor PL/SQL.

Exemplu:

Returnarea datei comenzii si datei de onorare a comenzii din tabela ord unde data de
onorare este astazi. Acest exemplu creste o exceptie necontrolata a timpului de executie.

26
DECLARE
order_date ord.orderdate%TYPE;
ship_date ord.shipdate%TYPE;
v_date DATE := SYSDATE;
BEGIN
SELECT orderdate, shipdate
INTO order_date, ship_date
FROM ord
WHERE shipdate = v_date; --unhandled exception:
NO_DATA_FOUND

END;
SQL >/

DECLARE
*
ERROR at line 1;
ORA-01403: no data found
ORA-06512: at line 6

Conventii de numire

DECLARE
order_date ord.orderdate%TYPE;
ship_date ord.shipdate%TYPE;
v_date DATE := SYSDATE;
BEGIN
SELECT orderdate, shipdate
INTO order_date, ship_date
FROM order
WHERE shipdate = v_date
END;
SQL >/

DECLARE
*
ERROR at line 1;
ORA-01403: no data found
ORA-06512: at line 6

27
Conventii de numire

Evitarea ambiguitatii în clauza WHERE se face prin aderarea la o conventie de numire


care diferentiaza numele coloanelor din baza de date de numele variabilelor PL/SQL.

• Identificatorii si coloanele bazelor de date trebuie sa aiba nume distincte.

• Pot apare erori de sintaxa deoarece PL/SQL verifica mai întâi baza de date pentru o
coloana din tabela.

Exemplul de mai sus este definit dupa cum urmeaza: returneaza data comenzii si data de
onorare a comenzii din tabela order unde data de onorare este astazi. Acest exemplu
ridica o exceptie.

Atentie: PL/SQL verifica daca un identificator este o coloana în baza da date; daca
nu, este catalogat ca fiind un identificator PL/SQL.

Nota: Nu exista nici o posibilitate de ambiguitate în clauza SELECT deoarece


orice identificator din clauza SELECT trebuie sa fie un nume de coloana
din baza de date. Nu exista nici o posibilitate de ambiguitate în clauza
INTO deoarece orice identificator din clauza INTO trebuie sa fie o
variabila PL/SQL. Doar în cadrul clauzei WHERE exista posibilitatea
confuzei.

Sintaxele COMMIT si ROLLBACK

• Initierea unei trnzactii cu prima comanda DML pentru a urmari un COMMIT


sau un ROLLBACK.

• Folosirea sintaxelor SQL: COMMIT si ROLLBACK pentru a termina


explicitarea unei tranzactii

Tranzactii controlate

Se poate controla logica unei tranzactii cu sintaxe COMMIT si ROLLBACK, mentinând


permanente câteva grupuri de schimbari în baza de date în timp ce se renunta la altele. În
cazul serverului Oracle, tranzactiile DML pornesc la prima comanda de dupa un
COMMIT sau ROLLBACK si se termina la urmatorul COMIT sau ROLLBACK reusit.
Aceste actiuni pot apare în interiorul unui bloc PL/SQL sau ca rezultat a unor evenimente
în mediul gazda (de exemplu, închiderea a unei sesiuni SQL*Plus automat duce la
realizarea tranzactiei dinainte).

28
Sintaxa COMMIT

COMMIT termina tranzactia curenta facând permanente toate schimbarile dinainte din
baza de date.

Sintaxa:

COMMIT [WORK];

ROLLBACK [WORK];

unde: WORK este în conformitate cu standardele ANSI.

Nota: Comenzile de control ale tranzactiei sunt toate valide în PL/SQL, desi
mediul gazda poate pune unele restrictii asupra folosirii lor.

Cursorul SQL

• Un cursor este o arie de lucru SQL privata

• Exista doua tipurin de cursor:

9 Cursoare implicite
9 Cursoare explicite

• Serverul Oracle foloseste cursoare implicite pentru a analiza si executa sintaxele


SQL.

• Cursoarele explicite sunt explicit declarate de catre programator.

Cursorul SQL

Când se executa o sintaxa SQL, serverul Oracle deschide o arie de memorie în fiecare
comanda care este analizata si executata. Aceasta arie se numeste cursor.

29
Când partea executabila a unui bloc lanseaza o sintaxa SQL, PL/SQL creaza un cursor
implicit. PL/SQL manevreza acest cursor automat. Un cursor explicit este explicit
declarat de catre programator. Exista patru atribute disponibile în PL/SQL care pot fi
aplicate cursoarelor.
Nota: Mai multe informatii asupra cursoarelor explicite sunt cuprinse într-o
lectie viitoare.
Bibliografie: Pentru mai multe informatii, vezi PL/SQL User’s Guide and Reference,
https://docs.oracle.com/cd/B19306_01/appdev.102/b14261.pdf

Atributele cursoarelor SQL

Folosind atributele cursoarelor SQL, se poate testa rezultatele sintaxelor SQL.

SQL%ROWCOUNT Numarul de linii afectate de cea mai recenta sintaxa SQL


(o valoare întreaga).

SQL%FOUND Atributul boolean care este TRUE daca cea mai recenta
sintaxa SQL afecteaza una sau mai multe linii.

SQL%NOT FOUND Atributul boolean care este TRUE daca cea mai recenta
sintaxa SQL nu afecteaza nici o linie.

SQL%ISOPEN Este întotdeauna FALSE deoarece PL/SQL închide automat


cursoarele implicite imediat dupa ce sunt executate.

Atributele cursorului SQL


Se pot folosi atributele: SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND si
SQL%ISOPEN în sectiunea de exceptii a unui bloc pentru a aduna informatii despre
executia unei sintaxe de manipulare de date. PL/SQL nu considera ca o sintaxa DML care
nu afecteaza nici o linie ca a esuat, spre deosebire de sintaxa SELECT, care ridica o
exceptie.

30
Atributele cursoarelor SQL

Stergerea liniilor care au numarul de ordine specificat în tabela ITEM. Afisarea


numarului de linii sterse.

Exemplu:

VARIABLE rows_deleted NUMBER

DECLARE
V_ordin NUMBER := 605;
BEGIN
DELETE FROM item
WHERE ordin = v_ordin;
:rows_deleted := SQL%ROWCOUNT;
END;
PRINT rows_deleted

Sumar

• Încadrarea SQL în blocuri PL/SQL:


- SELECT, INSERT, UPDATE, DELETE.

• Încadrarea sintaxelor de control a tranzactiilor într-un bloc PL/SQL:


- COMMIT, ROLLBACK, SAVEPOINT

Sumar

• Exista doua tipuri de cursor: implicit si explicit.

• Atributele cursoarelor implicite verifica realizarea sintaxelor DML:


9 SQL%ROWCOUNT
9 SQL%FOUND
9 SQL%NOTFOUND
9 SQL%ISOPEN

• Cursoarele explicite sunt definite de catre programator.

31
Aplicatii practice - partea a II-a

1. Creati un bloc PL/SQL care sa selecteze numarul maxim al departamentului din


tabela DEPT si stocarea într-o variabila SQL*plus. Afisati rezultatul pe ecran. Salvati
blocul PL/SQL într-un fisier numit p1.sql.

2. Creati un bloc PL/SQL care sa insereze un nou departament în tabela DEPT. Salvati
blocul PL/SQL într-un fisier numit p2.sql.
a) Folositi numarul departamentului returnat la punctul 1) si adunati 10 la acest
numar ca fiind numarul departamentului pentru noul departament.
b) Folositi un parametru pentru numele departamentului.
c) Lasati locatia nula deocamdata.
d) Executati blocul PL/SQL.
e) Afisati noul departament creat.

3. Creati un bloc PL/SQL care sa actualizeze locatia pentru un departament existent.


Salvati blocul PL/SQL într-un fisier numit p3.sql.
a) Folositi un parametru pentru numarul departamentului.
b) Folositi un parametru pentru locatia departamentului.
c) Testati blocul PL/SQL.
d) Afisati numarul departamentului, numele departamentului si locatia pentru
departamentul updatatat.
e) Afisati departamentul actualizat.

4. Creati un bloc PL/SQL care sa stearga departamentul creat în exercitiul 2. Salvati


blocul PL/SQL într-un fisier numit p4.sql.
a) Folosisi un parametru pentru numarul departamentului.
b) Afisati pe ecran numarul liniilor afectate.
c) Testati blocul PL/SQL.
d) Ce se întâmpla daca introduceti un numar de departament care nu exista?
e) Verificati daca departamentul a fost sters.

32

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