Differences

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

Link to this comparison view

bd2:laboratoare:03 [2020/10/17 12:35]
ciprian.truica
bd2:laboratoare:03 [2020/10/22 13:21] (current)
ciprian.truica
Line 13: Line 13:
 Sunt trei tipuri de excepții: Sunt trei tipuri de excepții:
   * Predefinite = sunt excepții tratate automat de către sistemul de gestiune;   * Predefinite = sunt excepții tratate automat de către sistemul de gestiune;
-  * Nedefinite = sunt excepții ​netratate ​de către sistemul de gestiune, ​dar au coduri de eroare tip ORA-.... Aceste erori pot fi interceptate și tratate de programator;​+  * Nedefinite = sunt excepții ​tratate ​de către sistemul de gestiune, au coduri de eroare tip ORA-.... Aceste erori pot fi interceptate și tratate de programator ​daca li se atașează un nume;
   * Definite = sunt excepții definite și tratate de o secvență de program specificată de programator.   * Definite = sunt excepții definite și tratate de o secvență de program specificată de programator.
  
Line 52: Line 52:
 <color red>Ex. 1</​color>​ Să se introducă un ID de departament de la tastatură și să se afișeze la terminal numele acestuia: <color red>Ex. 1</​color>​ Să se introducă un ID de departament de la tastatură și să se afișeze la terminal numele acestuia:
  
-{{:​bd2:​laboratoare:​l03ex01a.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex1_new.png?600|}}
  
-Se observă că pentru ​deptno ​= 10 blocul funcționează normal. Pentru deptno = 50 se generează o eroare ORA-01403 deoarece în tabela dept nu există acest departament.+Se observă că pentru ​idDepartament ​= 10 blocul funcționează normal. ​
  
-{{:​bd2:​laboratoare:​l03ex01b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex1_new_succes.png?​400|}} 
 + 
 +Pentru idDepartament = 1 se generează o eroare ORA-01403 deoarece în tabela departments nu există acest departament. 
 + 
 +{{:​bd2:​laboratoare:​lab3_ex1_new_fail.png?600|}}
  
 <​note>​ <​note>​
Line 64: Line 68:
 <color red>Ex. 2</​color>​ Tratarea excepție no_data_found pentru blocul precedent: <color red>Ex. 2</​color>​ Tratarea excepție no_data_found pentru blocul precedent:
  
-{{:​bd2:​laboratoare:​l03ex02a.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex2_new.png?600|}}
  
-Rezultatul execuției pentru ​deptno ​50 este:+Rezultatul execuției pentru ​idDepartament ​este:
  
-{{:​bd2:​laboratoare:​l03ex02b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex2_new_succes.png?400|}}
  
  
Line 109: Line 113:
 </​note>​ </​note>​
  
-<color red>Ex. 3</​color>​ În următorul exemple, se dorește să se facă o inserare în tabelul ​emp a unui nou angajat, dar fără să i se atribuie un empno, care este o coloană definită de tip not null.+<color red>Ex. 3</​color>​ În următorul exemple, se dorește să se facă o inserare în tabelul ​employees ​a unui nou angajat, dar fără să i se atribuie un employee_id, care este o coloană definită de tip not null.
  
-{{:​bd2:​laboratoare:​l03ex03a.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex3_new.png?600|}}
  
 Rezultatul execuției este: Rezultatul execuției este:
  
-{{:​bd2:​laboratoare:​l03ex03b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex3_new_succes.png?600|}}
  
-Se observă că funcția SQLCODE a generat eroarea ORA-01400 cu mesajul cannot insert NULL into (“STUDENT”.”EMP”.”EMPNO”).+Se observă că funcția SQLCODE a generat eroarea ORA-01400 cu mesajul cannot insert NULL into (“SYSTEM”.”EMPLOYEES”.”EMPLOYEE_ID”).
  
