Differences

This shows you the differences between two versions of the page.

Link to this comparison view

bd2:laboratoare:01 [2020/10/03 17:23]
ciprian.truica [Exerciții rezolvate]
— (current)
Line 1: Line 1:
-====== Laboratorul 01 - PL/SQL Introducere ====== 
-Exercitii date spre rezolvare: {{bd2:​laboratoare:​lab01_-_luni08-12.txt | Enunt/​Rezolvare pentru Luni EG305 10-14}} 
- 
- 
-===== Obiective ===== 
- 
-  * Introducere în PL/SQL​ 
-  * Blocuri de instrucțiuni PL/SQL​ 
-  * Rularea blocurilor PL/SQL în SQL*Plus​ 
-  * Tipuri de variabile 
-  * Tipuri de operatori​ 
-  * Tipuri de simboluri​ 
-  * Domeniul variabilelor și constantelor​ 
-  
- 
-===== Noțiuni teoretice ===== 
- 
-**PL/SQL** este un limbaj structurat pe blocuri​. Are caracteristici de procesare procedurală și de tratare a erorilor​. Blocurile pot fi de două tipuri:​ 
-  * Blocuri anonime​ 
-  * Subprograme(proceduri,​ funcții sau triggere)​ 
- 
-Deoarece **PL/SQL** este o extensie pentru SQL, regulile sintactice de bază aplicabile în SQL sunt valabile și în PL/SQL:​ 
-  * Instrucțiunile pot avea mai multe linii cu excepția cuvintelor cheie;​ 
-  * Unitățile lexicale (identificatori,​ nume de operatori) pot fi separate de unul sau mai multe spații, sau alt delimitator care nu poate face parte din unități lexicale;​​ 
-  * Cuvintele rezervate nu pot fi folosite ca identificatori decât între ghilimele duble;​ 
-  * Identificatorii (nume de variabile, functii, proceduri, etc.) trebuie să înceapă cu o literă și pot conține cel mult 30 caractere​ 
-  * Șirurile trebuie să fie marcate cu ghilimele simple;​ 
-  * Numerele pot fi reprezentate prin valoarea lor sau științifică;​ 
- 
-**PL/SQL** permite o varietate de tipuri de date ce pot fi folosite pentru declararea de variabile și constante​. Variabilele pot avea, opțional, atribuite valori la declarare și pot să-și schimbe valoarea prin atribuiri ulterioare în cadrul blocului. Constantele sunt identificatori care păstrează o valoare fixă ce trebuie atribuită în momentul declarării. Instructiunile PL/SQL nu sunt case sensitive. Setul de caractere este format din literele mari și mici, cifrele de la 0-9, spații, caractere de tabulare, carriage return și simboluri special. 
- 
-==== Blocuri Anonime ==== 
- 
-Blocul anonim are cea mai simplă structură și este compus din trei părți:​ 
-  * Declare - conține definirea tuturor variabilelor care vor fi folosite în procesul de execuție​ 
-  * Execuție - conține instrucțiuni DML și bucle de execuție​ 
-  * Excepții - conține rutinele de interceptare și tratare a erorilor​ 
- 
-Fiecare bloc începe cu unul dintre cuvintele cheie **DECLARE** sau **BEGIN**. Cuvântul **BEGIN** este punctul de început al blocului ​de execuție. Înainte de executarea unui bloc se golește bufferul SQL​. 
- 
-Structura logică a unui bloc **PL/SQL** anonim este:​ 
- 
-{{:​bd2:​laboratoare:​block.png?​600|}} 
- 
-<color red>Ex. 1.</​color>​ Să se selecteze numele si functia unui angajat introducand id-ul acestuia de la tastatura (testați cu 1, 100 și 200). 
- 
-{{:​bd2:​laboratoare:​l01ex01.png?​600|}} 
- 
-<note important>​ 
-Observații:​ 
-  * Pentru a afișa mesaje în **SQL*Plus** și **SQL Developer** se va folosi comanda:​ <color red>set serveroutput on​</​color>​ 
-  * Funcția care afișează mesaje în **SQL*Plus** și **SQL Developer** este:​ <color red>​dbms_output.put_line(string);​​</​color>​ 
-  * Concatenarea șirurilor de caractere se face folosind operatorul <color red>​||​</​color>,​ e.g., **'​Numele angajatului este ' <color red>​||​</​color>​ nume​** 
-  * Pentru a folosi comanda **SELECT** într-un bloc se va folosi o structură de forma: **SELECT COLOANA1, COLOANA2,​... INTO <color red>​VARIABILA1,​ VARIABILA2, ...</​color>​ FROM TABEL1,... ** 
-  * Variabilele <color red>​VARIABILA1,​ VARIABILA2, ...</​color>​ sunt declarate în secțiunea **DECLARE**​ 
-  * Blocurile DECLARE și EXCEPTION nu sunt obligatorii 
-  * Pentru a da o variabilă de la tastatură se folosește ​ **&** 
-  * O variabliă poate avea acea celași data tip ca o altă variabilă sau o coloană dintr-un tabel (ex. <color red>​functie jobs.job_title%type;​ </​color>​). 
-  * Știind că variabila **functie** va trebui să fie de același tip precum coloana **job_title** din tabelul **jobs**, am folosit tipul de variabilă corelat <color red>​**%TYPE**</​color>​ 
-  * Comentariile pe mai multe linii se delimitează cu ** ''/''''​*''​...''​*''''/''​ ​** 
-  * Comentariile pe o singură linie se marchează cu două linii orizontale <color red>''​-''''​-​''​ </​color>​ 
-  * Comentatiile pe o singură linie nu înhibă funționalitatea caracterelor,​ în schimb cele pe mai multe linii o fac. 
-    *  Daca folosesc urmatoarul comentariu <color red>''​-''''​-​''​acest **&** se va executa </​color>,​ atunci compilatorul va cere o valoare pentru variabila de substituție **&** din comentariu. 
-    * Dacă folosesc <color red> ''/''''​*''​ acest **&** nu se va executa ''​*''''/''​ ​</​color>,​ atunci compilatorul **nu** va cere o valaore pentru variabila de substituție **&** din comentariu. 
-</​note>​ 
- 
- 
-==== Blocuri Înlănțuite ==== 
- 
-Blocurile anonime pot fi înlănțuite. Execuția se face secvențial. Declararea variabilelor pentru toate blocurile înlănțuite se face o singură data în secțiunea **DECLARE**. 
- 
-Structura logică pentru un bloc înlănțuit este:​ 
- 
-<code sql> 
-[<<​label>>​] -- etichetă bloc (opțional) 
-[DECLARE] ​ -- (opțional)​ 
-  -- variabile pentru blocurile partinte și copii 
-BEGIN ​-- start bloc parinte 
-    [DECLARE] -- (opțional)​ 
-      -- variabile pentru blocul copil_1 
-    BEGIN -- start blocul copil_1​ 
-      -- accesibile variabilele declarate în blocurile 
-      -- parinte și copil_1 
-    [EXEPTION] -- (opțional)​ 
-      -- interceptarea și tratarea excepțiilor blocul copil_1​ 
-    END; -- sfârșit bloc copil_1​ 
- 
-    [DECLARE] -- (opțional)​ 
-      -- variabile pentru blocul copil_2 
-    BEGIN -- start blocul copil_2​ 
-      -- accesibile variabilele declarate în blocurile 
-      -- parinte si copil_2 
-    [EXCEPTION] -- (opțional)​ 
-      -- interceptarea și tratarea excepțiilor bloc 2 
-    END; -- sfârșit bloc copil_2​ 
-[EXCEPTION] -- (opțional)​ 
-  -- interceptarea și tratarea excepțiilor bloc principal ​ 
-  -- si orice alta exceptie netratata în blocurile copii  
-END;​ -- sfârșit bloc parinte 
-</​code>​ 
- 
-<color red> Ex. 2. </​color>​ Să se insereze un nou angajat, astfel: 
-  * se introduce de la tastatura id-ul departamentului,​ id-ul angajatului,​ prenumele și numele 
-  * data angajarii este data curenta **sysdate** 
-  * salariul ese 2123.85 
-  * id-ul managerului este cel al managerului de departament care are cei mai mulți angajați. Dacă sunt mai mulți manageri cu același număr de angajați se ia managerul care are id-ul cel mai mic. 
-După insert să se adauge pentru acest angajat un punctaj pentru comision de 0.5.​ 
- 
- 
- 
-{{:​bd2:​laboratoare:​l01ex02.png?​600|}} 
- 
- 
-==== Blocuri Imbricate ==== 
- 
-Blocurile imbricate sunt blocuri care se execută în interiorul altui bloc. Se mai numesc și sub-blocuri. **Variabile pot fi transmise de la bloc la sub-bloc, nu și invers.​** 
- 
-Structura logică pentru un bloc imbricat este:​ 
- 
-<code sql> 
-[<<​label>>​] -- etichetă bloc (opțional) 
-[DECLARE] -- (opțional)​ 
-  --  variabile bloc principal, bloc 1, bloc 2, bloc 3​  
-BEGIN​ 
-    [DECLARE] -- (opțional)​ 
-      --  variabile bloc 1, bloc 2, bloc 3​ 
-    BEGIN -- bloc 1​ 
-        [DECLARE] ​ -- (opțional)​ 
-          --  variabile bloc 2, bloc 3​ 
-        BEGIN -- bloc 2​ 
-            [DECLARE] ​ -- (opțional)​ 
-              --  variabile bloc 3​ 
-            BEGIN -- bloc 3​ 
-            [EXCEPTION] -- (opțional)​ 
-              -- tratare erori bloc 3 
-            END; -- bloc 3​ 
-        [EXCEPTION] -- (opțional)​ 
-          -- tratare erori bloc 2 
-          -- tratarea erorilor propagate din blocul 3 
-        END; -- bloc 2​ 
-    [EXCEPTION] -- (opțional)​ 
-      -- tratare erori bloc 1​ 
-      -- tratarea erorilor propagate din blocul 2 și 3 
-    END; -- bloc 1​ 
-[EXCEPTION] -- (opțional)​ 
-  -- tratare erori bloc principal 
-  -- tratarea erorilor propagate din blocurile 1, 2 și 3 
-END;​ 
-</​code>​ 
- 
-<color red>Ex. 3.</​color>​ Să se rezolve exercițiul anterior folosind blocuri imbricate.​ 
- 
-{{:​bd2:​laboratoare:​l01ex03.png?​600|}} 
- 
-==== Executarea blocurilor PL/SQL în SQL*Plus​ (Opțional) ==== 
- 
-În cazul în care nu aveți acces la un IDE, puteți să vă conectați la un Server ORACLE folosind utilitarul în linie de comandă **SQL*Plus**. (Mai multe dedalii în [[https://​ocw.cs.pub.ro/​courses/​bd/​laboratoare/​02|Laboratorul 2 -  Baze de date]]) 
- 
- 
-Pentru a vă conecta la SQL*Plus în consolă comanda care se folosește este: 
-<code sql> 
-sqlplus [username[/​password[@bazadate]]] 
-</​code>​ 
- 
-Blocurile **PL/SQL** pot fi editate direct în **SQL*Plus** (nerecomandat) sau pot fi editate în orice editor de text​. ​ 
-Pentru a executa un bloc în **SQL*Plus** folositi una din comenzile (comanda intreagă sau abrevierea):​ 
- 
-^Comandă ​     ^Abreviere ^Utilizare ​                                              ^ 
-|RUN​ ​         |R​         ​|Afișează și execută blocul curent din buffer​ ​           | 
-|             ​|/​​ ​        ​|Execută blocul curent din buffer​ ​                       | 
- 
- 
-În **SQL*Plus** 
-  * Un bloc rămâne în buffer până la editarea următorului bloc​. 
-  * Un bloc poate fi scris pe mai multe rânduri (folosiți ENTER pentru a începe o nouă linie) 
- 
-În **SQL*Plus** un bloc se poate executa astfel:​ 
-  * Se copiază blocul în editor (Copy/​Paste) și se execută cu / sau RUN​ 
-  * Se execută tot scriptul (care poate să conțină mai multe blocuri) folosind:​​ 
-    * SQL> @cale_fieier\nume_fisier.sql​ 
-    * SQL> start cale_fieier\nume_fisier.sql​ 
- 
-<note tip> 
-Dacă executați sau copiați codul dintr-un fișer, se recomandă adaugarea unui forward slash (/) -- comanda de executare a blocului -- după ultimul **END**. 
-</​note>​ 
- 
-În linia de comandă se mai pot da și următoarele comenzi: 
-  * SAVE file_path_and_name – permite salvarea într-un fișier a conținutului bufferului SQL*Plus; 
-  * GET file_path_and_name – încarcă conținutul unui fișier salvat în prealabil în buffer; 
-  * START file_path_and_name – lansează în execuție comenzile salvate în fișier; 
-  * @file_path_and_name – execută comenzile din fișier; 
-  * EXIT – ieșire din SQL*Plus. 
- 
-Comenzi **SQL*Plus** utile pentru formatare 
- 
-^Comandă​ ​            ^ Utilizare ​                                   ​^ 
-|set serveroutput on | Permite afișarea în SQL*Plus​ ​                | 
-|set lines n​         | Permite printarea a n caractere pe verticală​ | 
-|set pages n​         | Permite printarea a n coloane​ ​               | 
- 
- 
- 
-===== Tipuri variabile ===== 
- 
-PL/SQL acceptă toate tipurile de date din SQL. Nu sunt permise referințe anticipate, deci toate variabilele și constantele trebuie să fie declarate în secțiunea **DECLARE** înainte de utilizare. În secțiunea **DECLARE** trebuie declarate numele și tipul fiecărei variabile utilizate în cadrul blocului. Tipul specifică formatul de memorare, restricțiile și un domeniu valid de valori. Sintaxa declarării unei variabile este următoarea:​​ 
- 
-<code sql> 
-nume_var [CONSTANT]{tip_de_date|identificator%TYPE|identificator%ROWTYPE}[NOT NULL][{:​=|DEFAULT} expresie_PL/​SQL];​​ 
-</​code>​ 
- 
- 
-==== Tipuri de date scalare​ ==== 
- 
-Tipurile de date scalare​ nu au componente interne (conţin valori atomice). 
- 
-Tipurile de date ce stochează valori numerice cuprind:​ 
-  * tipul NUMBER cu subtipurile DEC, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INT, NUMERIC, REAL, SMALLINT;​​ 
-  * tipul BINARY_INTEGER cu subtipurile NATURAL, NATURALN, POSITIVE, POSITIVEN, SIGNTYPE; ​ 
-  * tipul PLS_INTEGER.​ 
- 
-Tipurile de date ce stochează caractere cuprind:​ 
-  * tipul VARCHAR2 cu subtipurile STRING, VARCHAR;​ 
-  * tipul de date CHAR cu subtipul CHARACTER;​​ 
-  * tipurile LONG, RAW, LONG RAW, ROWID​ 
- 
-Tipurile de date ce stochează data calendaristica si ora cuprind tipurile: 
-  * DATE 
-  * TIMESTAMP 
-  * TIMESTAMP WITH TIME ZONE 
-  * TIMESTAMP WITH LOCAL TIME ZONE 
-  * INTERVAL YEAR TO MONTH 
-  * INTERVAL DAY TO SECOND;​ 
- 
-Tipurile de date ce stochează date în format unicode includ tipurile 
-  * NCHAR  
-  * NVARCHAR2;​​ 
- 
-Tipul de date BOOLEAN stochează valori logice (true, false sau null) 
- 
-Exemple: 
- 
-<code sql> 
-v_valoare NUMBER(15) NOT NULL := 0;​ 
-v_data_achizitie DATE DEFAULT SYSDATE;​ 
-v_material VARCHAR2(15) := '​Matase';​​ 
-c_valoare CONSTANT NUMBER := 100000;​ 
-v_stare VARCHAR2(20) DEFAULT '​Buna';​​ 
-v_clasificare BOOLEAN DEFAULT FALSE;​ 
-int_an_luna INTERVAL YEAR TO MONTH :=​ 
-INTERVAL '​3-2'​ YEAR TO MONTH; --interval de 3 ani si 2 luni​ 
-</​code>​ 
- 
- 
-<color red>Ex. 4.</​color>​ Să se scrie un bloc PL/SQL care primește de la tastatură un id de angajat și va afișa un mesaj cu forma: '​**nume_angajat** are un venit orar de **venit_orar** și face parte din departamentul **denumire_departament**. A lucrat în firma un număr total de **zile_lucrate** zile'. În caz că angajatul nu există să se trateze eroarea. 
- 
-{{:​bd2:​laboratoare:​l01ex04.png?​600|}} 
- 
-==== Tipuri de date corelate​ ==== 
- 
-Tipurile corelate sunt folosite pentru a declara variabile de tipul unui rând de tabel sau al unei coloane de tabel. Avantajul folosirii unor astfel de tipuri este că atunci când se modifică structura coloanelor dintr-un tabel nu mai trebuie să fie modificat și codul **PL/SQL**. 
- 
-Tipuri corelate:​​ 
-  * %TYPE - variabilă de tipul unei coloane de tabel​ 
-  * %ROWTYPE - vector de tipul unui rând de tabel 
- 
-<color red> Ex. 5.</​color>​ Să se scrie un bloc PL/SQL care primește de la tastatură un id de angajat și afișează numele, funcția acestuia, departamentul și locația departamentului. Locația deopartamentului va cuprinde orașul, statul/​județul,​ țara și regiunea.​ 
- 
-{{:​bd2:​laboratoare:​l01ex05.png?​600|}} 
- 
-==== Tipuri de date LOB ==== 
- 
-Tipuri LOB (Large OBject) sunt folosite pentru stocarea de date binare, text, imagini și fișiere video de dimensiuni mari (până la 4GB).​ 
- 
- 
-^Data Type​ ^Description​ ^ 
-|CLOB​ ​     |A character large object containing single-byte or multibyte characters. Both fixed-width and variable-width character sets are supported, both using the database character set. Maximum size is (4 gigabytes - 1) * (database block size).​| 
-|NLOB​ ​     |A character large object containing Unicode characters. Both fixed-width and variable-width character sets are supported, both using the database national character set. Maximum size is (4 gigabytes - 1) * (database block size). Stores national character set data.​ | 
-|BLOB​ ​     |A binary large object. Maximum size is (4 gigabytes - 1) * (database block size).​| 
-|BFILE​ ​    ​|Contains a locator to a large binary file stored outside the database. Enables byte stream I/O access to external LOBs residing on the database server. Maximum size is 4 gigabytes.​| 
- 
-===== Tipuri de Operatori ===== 
- 
-==== Operatori aritmetici ==== 
- 
-^Operatori aritmetici​ ^Descriere^ 
-| ''​+​'' ​       | Adunare​ ​        | 
-| ''​-'' ​       ​| Scădere ​        | 
-| ''​*'' ​       ​| Multiplicare​ ​   | 
-| ''/'' ​       ​| Împărțire ​  ​​ ​   | 
-| ''​%%**%%'' ​     ​ | Exponențial ​    | 
- 
- 
-==== Operatorii de comparație ==== 
- 
-Operatorii de comparație pot fi feluri: operatori logici și operatori SQL 
- 
- 
-^Operator Logic^Semnificație^ 
-| ''​=''​ | Egal | 
-| ''>''​ | Mai mare decât | 
-| ''>​=''​ | Mai mare sau egal decât | 
-| ''<''​ | Mai mic decât | 
-| ''​%%<​=%%''​ | Mai mic sau egal decât | 
- 
-^Operator SQL^Semnificație^ 
-| ''​val BETWEEN val1 AND val2''​ | Verifică daca o valoare se află între două valori date (inclusiv). Echivalent cu ''​val >= val1 AND val %%<=%% val2''​ | 
-| ''​IN (list)''​ | Compară dacă valoarea se află în lista de valori list. ''​val IN (a,​b,​c)''​ este echivalent cu ''​val = a OR val = b OR val = c''​ | 
-| ''​LIKE string''​ | Compară cu un model de tip caracter/​șir de caractere | 
-| ''​IS NULL''​ | Verifică dacă o valoare este ''​NULL''​ | 
- 
- 
-==== Operatori de negație ==== 
- 
-Operatorii de negație pot fi de două feluri: ​ operatori logici și operatori SQL. 
- 
-^Operator Logic^Semnificație^ 
-| ''​!=''​ | Diferit de (Unix, Windows) | 
-| ''​^=''​ | Diferit de (IBM) | 
-| ''<>''​ | Diferit de (Toate OS) | 
-| ''​NOT val { = | > | >= | < | %%<=%% }''​ | Neagă operatorul de comparație | 
- 
- 
-^Operator SQL^Semnificație^ 
-| ''​NOT BETWEEN val1 AND val2''​ | Verifică daca o valoare nu se află între două valori date (inclusiv) | 
-| ''​NOT IN (list)''​ | Compară dacă valoarea nu se află în lista de valori list. | 
-| ''​NOT LIKE string''​ | Compară cu un model de tip caracter/​șir de caractere | 
-| ''​IS NOT NULL''​ | Verifică dacă o valoare nu este ''​NULL''​ | 
- 
- 
-Precedența operatorilor logici este următoarea:​ 
-  - Operatorii de comparație și operatorii SQL au precedență egală (''​=,<,​%%<​=%%,>,>​=,<>,​!=,​^=, ​ BETWEEN, IN, LIKE, IS NULL''​) 
-  - ''​NOT''​ (pentru inversarea rezultatului unei expresii logice) 
-  - ''​AND''​ 
-  - ''​OR''​ 
- 
-<​note>​ 
-Pentru a fi siguri de ordinea de execuție a operațiilor se recomandă folosirea parantezelor rotunde. 
-Ordinea naturală a operațiilor în cadrul unei expresii este următoarea:​​ 
- 
-^Ordine​^Operație​^Descriere​^ 
-| 1​ | ''​%%**%%'' ​  | exponențial | 
-| 2​ | ''​+'',​ ''​-​''​ | identitate, negație​ | 
-| 3​ | ''​*'',​ ''/​​''​ | înmulțire,​ împărțire​ | 
-| 4​ | ''​+'',​ ''​-'',​ ''​||​''​ | adunare, scădere, concatenare​ | 
-| 5 | ''​='',​ ''​!='',​ ''<'',​ ''>'',​ ''​%<​=%'',​ ''>​='',​ ''​IS NULL'',​ ''​LIKE'',​ ''​BETWEEN'',​ ''​IN​''​ | comparație​ | 
-| 6 | ''​NOT''​​ | negație ​| 
-| 7 | ''​AND​''​ | conjuncție​ | 
-| 8 | ''​OR​'' ​ | incluziune​ | 
- 
-</​note>​ 
- 
-===== Tipuri de simboluri ===== 
- 
-==== Tipuri de simboluri simple ==== 
- 
-^Simbol​^Descriere​^ 
-|''​( )​''​|Delimitator de listă sau expresii​| 
-|'';''​​|Delimitator de instrucțiuni​| 
-|'',​​''​|Separator de obiect​| 
-|''​.''​|Selector de componentă​| 
-|''​@''​​|Delimitator de acces la baza de date​| 
-|'''''​|Delimitator de șir​| 
-|'':''​​|Delimitator de server​| 
-|''​$''​|Format de afișare în USD​| 
-|''&''​​|Variabilă substituită​| 
- 
-==== Tipuri de simbiluri compuse ==== 
- 
-^Simbol​^Descriere​^ 
-|'':​=​''​|Asignare​| 
-|''​=''''>​​''​|Asociere​| 
-|''​..​''​|Rang​| 
-|''​||​''​|Concatenare​| 
-|''<''''<''​ ''>''''>​​''​|Etichetă​| 
-|''​-''''​-​''​|Comentariu pe o singură linie​| 
-|''/''''​*''​ ''​*''''/''​|Comentatiu pe mai multe linii​| 
- 
-<note important>​ 
-Nu sunt permise spații între cele două caractere ale simbolurilor compuse.​ 
-</​note>​ 
- 
-===== Domeniul variabilelor și constantelor​ ===== 
- 
-Domeniul de valabilitate al variabilelor reprezintă zona unui program în care acestea pot fi folosite. Variabilele și constantele pot fi declarate în cadrul blocului în care au fost definite sau în orice sub-bloc inclus în acesta. Variabilele declarate într-un sub-bloc pot fi folosite doar în acesta sau în sub-blocurile acestuia. Variabilele se pot transmite de la un bloc la sub-bloc, dar nu și invers. Aceste constrângeri se aplică tuturor obiectelor declarate, inscusiv cursoare, constante și excepții definite de utilizator.​ 
- 
- 
-<​note>​ 
-În sub-bloc se pot folosi atât variabilele definite local cât și cele din blocul superior. Dacă într-un sub-bloc se definește o variabilă cu același nume ca una dintr-un bloc superior atunci are prioritate cea locală, dezactivându-se variabila definită în blocul superior. Se recomandă să se evite astfel de situații pentru a nu crea confuzii.​ 
-</​note>​ 
- 
-{{:​bd2:​laboratoare:​l01dvc.png?​300|}} 
- 
-===== Exerciții rezolvate ===== 
- 
-<color red>Ex. 6.</​color>​ Să se afișeze informațiile despre ultimul angajat care a venit în firmă în anul 2001.​ 
- 
-{{:​bd2:​laboratoare:​l01ex06.png?​600|}} 
- 
-<color red> Ex. 7.</​color>​ Să se găsească care angajat are o vechime de peste 29 de ani si 6 luni in firmă.​ 
- 
-{{:​bd2:​laboratoare:​l01ex07.png?​600|}} 
- 
- 
-Pentru următoarele exerciții se va crea încă un tabel numit mesaje: 
- 
-{{:​bd2:​laboratoare:​l01tabel.png?​300|}} 
- 
-<color red>Ex. 8.</​color> ​ În exemplul următor se prezintă un bloc PL/SQL care face o verificare a numărului de angajați din anul 1992. Dacă nu există nicio angajare, se va declanșa o excepție **no_data_found** și se va insera în tabela mesaje, mesajul numărul 1, iar dacă sunt mai mulți angajați, se va declanșa excepția; **too_many_rows** și se va insera mesajul numărul 2.​ Pentru a vedea rezultatul procedurii se va face un select pe tabela mesaje:​ 
-<code sql>​SQL>​ SELECT * FROM MESAJE; </​code>​ 
- 
-{{:​bd2:​laboratoare:​l01ex09.png?​600|}} 
- 
-<color red>Ex. 9.</​color>​ În exemplul de mai jos se folosesc două blocuri imbricate care afișează numele, data angajării și comisionul unui angajat introducând id-ul angajatului și id-ul departamentului de la tastatură.​ 
- 
-{{:​bd2:​laboratoare:​l01ex10.png?​600|}} 
- 
-<color red>Ex. 10.</​color>​ În următorul exercițiu vom edita un fișier ex7.sql care conține un bloc PL/SQL.​ Să se testeze pentru funcția ANALYST și departamentele 20, 40, 50.​ Executarea fișierului se face în **SQL*Plus** folosind comanda <code sql>​SQL>​@cale_fisier\ex7.sql​</​code>​ 
- 
-{{:​bd2:​laboratoare:​l01ex11.png?​600|}} 
- 
  
bd2/laboratoare/01.1601735029.txt.gz · Last modified: 2020/10/03 17:23 by ciprian.truica
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0