You are on page 1of 81
1 3 Adela BARA luliana BOTHA Vlad DIACONITA lon LUNGU Anda VELICANU BAZE DE DATE LIMBAJUL PL/SQL INTRODUCERE IN PL/SQL (PROCEDURAL LANGUAGE EXTENSION TO SQL) Ll Introducere PL/SQL este un limbaj procedural structurat pe bloc, programele putand fi impartite in blocuri logice, construcfiile PL/SQL conjindnd structuri de control procedurale si comenzi descriptive SQL. Blocurile PL/SQL sunt procesate de moterul 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 modularizati, in acest sens se utilizeazi blocurile care grupeaza instruetiunile. Tipurile de date din SQL pot fi folosite in PL/SQL. Pentru a putea luera cu limbajul PL/SQL avem nevoie in primul rind de o ‘conexiune la o baz’ de date Oracle si de un instrument de dezvoltare prin care 33, intcractionim cu serverul Oracle. Pentru instalarea si configurarea instante bazei de da date se poate utiliza ghidul electronic pus La dispozijie de cditre compania Oracle odatd cu kit-ul de instalare. Ca instrument de dezvoliare se poate utiliza SQL*plus care se instaleazd impreunii cu instanta Oracle sau se poate utiliza SQL Developer, un mediu de desvoltare mai prietenos disponibil gratuit pe site-ul companici Oracle (www. oracle .com). Schema bazei de date pe care se bazeazi exemplele din aceast carte se poate vedea in figura 1. Scriptul pentru crearea acestr tabele este redal in Anexa 1 si se poate desclirea de pe siteul heep://bd,ase.ro impreuni cu seriptul peniru adaugarea inregistririlor. Baze de date, Limbajul PLISQL. Figura 1-Schema bazei de date utilizati in exemple . Introducere in PLISQL (Procedural Language Extension ta SQL) 4 L2 Blocuri PL/SQL Orice unitate PL/SQL contine unul sau mai multe blocuri, complet separate sau imbricate. Ficeare bloc este compus din sectiuni care pot fi obligatorii sau optionale. ‘Componentele unui bloc PL/SQL Un Bloc PL/SQL este compus din pind la 3. sectiuni: declaratind fopfionald), executabilé fobligatorie) si de tratwre a excepfiilor (oppionala). Siructura unui bloc PL/SQL peate fi prezentaté astfel: DECLARE (Opsional) variabile, cursori, exceptii BEGIN (Obligatorin) comenzi SOL (asigura accesul Ix baza de date) structuri de programare procedurali PLSQL EXCEPTION (Oprional) actiuni ce se executi ciind apare 0 croare END; (Obligatoriu) {in cadrul blocului pot aplirea instructiuni SQL care asigur’ accesul la baza de date, de exemplu pentru efectuarea unor actualiziri, dar operajiile efectuate cu variabilele PL/SQL in cadrul instructiunilor procedurale nu presupun accesarea bazei de date. Observagii: + se foloscste (;) dupa fiecare instruetiune SQL sau instructiune de control PL/SQL; * blocul PL/SQL se termina cu (3); * comentariile se pot realiza folosind (--) pentru fiecare linie de cod comentati sau (/* */) pentru mai multe linii eomentate: + se foloseste (/) pentru a lansa un bloc anonim in bufferul SQL: * _ instructiunile nu sunt CASE SENSITIVE, Blocurile PL/SQL pot fi executate o singurd dati (cazul blocurilor anionime), pot fi stocate in baza de date pentna a fi apelate ulterior (cazul funcziitor, procedurilor si pachetelor stocate) sau pot fi realizate $i apelate la nivelul programelor de aplicajii (funetii, proceduri, triggeri de aplicatii). in paragrafele Urmvitoare ne vom referi pe scuri la fiecare dintre aceste tipuri de blocuri, urmind 84 le delalicm in capitole separate. ___Baze de date, Limbajal PL/SQL Blocurile anonime prezinté urmatoarele caracteristici: * nu sunt stocate in baza de date: + sedeclari infine, in locul in care se doreste exceutia lor; * se executi in momentul nulirii; Dac& dorifi si reutilizaji un bloc anonim va sfituim si salvapi codul sursd pe hard disk intr-un fisier de tip .sql sau txt. La modu generat tn bloc PL/SQL anonim poate avea wrmitaaree formi: pentru etichet, DECLARE ~ declararea variabilelor se face precizind eventualele initializaini; -- de exemplu: v_variabila tip_ de_date; BEGIN - instructiuni executabile; EXCEPTION WHEN exceptic THEN actiune; END; i I de date $i realizindu-se Blocurile PL/SQL se pot imbrica gi se pot eticheta cu ‘<> 4 putea fi ulterior accesute variabilele, adresare lor find realizaté astfel: a_bloc.variabila, DECLARE BEGIN =< elicheta_bloe >> DECLARE BEGIN END eticheta_bloc; Introducere in PL/SQL (Procedural Language Extension to SQL) 13 Proceduri si funetii Sunt blocuri PL/SQL care au nume gi pot fii stocate la nivelul bazei de date sau la nivel de aplicatic (de exemplu in mediul de dezvoltare Oracle Developer Suite— Forms i Reports), in cazul proceduritor si functiilor secjiunea DECLARE este inlocuith de dcfinitia acesteia prin sintaxa CREATE [or replace) PROCEDURE/FUNCTION (liste parametrilor 3 tipat! acestora), de exemplu: CREATE [OR REPLACE] PROCEDURE ume _procedura (lista parametri) IS CREATE [OR REPLACE] FUNCTION nume_functie (lista parametri) RETURN tip_data Is BEGIN Pachetele de subprograme sum utilizate pentru a gmupa mai multe Proceduri gi functii ulilizate pentru un anumit tip de prelucrari. Declangatorii pe baza de date sunt blocuri PL/SQL asociate tabelelor (de ‘baz& sau virtuale) si lansate automat in execufie cind are loc o comanda de ‘manipulare (insert/update‘delete). Baze de date, Limbajul PLISOL Declangatorii de aplicayie sunt blocuri PL/SQL asociate unor evenimente din cadrul aplicatie’ (de cxemplu: deplasarea mouse-ului, apdsarea unui buton) i lansate fn executie automat la aparitia acestor cvenimente, 1.3 Utilizarea operatorilor gi functiilor in PL/SQL, Operatorit utilizagt In cadrul blocuritor PL/SQL se pot utiliza aceiasi operatori ca gi tn cazul imbajului SQL. In plus fata de acestia apare operatonal de ateibuire (:=), ‘Operator Caracteristici +, i, ** (op. Operatori aritmetici exponential) AND, OR,NOT | Operatori logic 7595, <8, 15 | Operator de comparajie BETWEEN ... AND... | Operator de verificare a apartenen{el la un interval de valori IN(lista) ‘Operator de verificare a apartenentei la o list de valori LIKE Operator de comparare cu un gablon % - oriedte caractere; _ - un caracter: IS NULL ‘Operator care verificd daca o variabildi are valoarea NULL ll Operator de concatenare @ _| Operator de conectare la distanja & ‘Operatori pentru adresarea variabilelor de sau Sak substitutie = _| Operator de atribuire Funcgii SQL suportate in PLSQL In cadrul instructiunilor descriptive sunt suporiate toate tipurile de functii SQL (inclusiv functiile de grup in eadeul instructiunii SELECT), _Instructiunile PL/SQL suport func}ii la nivel de inregistrare (single-row): iinerice, caracter, data, de eonversic ete., dar NU supanti functii de grup (SUM, MIN, MAX, AVG, COUNT, STDDEV) sau functia DECODE decit in cadml ee re Introducere in PL/SQL (Procedural Language Extension SQL) 1s instructiunitor SOL din bloc. De exemplu, nu se pot utiliza intr-un bloc PL/SQL constructii de forma: IF DECODE(...) THEN... sau IF AVG(..) THEN... . Limbajul PL/SQL converteste tipurile de date dinamie (de exemplu: o valoare numerica la o variabild char), in acest sens avind loc conversii implicite: caracter <-> numeric gi caracter <>data, Pentru conversii explicite se utilizeazi functiile TO_DATE, TO_NUMBER, TO_CHAR in mod asemin3tor cu limbajul SOL. Afigarea pe ecran a valorilor vatiahilelor saw a mesajelor in PL/SQL se realizeazi prin apelarea functiilor PUT_LNE sau PUT din pachetul standard DBMS_OUTPUT. Aceste dowd functii primese ca parametru un sir de caractere gi- J afigeaz&. Diferenja dintre cele dowd functii este accea cli prima afigeaz’ mesajul dup’ care trece la linia urmitoare, iar cea de a dowa afigeazi mesajul pe linia eurenté, Funejiile PUT_LINE $i PUT sunt necesare deoarece nu putem accesa variabilele declarate in blocurile PL/SQL direct din medivl SQL (pentru a le afiga cu PROMPT), in unele medii de dezvoltare, ca de cxemplu in SQL*Plus, trebuie utilizati la inceputul sesiunii comanda SET SERVEROUTPUT ON care activeazd bufferul pentru afisare. SET SERVEROUTPUT ON DECLARE BEGIN DBMS_OUTPUT.PUT_LINE (' DBMS_OUTPUT.PUT (.... END; f De exemplu, vom realiza un bloc PL/SQL care sa afigeze un mesa). Pentru a executa blocul utilizim mediul de dezvoltare SQL. Developer. Mai intéi este hecesari stabilirea conexiunii cu servenil Oracle: click dreapta pe cticheta Connections din stinga ecranului si completim detaliile referitoare ta conexiune: hume utilizator si parola, adresa IP a serverului $i portul, numele instanftei baxei de date. tf + . Le Dee eeeeme apse energie Iai Baze de date, Limbajal PL/SQL Figura 1 Realizarea conexiunil cu serverul Oracke Dupa conectare apare fereastra in care puter serie $i execula blocurile, in mod asemiinator cu modul de lucra cu instructiunile SQL, Pentru executia blocurilor se di click pe unul dintre butoancle Execute Statement (F9) sou Run Seripe (PS), rr {ntroducere in PL/SQL (Procedural Language Extension to SQL) 17 ares Goad 4* xan ao a abaya Sela, Sr, ata 4 Figura 2 Execufia blocurilor PL/SQL fn SQL Developer Codul sursai al blocului este redat ai jos: SET SERVERQUTPUT ON ~-INTRODUCEM COMENTARII: in acest caz sectiunea DECLARE lipsegte ~-blecul afigeazi un mesaj BEGIN DEMS _OUTPUT. PUT_LINE ('Limbajul PL/SQL este un limbaj procedural!'); DBMS_OUTPUT. PUT_LINE('Un bloc PL/SQL contine trei geciuni: DECLARATIVA, EXECUTABILA, DE TRATARE A EXCEPTIILOR") ; END; é propuse 1. Recapitulati notiunile de baza ale limbajului SQL, precum si comenzile utilizate. 2. Creaji o conexiune nowd in SOL Developer si testati programul clasic Hello World! VARIABILE PL/SQL U1 Declarare si inifializare Declararea variabilelor se realizeaz in zona declarativa delimitati prin DECLARE a blocului sau sub-blocului. Initializarea variabilelor se poate face la declarare sau in zona de executic intre BEGIN gi 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 bajelor de prograimare structurate, unde semnificatia unui mume definit de ut tor fntr-un bloc/sub-bloc este dai de cea mai apropiatii declaratie anterioard locului folosirii La declararea variabilclor PL/SQL se precizeaza obligatoriu tipul de data si optional anumite restrictii si un gir valid de valori. Declerarea si inifislizarea se realizeaza astfel: num¢_variabila [CONSTANT] TIP_DATA [NOT NULL] [:=[ DEFAULT expresie]; Constantele in PL/SQL trebuie obligatoriu inifializate, iar ulterior nu isi vor putea schimba valoarea, Variabilele pentru care se precizeazi restrictia NOT NULL trebuie obligatoriu inifializate, iar ulterior nu vor putea primi valoarea NULL. Pentru a putea urmiri mai ugor codul sursi se foloseste unmitoarea conventie de notare: ©_nume Constanta - pentru declararea constantelor; ¥_nume Variabila - pentru declararca variabilelor, &_nume Variabila_globala — pentru variabilele globale definite in zona de Specific: a unui pachet de subprograme gi valabile pentru toate procedurile si funcfiile pachetului. eee 20 Baze de date, Limbajul PL/SQL 1.2 ‘Tipuri de variabile Variabile PL/SQL. ‘Scalare ‘Compozite Referinfa LOB (Large Objects): NCLOB, CLOB, BLOB, BFILE ‘Obiect ‘Variabile non-PL/SQL: variabile de mediu (BIND VARIABLES) 112.1 Variabite scalare Tipurile scalare conjin valori simple, o variabila scalard poate ‘contine la un moment dat o singura valoare gi corespunde im principal tipurilor de date Oracle. Cele mai cunoscute gi utilizate tipuri de date sunt prezentate in tabelul urmitor. » char (lung_max)- lungime fixd de max 32.767 bytes = varchar? (lung_max)—lungime variabili de max 32.767 bytes = long [sir de caractere de lungime variabili 2GB] = number (precizie,scali) * boolean (true, false, null) = date * binary_integer 5i pls_integer (numere fntregi intre - 2147483647 gi 2147483647) * binary_float gi binary_double (pentru numere reale in varianta Oracle 10g) = timestamp (pentru fractiuni de secundii) Pentru alte tipuri de date puteti consulta capitolul 3 din [ORAPL]. Exemple: v_functie varchar? (9); v_numar binary_integer:=0; v_totalsal number (9,2) :=0; v_datainceput date:-sysdate+7; c_taxa constant number (3,2) :=8.25; v valid boolean not null:= Variabile PLISQL ai Afisarea variahilelor PLASQL sc cealizesx’ prin intermediul functiei PUT_LINE din pachetului DBMS_OUTPUT. Se poate utiliza operatoral de concatenare ( ||) pentru a afisa mai multe mesaje sau variabile pe acceasi linie, de exemplu: DBMS OUTPUT.PUT_LINE (‘VALOAREA VARIABILEI ESTE:' |ivariabila); Popularea variabilelor cu valori din tabelele bazet de date Se utilizeaz’ comanda SELECT cu elauza INTO pentru popularea variabilelor PL/SQL cu valori ale atributelor din tabele, insd, pentru aceasta cercrile SELECT din cadrul blocurilor PL/SQL trebuie 5 furnizeze o singura linie rezultal, in caz contrar sc va semnala o eroare, Penin: a putea accesa o anumita inregistrare sau valoare a unei coloane dintr-o tabelii este obligatoriu s& utilizim variabile PL/SQL, aga cum se observa si in exemplul urmator: Exemplu: Si se afiseze numele angajaneui cu codul 00: SET SERVEROUTPUT ON DECLARE --declaram variabila v_nume in care vom returna numele angajatului: V_nume VARCHAR (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: DEMS_OUTPUT, PUT_LINE('NUMELE ANGAJATULUE ESTE: | 1] v_nume} ; END; f Rezultatele executici blocului sunt prezemtate in figura 2.1 r 2 Baze de date. Limbajul PL/SQL Variabile PL/SQL : a > tee fee freer fame 5 wa Exemple: 9080 9° xH8 Sa se afiseze mimele i prenumele angajatuke’ cu codul 100: DECLARE --declaram doua variabile pentru nume si prenume: Figura 2.1 Execujia bloculul PL/SQL A, Atribumal GTYPE Penta a declara o variabild PL/SQL care si aibai acelagi tip de date cuo anumit coloani dintr-o tabeli say cu o alté variabila declarati anterior putem folosi atributul %TYPE, Declararea unei variabile cu %TYPE se face astfel: variabiln — tabeli.nume_coloanii%TYPE; sau variabilal tip_dati; variabila2 varinbilal %“TVPE; V_nume angajati.numesTYPE; V_prenume angajati.prenumetT¥PE; BEGIN -- populam gi afisam variabilele: SELECT nume, prenume INTO v_nume, v_prenume PROM angajati WHERE id angajat = 100; DBMS_OUTPUT. PUT_LINE("NUMELE ANGAJATULUI BSTE:' || v_nume||' '||v_prenume) ; END; if Observatie: Restrictia NOT NULL a unci coloane nu se aplic& si variabilei declarate prin folosirea atributului % TYPE. 2. Variabite de mediu sau vartabile de legiturit ale aplicagiilor gacdé (BIND VARIABLES) Acestea sunt variabile de legdturd cu aplicajia in care ruleazi motoral PLSQL gi trebuie declarate in aplicafie (in mediul gaedi), putind accesate gi modificate in cadrul blocurilor PL/SQL, Dupd terminarea executiei blocului PL/SQL, variabila ramAne in mediu! gazdi cu valoarea primitd in urma rulinii blocului $i poate fi pasat® altui bloc, realiznd astfel transmiterea de valori intre blocurile PL/SQL. Variabilele de mediu nu pot fi utilizate in cadral procedurilor, functiilor sau pachetelor, Variabilele de mediu se declara in afara blocului PL/SQL cu ajutoral ecuvantului cheie FARFABLE: VARIABLE g_numevariabili TIP Observafie: pentru declararea unei variabile de mediu de tip NUMBER nu se specified precizia gi scala; uM Baze de date. Limbajul PL/SQL Variabilele de mediu se utilizeazi in cadrul unui bloc PL/SQL sau intr-o instructiune SQL din afara blocului prefixate cu (:) astfel: host_variabila:=v_varial Variabilele de mediu se afigeazé in afara blocului cu ajwiorul comenzii PRINT (1a afisare variabila nu se va prefixa cu “:"): Exemple: 1. Sd se afiseze mesejed: Bloc PLISOL ett ajitorul unet veriabife de media; ~-declaram variabila de mediu: VARIABLE g_mesaj varchar2 (30) BEGIN -- atribuim mesajul variabilei 'g_megaji='Bloc PL/SQL'; BND; é -- afisam valoarea variabilei in afara blocului: PRINT g_mesaj Sd se afiseze numdrul de comenzi a cdvor modalitete de completare este online; SET SERVEROUTPUT ON -- declaram variabila de mediu: VARIABLE g_comenzi varchar2 (30) BEGIN == utiligam o cerere SQL pentru a calcula si popula variabila cu numarul de comenzi: select count(*) imto :g comenzi from comenzi where modalitate = END; f -- afisam variabila: PRINT g comenzi ‘online’; , Variabile PLISQL 35 Observafie; Se poate auto-aliga variabila prin setarea AUTOPRINT ON Exemplu: SW se selecteze produsele si pregul acestora pentru acele produse care aw prejul < prepul mediu af produsului cu codul 3133 (ard a utiliza 0 cerere imbricatd: SET SERVEROUTEUT ON SET AUTOPRINT ON VARIABLE g_pret number BEGIN select avg(pret) inte :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; sen acon Swe Je pes I Deesar aowcus Spee [iguewen [omen ona | Quorn came 784 Figura 2.2 Executia bloculai PL/SQL 6 Baze de date. Limbajul PL/SQL, 3. Mariabile de substitufie De regula, variabilele de substitufie sunt folosite pentru a transmite valori dinspre mediul SQL*Plus spre comensile SQL sau blocurile PL/SQL, in timp ce variabilele de legaturd (bind variables) sunt folosite pentra a transmite valori in sens invers sau pentru a transfera valori intre blocuri PL/SQL lansate succesiv (primul bloc seteazd variabila, urmatonil o consulta). Prin variabilele de substitutie se pot transmite valori comenzilor SQL sau blocurilor PL/SQL lansate (folosind "&" sau "&&"). Se pot utiliza in comer SQL sau in blocurile PL/SQL prin "&nume_variabila” sau "&&nume_variabil Variabilele de substitutie sunt locale sesiunii SQL in care au fost declarate, jin mediul SQL variabilele de substitutie pot fi ugor ulilizate prin introducerea de valori de la tastaturd utilizind ACCEPT, se pot defini cu DEFINE sau afisa pe ecran cu PROMPT; Exemplu: Sd se afigeze numdrul de comenzi ale angajatuli al cdrué cod este introdus de la tasteturd de céitre utilizator prin intermediul variabilei de substitufie &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 comenz i where id_angajate&id_angajat; dbms_output.put line('Angajatul are: '| | voinr_comenzi||' comenzi') ; END; / ¥ariabile FLISQL n Figura 2.3 Exeeutia bloculul PL/SQL Intr-un bloc PL/SQL se pot utiliza toate tipurile de variabile, respectind ins caracteristicile si regulile de utilizare ale acestora. In exemplul urmator se utilizeaz’ atit variabila de substitutie s_nwme definiti $i initializati prin comanda DEFINE, cat si variabila de legituré g salariul, dar si variabila local v_prenume de acelagi tip cu coloana nume din tabela Angajali. Variabila de substitutie definita cu DEFINE va fi implicit de tipul CHAR. Exemplu: Sd se aflyeze salariul si prenumele angajanului 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/soL v_prenume angajati.numettype; BEGIN 3 select prenume,salariul inte v_prenume, :q_salariul from angajati where nume='&s nume'; Fa Baze de date, Limbajul PL/SQL Variabile PL/SQL = DEMS_OUTPUT.PUT_LINE ('Prenumele angajatului este: "| |v_prenume); END; / print g_salariul 412.2 Tipuri de date compuse punta, tamaee goon, er nin tn nego ape ant hoaesey il meepeate intl te 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 cind se declard un PLISOL record Pentru aceste cimpuri, ele pot fi manipulate ca o unitate, ficcare cimp (element al stracturii) avand un nume si un tip de dat. Atributele unui record sunt referite astfel: nume_record.oume_cimp. Declarea unui tip record se face astfel: TYPE nume_record IS RECORD (nume_cimp TIP_DATA [.nume_cimp TIP_DATA:=|DEFAULT valoare|...); Jar declararea unei variabile de acest tip: Variabild NUME_RECORD; Figura 2.4 Executin blocului PL/SQL, Exemplu; Unilizdnd un tip de daté record definit de wtilizator sé se afigere retul minim al produstelud cee codul 3133, Pentru a defini un record pe baza coloanclor unci tabelasen folosegte Yarowtype . In acest caz numele elementelor din record au acelagi mume ca gi ee coloanele tabelei, acelagi tip de date gi se giisese in acceasi ordine, TYPE tip_produse IS RECORD NUME_RECORD tabela%sROWTYPE; (v_cod Produse.id_produsttype Nor NULL: =3000, wfen produse.denumire_produattype, Exempla: Sd se reserie exemphad de mat sus utitizind tribunal v_pret_min produse.pret_minttype) ; %4ROWTYPE: vrec_prod tip produse; bi BEGIN ee SELECT id_produs, denumire_produs, pret_min ees Produsetrowtype; ia = See SELECT * into vrec_prod from produse where dbms A ' j id_produs=3133; a) all dbms_output.put_line("Predusul: ||| sos : ' tul minim: ‘| [vrec_prod.v_pret_min) ; Tei ae ate are pretu END; | |vrec_prod.pret_min) ; é END; f ne 30 Baze de date. Limbajul PLISQL EXERCITII PROPUSE 1, Specificati ce se va afiga la rularea urmatorului bloc PL/SQL: DECLARE v_varl NUMBER v_var2 NUMBER; v_var3 HUMBER := V_var2; v_var4 VARCHAR(20) := 'variabila PL/SOL'; v_varS NUMBER NOT NULL := v_varl; ¢_const1 CONSTANT DATE := TO_DATE('12/02/2007", 'dd/mm/yyyy') i c_const2 CONSTANT NUMBER NOT NULL := 2; ¢_const3 CONSTANT NUMBER := NULL; v_var6é NUMBER DEFAULT NULL; BEGIN DBMS_OUTPUT.PUT_LINE(‘variabila 1 = ' | |w_vari); DBMS_OUTPUT. PUT_LINE('variabila 2 = "| [wivar2); DBMS_OUTPUT, PUT_LINE{'variabila 2 = '||[v_var3); DBMS_OUTPUT.PUT_LINE('variabila 4 = '||v_var4); DBMS_OUTPUT. PUT_LINE('variabila 5 = * | |wivars) : DEMS_OUTPUT. PUT_LINE('constanta 1 = *| |c_const1) ; DBMS_OUTPUT . PUT_LINE('constanta 2s '| |e_const2) ; DBMS OUTPUT. PUT_LINE('constanta 3 = "| |c_const3); DBMS_OUTPUT, PUT_LINE('variabila 6 = ' | |v_vare); ‘END; i Variabile PLISQL a1 ; 2. Specificati ce se va afiga la rularea urmitorului bloc PL/SQL (care contine blocuri imbricate, ilustraind domeniul de vizibilitate al unor variabile care awacelasi nume): DECLARE var NUMBER; BEGIN var := 1; DBMS_OUTPUT. PUT_LINE (var) ; DECLARE var NUMBER; BEGIN var :=2; DEMS_OUTPUT.PUT_LINE (var) ; END bloc; DBMS_OUTPUT . PUT_LINE(var) ; ecbloc22> DECLARE var NUMBER; BEGIN var :=3; DBMS_OUTPUT.. PUT_LINE (var) ; DECLARE vax NUMBER; BEGIN var :=4; DBMS_OUTPUT. PUT_LINE (var) ; DBMS_OUTPUT. PUT_LINE (bloc2.var) ; FUE STUy LINE (var) ; DEPARTAMENTL: BMLIOTECA ji a eee 32 i 4, Si se caleuleze suma a doud numere, iar rezultatu Baze de date. DBMS_OUTPUT. PUT_LINE (var); END. DBMS_OUTPUT . PUT_LINE (mesaj} ; END; stoc:= stoc+100; Numerele se vor introduce de la tastatura: introduc de la tastaturd, Limbajul PL/SQL: 3, Specificati ce se va afiga la rularea urmiitorului bloc PL/SQL: DECLARE stoc NUMBER (3) :=600; mesaj VARCHAR? (50):='Produsul 101°; BEGIN DECLARE stoc NUMBER (3) :=10; mesaj VARCHAR2 (50) :='Produsul 102'; um VARCHAR2(10):= ' bucati '; BEGIN stoc:= stoctl; mesaj:='Stecul pentru ' | |mesaj]|' este de: *||stoc| |um; mesaj:='Stocul pentru '||mesaj||‘ este de: '|Jstec| jum; DEMS_OUTPUT.PUT_LINE(mesaj); END; i | sa se divid’ cu 3. 5, Si se afigeze salariul méarit cu un procent, Salariul gi procentul se 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 tranzacjiilor - TPL (Transaction Processing Language) astfel; * PL/SQL suporta toate comenzile din limbajul de manipulare a datelor {DML) si din cel de control al tranzactiilor (TPL). Un bloc PL/SQL mu ¢ 0 tranzactie, comenzile Commit/ Rollback’ Savepoint sunt independente de bloc dar pot si apara in interionul siu, Comenzi DMLITPL Execuple SELECT, INSERT, UPDATE, Se exeenti normal in cadrul bloculul DELETE, MERGE COMMIT, ROLLBACK, Fot aparea in bloc dar au efect asupra SAVEPOINT tuturor tranzaetiilor ~—din—_interiorul sidin eestuia. * PL/SQL nu suport comenzi de definire a datelor sau de gestiune a utilizatorilor (DDL sau DCL) in cacrul unui bloc. Pentru executarea acestor ‘comenzi s¢ utilizeazd comanda EXECUTE IMMEDIATE ‘camanda DDI": Comensi DDL/DCL Execupie CREATE, ALTER, DROP EXECUTE IMMEDIATE ‘CREATE GRANT, REVOKE TABLE.... ' Exemple: |. Siise creeze tabela PROD in cadrul unui bloc PLISOL: SBT SERVEROUTPUT ON BEGIN EXECUTE IMMEDIATE "CREATE table prod AS SELECT * FROM produse where 1=2'; END; / M Baxe de date, Limbajul PL/SQL Interactiunea cu serverul Oracle prin comenzi SQL. a5 = Pe mone bn oe goad 9° kon Figura 3.1 Executia bloculul PLISQL 2. Sd se adauge in tabela PROD fnvegistrdri din tabela PRODUSE: DECLARE v_codp produse.id produs¥type; videnp produse.denumire ! produsttype; v_eat produse.categoriettype; v_des produse.descrierettype; BEGIN ~=populam variabilele: SELECT id _produs, denumire produs, categorie, descriere INTO v_codp, v_denp, v_cat, v_des FROM produse where id_produs=3133; ~-adaugam valorile variabilelor in tabela: INSERT INTO prod (id _produs, denumire_predus, categorie, descriere) VALUES (v_codp, v_denp, v_eat, v_des); 7-afisam valoarea variabilelor; DEMS_OUTPUT.PUT_LINE ('S-a adaugat in tabela prod produsul: "||v codp||' | | |¥_denp| | + *| [wleacy; end; f select * from prod; Figura 3.2 Executia bloculul PLISQL, Pentru o mai mare flexibilitate se poate declara o variabilii de tip gir de saraclere care sf primeascd comanda de definire a datelor care va fi executati prin Execute Immediate: Exemple: / J. Sa se creeze tabela EMP SAL prin intermediul unei variabile de tip FARCHAR2. La creare, in tabela EMP SAL se va adduge o nowd inregistrare, SET SERVEROUTPUT ON VARIABLE G_EID NUMBER DECLARE V_SIR VARCHAR2 (200) ; fGIN EID: =110; --atribuim girul de caractere variabilei V_SIR:="CREATE table emp_sal AS SELECT id_angajat, nume, prenume, salariul FROM angajati where id_angajat="||:G_EID; DBMS_OUTPUT.PUT_LINE (¥_SIR); Baze de date. Limbajul PL/SQL =-utilizam comanda cu valoarea variabilei v_sir: EXECUTE IMMEDIATE V_SIR; END; i select * from emp_sal; 2, Sd se adauge a nowd coloand - STOC in tabela PRODUSE: DECLARE V_SIR VARCHARZ (200) ; BEGIN V_SIR+='ALTER TABLE PRODUSE ADD (STOC NUMBER CVG DEMS_OUTPUT.PUT_LINE (V_SIR); EXECUTE IMMEDIATE V_SIR; END; é select * from PRODUSE; Figura 3.3 Exeeufia blocului PLSQL , Interactiunea cu serveru! Oracle prin comenzi SQL a7 Manipularea datelot in PL/SQL se face prin limbajul de manipulare a datelor (comenzile INSERT, UPDATE, DELETE) care pot fi lansate fir restricfi in PLISQL. Exemple: Comanda INSERT: 1. Si se adauge o noud inregistrare in tabela EMP_SAL: BEGIN : INSERT INTO EMP_SAL (id_angajat, nume, prenume, salariul) VALUES (200, END; é select * from emp_sal, ‘Pop’, 'Marian', 7500); 2. Si se adauge o noud inregistrare in tabela PRODUSE prin introducerea valorilor ev ajutorul variabiletor de substitupie: BEGIN INSERT INTO produse (id produs, denumire produs, categorie, stoc) VALUES (kid, ‘'&denumire', ‘categorie’, gstac); END; / select * from produse; 3. Sd se adauge clientul fanescu George. Datele personate (telefon, nivelul veniturilor si emaiful) se vor citi de ie tastaturd. [d-tl acesteia va avea valoarea ultinuilui id de client incrementat cu o unitate. set serveroutput on declare v_id clienti.id_clientt TYPE; begin select max(id_ client) into v_id from clienti; insert inte clienti values (v_id+1,'&prenume', '&nume' , &tel, NULL, '&email*,NULL, NULL, NULL, &venit) ; é 38 Baze de date. Limbajul PLSQL Comanda UPDATE: 4. Sse mireased ew un procent salariul angajatitor din tabela EMP SAL care au in prezent salariel mai mic deedt valoare variabilei v \_prag: DECLARE v_procent number:=0.1; v_prag angajati.salariulttype:=10000; BEGIN UPDATE emp_sal SET salariul=salariul* (1+v_procent) WHERE salariul=50; i:eie10; end loop; END; i. 4s Bare de date. LLimbajul PLISQL, ee oe So g280 4" xom O-0 i aman orem ial scien Figura 4.3 Execuyia blocului PL/SQL, Structera WHILE... LOOP....END LOOP are urmiltoarea structurd WHILE cond LOOP Secventa comenzi Secventa comenzi 2; EXIT (WHEN cond] ; END LOOP; Exemple; 1. Sa se afigeze pe ecran wiilizdnd structura WHILE LOOP...END LOOP numerele 9,7, 4, 0. set serveroutput on DECLARE vmx number (2):=10; i number (2) :=1; BEGIN while v_nr > 0 loop ‘ans i_output .put_ line (v_nr) ; end loop; END; f ‘Structuri fundamentale de programare 49 2. Sd se afiseze in ordine angajafit cu codurile in intervalul 100-110 até timp oft salaried acestora este mai mic decit salariul mediu: DECLARE v_sal angajati.salariulttype; v_salMediu v_salttype; --calculam salariul mediu: SELECT avg(salariul) into v_salmediu from angajati; dbms_output .put_line('Salariul mediu esate: "| |v_salmediu) ; while i<=110 loop select salariul into v_sal from angajati where id_angajatei; dbms_output.put_line('Salariatul cu codul ‘}]i[|* ave salariul: '||v_sal); ireiel; -ciesim din ciclul WHILE la indeplinirea conditiilor exit when v_sal> LOOP vivarisv_varel; 52 Baze de date. Limbajul PL/SQL EXIT WHEN v_var>10; <> LOOP EXIT LOOP_EXTERN WHEN condi; EXIT WHEN cond2; END LOOP; END 100P; Exereitii propuse 1. Utilizand structuri altemative, rezolvati ecuajia de gradul 2. 2. Afisati numele si telefonul aferente fiecdrui client cu id-ul numa par, 3. Constriti un bloc anonim pentru a exemplifica sinucturile LOOP imbricate, CURSORI SI TABELE INDEX BY Cursorul reprezint o variabili PL/SQL specialfi wtilizati atunei clind se ‘executi 0 comand’ SQL, iar Oracle Server deschide o zon’ de memorie (context area) in care comanda este executatd. Cursonul este un pointer editre aveastii zon’. ih PLISQL se utilizeaz3 dowd tipuri de variabile de tip cursor: eursonul icit declarat pentru toate instructiunile de manipulare (INSERT/UPDATEY DELETE); cursorul explicit declarat si gestionat de programator pentru ulilizarea comenzii SELECT in cazul in care aceasta retumeazii mai multe inregistrari. YI Cursorul implicit ‘Cursorul implicit este declarat de Oracle Server pentru toate comenzile de manipulare a datelor (INSERT, UPDATE, DELETE) prezente intr-in bloc PL/SQL. Daca o instrucfiune DML nu afecteaz’ nicio linie a tabelei nu se gentreazA eroare, insk excepfia trebuic tratati folosind atributele speciale ale eursorilor, Cursorual implicit prezintd o serie de atribute care pot fi utilizate intr-un bloc PL/SQL pentru verificarea execufiei instructiunilor DML. Aceste atribute Sunt: ¥ SQL%ROWCOUNT- reprezintd numarul liniilor retumate pint in momentul curent; ¥ SQL%NOTFOUND — evaluat la TRUE in cazul in care cea mai recenté instructiune de manipulare nu a afectat nicio linic; ¥ SQL%FOUND - opusul lui SQL%NOTFOUND. a4 Baze de date, Limbajul PLISQL Exemple: J, SG se steargé un produs din tabela PRODUSE fi sd se contorizeze numdral de réinduri sterse. SET SERVEROUTPUT ON DECLARE v_rez NUMBER (2) ; BEGIN DELETE FROM produse WHERE id _produse11i; ¥_rez: &n OR e$not found; END LOOP; CLOSE c; END; / Figura 5.5 Executia blocului PLISQL 64 Baze de date, Limbajul PLISOL _- || | i # we [ Sonne Hea ceminind 1S Bucmenrunes a |AMSI%S Fie ot tpstbl px ean 70 aE Ba that ot inp pe acini Figura 5.6 Executia cursorulul pentru n=7 Gestiunea implicité a cursorulul prin utilizarea unui ctclu FOR FOR mume_record IN nume cursor LOOP fin acest caz, tipul RECORD nu trebuie declarat, Se realizeazii in mod implicit deschiderea (OPEN), incirearea (FETCH) gi inchiderea cursonului (CLOSE), Exemplu; Sd se afigeze printrwn cicle FOR numele st salariile angajagilor din departamentil 50: set serveroutput on declare Cursori si tabele index BY 65 cursor ang_cursor is select id angajat, nume, salariul from angajati where id_departament=50; begin dbms_output.put_line('Lista cu salariariile angajatilor din departamencul 50'); for ang_rec in ang_cursor loop dbms_output .put_line('Salariatul '|[ang_ree.nume||' are salariul: '|[ang_rec.salariul) ; end loop; end; / tna a] 4 Qi Obemal __ Sp . POSES UM ¢ emenecs ns i ihe © ere iene 2 i= (Ses sree e'bsts cx alate mais neta 2s | * los be ese eee Die renee noted est “egal { Figura 5.7 Execufia bloculul PL/SQL. 66 Baze de date. Limbajul FLISQL, Utilizerea unet cursor direct in cadrul instructinnit FOR in acest caz cursorul ne este declaral, nu are nume, este reprezentat doar de interogarea SELECT din eadrul instructiunii FOR, astfel: Dezavantajul in acest caz este ¢a nu se pol utiliza atributele cursonului din cauza faptului ci acesta nu are nume, Exempla: Sa se afigeze suma aferenté salariilar din fiecare departament: set serveroutput on declare begin dbms_output.put_line('Total salarii pe fiecare departament :") ; for dep rec in (select d@. id_departament dep, sum(a.salariul) gal from angajati a, departamente d where a.id departamented.id departament group by d.id departament) leop dbms_output..put_line{ ‘Departamentul "I |dep_rec.dep||' are de platit salarii in valoare de: '||dep_rec.sal||' RON’); end loop; end; / Cursori si tabele index BY 67 [End Sey = = sn anne | ete Der Beet be eye ree ie eon Bae avn ter Bend Fe 28G oO 8. ie aot ai = Bem * (yam “Ses psa a leo fog er bn + ame let Api ts dss ¥ + enue ‘im meant, apstann = |S { Wid pom row br isonet | = oun co { te Seco eta il i 1 A | | Figura 5.8 Exeeufin bloculul PLISQL. Utilizarea cursoruiud en parametra Pentru o flexibilitate mai mare se pot declara 3i utiliza cursori cu parametru care transmit valorile parametrilor actuali in cererile SQL. Declararea cursorului cu parametru se face astiel: Cursor nume_cursor (parametrul tip_data,.....) Ts select... 4 Deschidere: Open oume_cursor(valoare_parametrul, Cursorii parametrizati nu oferd o funejionalitate suplimentara ci doar o modalitate simp]4 gi clari de a specifica valori de intrare. Tipurile parametrilor sunt sealare, dar nu li se precizeaz dimensiunea, acestea fiind referite fn interagare, 68 Baze de date, Limbajul PL/SQL Cursori si tabele index BY 69 Exemple: J. Sd se afigeze produsele al cdror cantitate total comandatd este mai mare decit a valoare primité drept paramenn, a ae 20809" KGa oo 8- ao Ie (ear SET SERVEROUTPUT ON je DECLARE sm CURSOR c_prod (p_val NUMBER) I5 | sone SELECT p.id_produs, p.denumire produs, oiloas sum(x.cantitate) total teen FROM produse p, rand_comenzi r sae [Spe CAIN Test a en mts nl nh ie WHERE p.id produs -r.id_predus GROUP BY p.id_produs, p.denumire predus HAVING sum(x.cantitate)>p_val ORDER BY total desc; v_val NUMBER (5) ; rec_prod c_prodtrowtype; BEGIN v_val:=500; DEMS_OUTPUT, PUT_LINE('Produsele al caror cantitate vindut& este mai mare decat ‘|| vival); IF NOT ¢_predtISOPEN THEN OFEN c_prod (v_val); END IP; LOOP FETCH ¢_prod into rec_prod; EXIT WHEN c_prodtnotfound; DEMS_OUTPUT.PUT_LINE('Din predusul "| |cec_prod.id_produs||', ‘| |rec_prod.denumire_produs||", s-au vandut * | |ec_prod.total||' unicari'); END LOOP; CLOSE c_prod; END; é Figura $9 Execufin blocalul PLISQL 2. Sd se afiseze pentru fiecare comandé produsele comandate. fn acest cat se wilizeazd dowd variabile de tip cursor: SET SERVEROUTPUT ON DECLARE --cursorul care va prelua comenzile incheiate CURSOR c_com 18 SELECT nr _comanda, data FROM comenzi Where modalitate= ‘online! ORDER BY nr_comanda; --cursorul care, pentru fiecare comanda, va afisa produsele din cadrul acesteia, ordonate descrescator CURSOR c prod (p_nr_comanda NUMBER) Is 70 Baze de date. Limbajul PL/SQL SELECT r.id_produs, p.denumire_produs, ¥r.cantitate FROM produse p, rand_comenzi r WHERE p.id_produs=r.id_produs AND r.nr_ comanda=p_nr_comanda ORDER BY r.id produs dese; rec_com c_com$rowtype; --variabila record pentru campurile din primal cursor rec_prod ¢_prodtrowtype; --variabila record pentru campurile din al doilea cursor BEGIN ‘OPEN c_com; Loop FETCH c_com into rec_com; EXIT WHEN c_comtnotfound; DBMS_OUTPUT.PUT_LINE('Comanda ' | | rec_com.nr_comanda ||' incheiata la data de ' | |[zec_com.data) ; OPEN ¢_prod (rec_com.mr_comanda); ~-cursorul primeste drept parametru numarul comenzii care a fost afisata LOOP FETCH ¢_prod into rec_prod; EXIT WHEN c_prodtnotfound; DEMS_OUTPUT,PUT_LINE('Din produsul ‘| [rec prod.id_produs||', ‘| [xec_prod.denumire produa||', s-au comandat ' | |rec_prod.cantitate||' bucati'); END LOOP; CLOSE ¢_prod; DEMS_OUTPUT. PUT_LINE ("== END LOOP; CLOSE c_com; END; é Cursori si tabele index BY nm Hoel ile ine peads aie ar wee Me $A Ped io rea, ama oa iw a et idee nr MeL sees seen om ker) om cmc * Brae ee eee fo = x tee” [pmes Blow one toe lithatee eae ome Gorman Owe Hall it - — | Soccer rate tte i ee Ret 1S. | see roa! Som, lat Ut was smn Bh ee s joan SIM, ep =e ad, omc Do ceded ii, mur ack = 8, te demndat 117 cee fim produ: 207, 1 LAL, fron btm Bod ocd founda 296 tachetotn tu den de 2-9 abt. 90 mY [speedo 212, Ser 90. eon cant be oun poeta 20, Seon cf, 52.0, ear commas. bet Figura 5.10 Executia blocului PL/SQL 4. Sa se afiseze denumirea funcjiel si departamentul in care tuereazé Primi n angajati. Se va utilize cursor cu parametru, far n este citit de le tasteturd, set serveroutput on; DECLARE CURSOR c is select nume, salariul, id_departament, id_functie from angajati; CURSOR cl(id dep angajati.id departamentttype) is select denumire departament from departamente where id_dep=id departament; CURSOR c2(id_funct angajati.id_functiettype) is select denumire functie from functii where id_functeid_functie; Baze de date, Limbajul PL/SQL, Cursori si tabele index BY BEGIN 4, Si se afigeze produsele sé cantitifile cumpdrate de cittre clienyi. POR var IN c LOOP set serveroutput on; DEMS_OUTPUT.PUT_LINE('Angajatul :'||var.nume||+ CLARE salariul :'||var.salariul) ; cbnabe c is select nume client, id client from FOR varl IN cl(var.id departament) LOOP DBMS_OUTPUT.PUT_LINE('Este in departamentul' | |vari.denumire_departament) ; END LOOP; FOR var2 IN c2(var.id functie) LOOP DBMS_OUTPUT. PUT_LINE (‘are functia"||var2.denumire functie) ; END LOOP; EXIT WHEN ctnotfound or c¥roweount>kn; END LOOP; clienti; CURSOR ci(id_c clienti.id client&type) is select ¢.nr_comanda,c.modalitate,p.denumire_produs, r.cantitate from comenzi c¢, rand_comenzi r, produse p where id_cec.id client and r.nr_comandas ¢.nr_comanda and r.id produss p.id produs order by c.modalitate; BEGIN FOR var IN c LOOP DEMS_OUTPUT. PUT_LINE('Clientul: ‘| [var.nume_client||' a achizitionat gato seinen sigaetanetia onetinasiy oar cz F FOR varl IN cl(var.id client) Loop PSG Ba Sve US pad PRR EAT PESTS DBMS_OUTPUT.PUT_DLINE(varl.denumire produs| |! Dee tans nen apeeseed ekamnieecinesi *| |vari.modalirate||' '||var1.cantitate) ; rome END LOOP; EXIT WHEN ctnot found; END LOOP; END; if Figura 5.11 Execufia cursorului pentru nS “4 Baze de date. Limbajul PL/SQL We ew Bede Be tage Veo ee ie Bw god 45 485 a. i (Sere rem sees 49 oe. (ia re eet se.etiary Laer etwiad| eas « ekdcicimat weeteesbe ponders Figura 5.12 Execufia blocului PL/SQL. Actalizarea inregistririlor returnate de cererea cursorulut. Clawza FOR UPDATE Pentru asigurarea consistentei gi eoncurenfe: la date, actualizarea inregistririlor din tabele care sunt inciircate in cursonal explicit se poate face prin blocarea setului de inregistrairi in 2 variante: NOWAIT si WAIT n. CURSOR C IS SELECT ,.., FROM... FOR UPDATE [OF COLUMN_NAME] [NOWAIT|WAIT nj; Clauza FOR UPDATE din interogarea asociat€ cursorului se adaugi pentru a bloca liniile afectate atunci céind cursomil este deschis, Clauza NOWAIT determina aparijia unei erori daci liniile sunt blocate de o alti sesiune. Atunci end ‘mai multe tabele sunt implicate in interogare, se poate folosi FOR UPDATE pentru a impune blocarea linijlor unci tabele anume. Liniile unci tabele sunt blocate numai in cazul in care clauza FOR UPDATE face o referire I o coloand din acea tabela. Cursori si tabele index BY 3 Exemplu: Se creeazd tabela SITUATIE care stochouzd informasii referitoare la camenzi: codul, valoarea comertzii, Se adaugd in aceasta coloana TVA, care va pastra valoarea cotei TVA (19%%) pentru fiecare comandd. Se creeaza un cursor edruia ise adaugd clauza FOR UPDATE pentru a bloca liniite afectate din tabeld, atunci cded cursorud este deschis, iar pentru flecare comandé din cursor se va eatcula valoarea TVA, DROP TABLE situatie; CREATE TABLE situatie AS SELECT c.nr_comanda cod, SUM(x.cantitate*r.pret) as valoare FROM comenzi ¢, rand _comenzi r WHERE ¢. nr_comanda =r. nr_comanda AND c.modalitate= ‘online’ GROUP BY c. nr_comanda; ALTER TABLE situatie ADD(tva NUMBER (10) ); DECLARE CURSOR c_situatie Is SELECT cod, valoare, tva FROM situatie FOR UPDATE OF tva NOWAIT; BEGIN FOR rec_situatie IN c_situatie LOOP UPDATE situatie SET tvaevaloare*0.19 WHERE cod=rec_situatie.cod; DEMS_OUTPUT. PUT_LINE('Comanda '||rec_situatie.cod||' are valoarea totala de ‘| |vee_situatie.valoare||" RON si TVA de: '||rec_situatie.tva ); END LOOP; END; / SELECT * FROM situatie; Zt Bare de date. Limbajul PL/SQr, rae ses 57 toweraleen (oem cabin pitunneok: OR TEL coam 9 ‘mm Ler ome AG Panay tae “YH Opts leer fo 9 Figura §.13 Execufia blocului PLISQL Atengic: In cazul de mai sus se Poate observa faptul cA atributul ee TVA este NULL dupa execulia comenzii UPDATE deoarece nu se actualizeaza automat si cursorul odatii cu tabela, Acesta trebuic inchis i redeschis pentru a fi vizibile actualizirile din tabeli. , Penta manipularea cit mai usoari a i _ en comenzilor DML. UPDATE gi DELETE se Poate utiliza clawza WHERE CURRENT OF care ‘aa Actualizarea Inregistririlor pe baza liniei curente din cursor, UPDATE tabela SET camp=.... WHERE CURRENT OF nume_cursor; Cursori si tabele index BY bid Se poate referi linia din tabela originarii, pentru actualizare sau stergere, prin intermediull linici curente a cursorului (cea procesaté de ultima instructiune FETCH). Clauza FOR UPDATE trebuie inclus’ in definijia cursorului pentru a ploca liniile in momentul executici instructiunii OPEN, Exemplu: Exemplul de mai sus poate fi rescris, actwelizarea fnregistrdrifor din tabela SITUATIE realizandu-se cu clanza WHERE CURRENT OF: DROP TABLE situatie; CREATE TABLE situatie AS SELECT c.nr_comanda cod, SUM(x.cantitatetr.pret) as valoare FROM comenzi c, rand _comenzi r WHERE c. nr_comanda =r. nr_comanda AND c.modalitate= 'online' GROUP BY ¢. nr_ecomanda; ALTER TABLE situatie ADD(tva NUMBER (10) ); DECLARE CURSOR c_situatie IS SELECT cod, valoare, tva FROM situatie FOR UPDATE OF tva NOWAIT; BEGIN FOR rec_situatie IN c_situatie LOOP UPDATE situatie SET tvasvaloare*0.19 WHERE CURRENT OF c_situatie; DBMS_OUTPUT.. PUT_LINE ('Comanda. ‘| |zec_situatie.cod||' are valoarea totala de ‘| |zec_situatie.valoare||' RON ei tva de: ‘| |rec_situatie.tva }; = Haze de date. Limbajul PLISQL, Exereitii propuse + Afigati toti angajatii si comenvile incheiate de fiecare dintre acestia, Folositi un cursor pentru a inckrca numele angajejilor si un cursor Parametrizat periinu inckrcarea comenzilor incheiate de acegtia. Afigati informarii despre primele 3 comenzi care au cea mai mare valoare. Afigaliinformatii despre primii 5 salariaji angajati (se va realiza filtrarea in fimetic de cdmpul Data_Angajare). kt TRATAREA EXCEPTIILOR © exceptic reprezinti un identificator PL/SQL asociat unei conditii anormale apiinate in ti unui bloc. Invocarea unei exceptii are ca efect ferminarea blocului gi intreruperea execufiei normale a programului. Pentru evitarea unor situatii de intrerupere anormalii, exceptia poate fi captath si poate fi spocificat’ o muting de tatare a acesteia, Existi doud cazuri distincte de aparitic a erorilor: a. Erorile sunt generate Ia nivelul serverului Oracle si exceptia asociata ei esic aulomat invocatii: b. Excepfiile sunt definite de utilizator 3i declangata in mod explicit prin instructiunea RAISE utilizatd in cadnal blocului. Dacd exceptia este declangata in sectiunea executabild a unui bloc atunci se caula in cadrul sectiunii de tratare a exceptiilor o rutind de tratare asociat’, Daca PL/SQL poate trata exceptia, ca nu este propagata in blocul exterior sau in mediul apelant, caz in care se considera cA executia blocului s-a desfiisurat cu succes, Dacd Hu exist © rutind pentru tratarea ei, excepfia este propagata in mediul apelant, caz in care executia blocului se termina cu egec, ul exec

You might also like