-Codul de eroare a fost interceptat de excepția insert_angajat,​ tratarea acesteia fiind înfăptuită prin afișarea mesajului ‘Nu se accepta inregistrari noi in tabela ​emp fara empno’.+Codul de eroare a fost interceptat de excepția insert_angajat,​ tratarea acesteia fiind înfăptuită prin afișarea mesajului ‘Nu se accepta inregistrari noi in tabela ​employees ​fara employee_id’.
  
 Motorul PL/SQL generează propriile coduri de eroare în formatul PLS-xxxxx, unde xxxxx este codul de eroare. Acest cod este diferit de codul ORA-yyyyy generat de SGBD. Un cod de eroare PL/SQL este prefațat de literele PLS și urmat de un număr unic. Cu ajutorul acestui număr se poate identifica definiția erorii folosindu-se documentația ORACLE. Motorul PL/SQL generează propriile coduri de eroare în formatul PLS-xxxxx, unde xxxxx este codul de eroare. Acest cod este diferit de codul ORA-yyyyy generat de SGBD. Un cod de eroare PL/SQL este prefațat de literele PLS și urmat de un număr unic. Cu ajutorul acestui număr se poate identifica definiția erorii folosindu-se documentația ORACLE.
Line 125: Line 129:
 <color red>Ex. 4</​color>​ Se modifică exemplul 3 adăugându-se în secțiunea EXCEPTION tratarea unei excepții care nu a fost declarată. <color red>Ex. 4</​color>​ Se modifică exemplul 3 adăugându-se în secțiunea EXCEPTION tratarea unei excepții care nu a fost declarată.
  
-{{:​bd2:​laboratoare:​l03ex04a.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex4_new.png?600|}}
  
 Rezultatul execuției este: Rezultatul execuției este:
  
-{{:​bd2:​laboratoare:​l03ex04b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex4_new_succes.png?500|}}
  
 Un program PL/SQL își încetează execuția la detectarea unei erori interne de execuție, cu excepția cazului în care sunt tratate excepțiile în alt mod de catre programator. În anumite cazuri, programul nu trebuie să-și înceteze execuția atunci când apare o eroare. Se pot include secvențe de program care să trateze erorile astfel încât procesarea să continue și după detectarea erorilor de execuție. Un program PL/SQL își încetează execuția la detectarea unei erori interne de execuție, cu excepția cazului în care sunt tratate excepțiile în alt mod de catre programator. În anumite cazuri, programul nu trebuie să-și înceteze execuția atunci când apare o eroare. Se pot include secvențe de program care să trateze erorile astfel încât procesarea să continue și după detectarea erorilor de execuție.
Line 168: Line 172:
 <color red>Ex. 5</​color>​ Pentru angajații dintr-un departament,​ al cărui ID se introduce de la tastatură, care au comision null, să se genereze o excepție definită. <color red>Ex. 5</​color>​ Pentru angajații dintr-un departament,​ al cărui ID se introduce de la tastatură, care au comision null, să se genereze o excepție definită.
  
-{{:​bd2:​laboratoare:​l03ex05a.jpg?600|}}+{{:​bd2:​laboratoare:​lab3_ex5_new.png?600|}}
  
-Rezultatul execuției este:+Rezultatul execuției ​pentru idDepartament = 20 este:
  
-{{:​bd2:​laboratoare:​l03ex05b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex5_new_succes.png?400|}}
  
 Excepția definită se numește lipsaComision și se tratează prin afișarea mesajului ‘lipsa comision’. Se observă că excepția nu se declanșează pe o eroare ci se verifică în secvența IF dacă comisionul angajatului este null. Dacă o excepție este generată într-un bloc, iar acesta nu are secțiunea EXCEPTION, sau nu se dorește tratarea ei în blocul în care este generată, atunci excepția poate fi tratată în blocul superior sau în blocul apelant. Excepția definită se numește lipsaComision și se tratează prin afișarea mesajului ‘lipsa comision’. Se observă că excepția nu se declanșează pe o eroare ci se verifică în secvența IF dacă comisionul angajatului este null. Dacă o excepție este generată într-un bloc, iar acesta nu are secțiunea EXCEPTION, sau nu se dorește tratarea ei în blocul în care este generată, atunci excepția poate fi tratată în blocul superior sau în blocul apelant.
Line 182: Line 186:
 <color red>Ex. 6</​color>​ Să se trateze excepția lipsaComision din exercițiul 5 în blocul principal. <color red>Ex. 6</​color>​ Să se trateze excepția lipsaComision din exercițiul 5 în blocul principal.
  
-{{:​bd2:​laboratoare:​l03ex06a.jpg?600|}}+{{:​bd2:​laboratoare:​lab3_ex6_new.png?600|}}
  
-Rezultatul execuției este:+Rezultatul execuției ​pentru idDepartament = 20 este:
  
