Documente Academic
Documente Profesional
Documente Cultură
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.
• DECLARE - Optional
- Variabile, cursori, exceptii utilizators
• BEGIN - Obligatoriu
- Instructiuni SQL
- Instructiuni PL/SQL
• EXCEPTION - Optional
- Actini care trebuie executate cand apar erori
• END - Obligatoriu
Exemplu
DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT column_name
INTO v_variable
FROM table_name;
EXCEPTION
WHEN exception_name THEN
…
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.
3
Folosirea variabilelor
In PL/SQL se pot declara variabile si se pot folosi in instructiuni SQL si in sintaxe procedurale.
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
Exemple
Declare
V_hiredate DATE;
V_deptno NUMBER(2) NOT NULL := 10;
V_location VARCHAR2(13) := ‘Atlanta’;
C_comm CONSTANT NUMBER := 1400;
Sfaturi
- Folositi conventiile de notare
- Initializati variabilele NOT NULL
- Initializati variabilele folosind operatorul (:=) sau folosind cuvantul cheie DEFAULT
- Declarati un identificator pe linie
Sintaxa
Identifier := expr;
Exemple
V_hiredate := ‘31-DEC-99’;
V_ename := ‘John’
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
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
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.
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.
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
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.
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 PL/SQL
Exemple
yCompletarea unei liste cu adresele angajatilor:
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.
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;
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;
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.
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:
Alinierea codului
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:
14
IF x > y THEN
max := x;
ELSE
max := y;
END IF;
REZUMAT
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;
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;
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
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:
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.
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).
G_TOTAL
-------
55000
18
Interactiunea cu Serverul Oracle
Obiective
Scopul lectiei
În aceasta lectie, veti învata sa corelati sintaxe SQL ca SELECT, INSERT, UPDATE si
DELETE în blocuri PL/SQL.
• Extragerea unei linii de date din baza de date folosind comanda SELECT. Doar
un singur set de valori pot fi returnate.
19
Compararea tipurilor de sintaxa în SQL si PL/SQL
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.
Syntaxa:
SELECT select_list
INTO {variable_name,[, variable_name]... | record_name}
FROM table
WHERE condition;
Î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
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.
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
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
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.
Nota: functiile de grupare nu pot fi folosite in sintaxa PL/SQL, ele sunt folosite în
sintaxe SQL în interiorul unui bloc PL/SQL.
• INSERT
• UPDATE
• DELETE
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.
23
Inserarea datelor
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
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;
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
Exemplu:
DECLARE
V_deptno emp.deptno%TYPE := 10;
BEGIN
DELETE FROM emp
WHERE deptno = v_deptno;
END;
25
Stergera datelor
DECLARE
v_ordid emp.ordid%TYPE := 605;
BEGIN
DELETE FROM item
WHERE ordid = v_ordid;
END;
Conventii de numire
• 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
• 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.
Tranzactii controlate
28
Sintaxa COMMIT
COMMIT termina tranzactia curenta facând permanente toate schimbarile dinainte din
baza de date.
Sintaxa:
COMMIT [WORK];
ROLLBACK [WORK];
Nota: Comenzile de control ale tranzactiei sunt toate valide în PL/SQL, desi
mediul gazda poate pune unele restrictii asupra folosirii lor.
Cursorul SQL
9 Cursoare implicite
9 Cursoare explicite
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
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.
30
Atributele cursoarelor SQL
Exemplu:
DECLARE
V_ordin NUMBER := 605;
BEGIN
DELETE FROM item
WHERE ordin = v_ordin;
:rows_deleted := SQL%ROWCOUNT;
END;
PRINT rows_deleted
Sumar
Sumar
31
Aplicatii practice - partea a II-a
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.
32