-{{:​bd2:​laboratoare:​l03ex06b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex6_new_succes.png?400|}}
  
 Se observă că execuția se oprește în momentul în care apare primul angajat fără comision. Această funcționalitate anormală apare din cauza faptului că excepția care apare în sub-bloc este tratată în blocul principal, astfel se face o ieșire forțată din buclă. Se observă că execuția se oprește în momentul în care apare primul angajat fără comision. Această funcționalitate anormală apare din cauza faptului că excepția care apare în sub-bloc este tratată în blocul principal, astfel se face o ieșire forțată din buclă.
Line 206: Line 210:
 <color red>Ex. 7</​color>​ Pentru un angajat care nu are comision să se definească o eroare care este tratată în momentul generării excepției și care are codul de eroare -20100. <color red>Ex. 7</​color>​ Pentru un angajat care nu are comision să se definească o eroare care este tratată în momentul generării excepției și care are codul de eroare -20100.
  
-{{:​bd2:​laboratoare:​l03ex07a.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex7_new.png?600|}}
  
-Rezultatul execuției este:+Rezultatul execuției ​pentru ecuson = 100 este:
  
-{{:​bd2:​laboratoare:​l03ex07b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex7_new_succes.png?400|}}
  
 Sunt situații când un program PL/SQL poate avea o funcționalitate diferită, în privința excepțiilor,​ din cauza erorilor generate de catre sistemul de gestiune. Sunt situații când un program PL/SQL poate avea o funcționalitate diferită, în privința excepțiilor,​ din cauza erorilor generate de catre sistemul de gestiune.
Line 216: Line 220:
 <color red>Ex. 8</​color> ​ Să se calculeze suma veniturilor angajaților dintr-un departament care au o anumită funcție. <color red>Ex. 8</​color> ​ Să se calculeze suma veniturilor angajaților dintr-un departament care au o anumită funcție.
  
-{{:​bd2:​laboratoare:​l03ex08a.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex8_new.png?600|}}
  
-Rezultatul execuției este:+Rezultatul execuției ​pentru idDepartament = 80 și functie = SA_REP ​este:
  
-{{:​bd2:​laboratoare:​l03ex08b.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex8_new_succes.png?400|}} 
 + 
 +Rezultatul execuției pentru idDepartament = 10 și functie = SA_REP este: 
 + 
 +{{:​bd2:​laboratoare:​lab3_ex8_new_fail.png?​400|}} 
 + 
 +Rezultatul execuției pentru idDepartament = 1 și functie = SA_REP este: 
 + 
 +{{:​bd2:​laboratoare:​lab3_ex8_new_fail2.png?​400|}}
  
 Dacă din prima cerere SELECT se scoate clauza GROUP BY, adică: Dacă din prima cerere SELECT se scoate clauza GROUP BY, adică:
  
-{{:​bd2:​laboratoare:​l03ex08c.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex8b_new.png?600|}} 
 + 
 +Rezultatul execuției blocului fără cererea group by pentru idDepartament = 80 și functie = SA_REP este: 
 + 
 +{{:​bd2:​laboratoare:​lab3_ex8b_new_succes.png?​400|}} 
 + 
 +Rezultatul execuției blocului fără cererea group by pentru idDepartament = 10 și functie = SA_REP este: 
 + 
 +{{:​bd2:​laboratoare:​lab3_ex8b_new_fail.png?​400|}}
  
-Rezultatul execuției blocului fără cererea group by este:+Rezultatul execuției blocului fără cererea group by pentru idDepartament = 1 și functie = SA_REP ​este:
  
-{{:​bd2:​laboratoare:​l03ex08d.png?600|}}+{{:​bd2:​laboratoare:​lab3_ex8b_new_fail2.png?400|}}
  
-Se observă că de data aceasta excepția s-a declanșat numai pentru departamentul ​50, cu toate că departamentul ​40 nu are niciun angajat. În mod normal, SELECT ar trebui să declanșeze o excepție, dar funcția SUM întoarce o valoare null, astfel încât nu se declanșează excepția predefinită no_data_found.+Se observă că de data aceasta excepția s-a declanșat numai pentru departamentul ​1, cu toate că departamentul ​10 nu are niciun angajat ​cu funcția SA_REP. În mod normal, SELECT ar trebui să declanșeze o excepție, dar funcția SUM întoarce o valoare null, astfel încât nu se declanșează excepția predefinită no_data_found.
  
 <​note>​ <​note>​
bd2/laboratoare/03.1602927353.txt.gz · Last modified: 2020/10/17 12:35 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