This shows you the differences between two versions of the page.
bd2:laboratoare:04 [2019/10/23 08:52] ciprian.truica [Eficiența cursoarelor] |
bd2:laboratoare:04 [2020/10/22 18:12] (current) vlad_iulian.ilie [Eficiența cursoarelor] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laboratorul 04 - PL/SQL Cursoare ====== | ====== Laboratorul 04 - PL/SQL Cursoare ====== | ||
+ | Exercitii date spre rezolvare: {{bd2:laboratoare:lab04_-_luni10-14.txt | Enunt/Rezolvare pentru Luni EG305 10-14}} | ||
===== Conținut ===== | ===== Conținut ===== | ||
Line 26: | Line 27: | ||
<color red>Ex. 1</color> Exemplu greșit de folosire a unui cursor implicit (returnează mai mute valori care nu pot să fie inserate în variabila salariu): | <color red>Ex. 1</color> Exemplu greșit de folosire a unui cursor implicit (returnează mai mute valori care nu pot să fie inserate în variabila salariu): | ||
- | {{:bd2:laboratoare:l04ex01.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex1_new.png?nolink&350|}} |
<color red>Ex. 2</color> Exemplu corect de folosire a unui cursor implicit (clauza where conține o condiție care garantează că se va întoarce o singură valoare): | <color red>Ex. 2</color> Exemplu corect de folosire a unui cursor implicit (clauza where conține o condiție care garantează că se va întoarce o singură valoare): | ||
- | {{:bd2:laboratoare:l04ex02.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex2_new.png?nolink&350|}} |
- | <color red>Ex. 3</color> Exemplu corect de folosire a unui cursor implicit care returnează mai multe înregistrări (se folosește un nested table în care se inserează salariile angajaților din departamentul 20): | + | <color red>Ex. 3</color> Exemplu corect de folosire a unui cursor implicit care returnează mai multe înregistrări (se folosește un nested table în care se inserează salariile angajaților din departamentul 80): |
- | {{:bd2:laboratoare:l04ex03.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex3_new.png?nolink&600|}} |
==== Cursoare Explicite ==== | ==== Cursoare Explicite ==== | ||
Line 156: | Line 157: | ||
</note> | </note> | ||
- | <color red>Ex. 4</color> Să se declare un cursor care selectează denumirea departamentului, numele angajatului, salariul și data angajării pentru acei angajati care au venit în companie în 1981. | + | <color red>Ex. 4</color> Să se declare un cursor care selectează denumirea departamentului, numele angajatului, salariul și data angajării pentru acei angajati care au venit în companie în 2003. |
- | {{:bd2:laboratoare:l04ex04.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex4_new.png?nolink&740|}} |
<color red>Ex. 5</color> Să se folosească un cursor pentru a face o listă cu veniturile managerilor din companie. | <color red>Ex. 5</color> Să se folosească un cursor pentru a face o listă cu veniturile managerilor din companie. | ||
- | {{:bd2:laboratoare:l04ex05.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex5_new.png?nolink&740|}} |
Setul activ de date definite de cursorul c_angajati este procesat linie cu linie. Ciclul iterativ de citire și procesare a liniilor individuale continuă până la procesarea tuturor liniilor din setul activ. | Setul activ de date definite de cursorul c_angajati este procesat linie cu linie. Ciclul iterativ de citire și procesare a liniilor individuale continuă până la procesarea tuturor liniilor din setul activ. | ||
Line 188: | Line 189: | ||
<color red>Ex. 6</color> Rescriere exemplu 5 folosind FOR. | <color red>Ex. 6</color> Rescriere exemplu 5 folosind FOR. | ||
- | {{:bd2:laboratoare:l04ex06.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex6_new.png?nolink&740|}} |
Într-un ciclu FOR se poate folosi un SELECT care este tot un cursor, dar care nu trebuie să mai fie declarat în secțiunea DECLARE. Sintaxa este: | Într-un ciclu FOR se poate folosi un SELECT care este tot un cursor, dar care nu trebuie să mai fie declarat în secțiunea DECLARE. Sintaxa este: | ||
Line 202: | Line 203: | ||
<color red>Ex. 7</color> Să se rescrie exercițiul 6 folosind un SELECT în ciclul FOR. | <color red>Ex. 7</color> Să se rescrie exercițiul 6 folosind un SELECT în ciclul FOR. | ||
- | {{:bd2:laboratoare:l04ex07.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex7_new.png?nolink&740|}} |
Când ne referim la rândul curent dintr-un cursor explicit comenzile SQL pot folosi clauza WHERE CURRENT OF cursor_name. Această clauză permite actualizarea sau ștergerea în punctul în care se află cursorul, fără a fi necesară folosirea condițiilor în clauza WHERE pentru identificarea unică a liniei. Trebuie să se folosească clauza FOR UPDATE în definirea cursorului pentru a se bloca rândurile la deschidere (se face un lock). | Când ne referim la rândul curent dintr-un cursor explicit comenzile SQL pot folosi clauza WHERE CURRENT OF cursor_name. Această clauză permite actualizarea sau ștergerea în punctul în care se află cursorul, fără a fi necesară folosirea condițiilor în clauza WHERE pentru identificarea unică a liniei. Trebuie să se folosească clauza FOR UPDATE în definirea cursorului pentru a se bloca rândurile la deschidere (se face un lock). | ||
Line 210: | Line 211: | ||
</note> | </note> | ||
- | <color red>Ex. 8</color> Să se modifice comisionul cu 10% din salariu pentru angajații care au peste 20 ani vechime în companie. | + | <color red>Ex. 8</color> Să se modifice comisionul cu 10% din salariu pentru angajații care au peste 18 ani vechime în companie. |
- | {{:bd2:laboratoare:l04ex08.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex8_new.png?nolink&740|}} |
- | <color red>Ex. 9</color> Să se șteargă din tabela EMP toți angajații care au comision. | + | <color red>Ex. 9</color> Să se șteargă din tabela employees toți angajații care nu au comision. |
- | <code sql> | + | |
- | BEGIN | + | {{:bd2:laboratoare:lab4_ex9_new.png?nolink&740|}} |
- | FOR angajat IN (SELECT empno FROM emp WHERE comm IS NULL) | + | |
- | LOOP | + | |
- | DELETE FROM emp | + | |
- | WHERE empno = angajat.empno; | + | |
- | END LOOP; | + | |
- | END; | + | |
- | </code> | + | |
Line 230: | Line 224: | ||
<color red>Ex. 10</color> Să se facă o listă cu angajații care fac parte dintr-un departament specificat, au o anumită funcție și au venit în companie la o anumită dată specificată. Aceste condiții să fie transmise ca parametri unui cursor. | <color red>Ex. 10</color> Să se facă o listă cu angajații care fac parte dintr-un departament specificat, au o anumită funcție și au venit în companie la o anumită dată specificată. Aceste condiții să fie transmise ca parametri unui cursor. | ||
- | {{:bd2:laboratoare:l04ex09.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex10_new.png?nolink&740|}} |
==== Tipuri de variabile REF CURSOR, SYS_REFCURSOR și RECORD ==== | ==== Tipuri de variabile REF CURSOR, SYS_REFCURSOR și RECORD ==== | ||
Line 287: | Line 281: | ||
<color red>Ex. 11</color> Să se facă o listă cu toate departamentele. | <color red>Ex. 11</color> Să se facă o listă cu toate departamentele. | ||
- | {{:bd2:laboratoare:l04ex12.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex11_new.png?nolink&740|}} |
- | <color red>Ex. 12</color> Să se listeze toți angajatii din tabela EMP. | + | <color red>Ex. 12</color> Să se listeze toți angajatii din tabela employees. |
- | {{:bd2:laboratoare:l04ex11.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex12_new.png?nolink&600|}} |
<color red>Ex. 13</color> Să se folosească un record pentru a păstra numele, funcția și salariul pentru toți angajații. | <color red>Ex. 13</color> Să se folosească un record pentru a păstra numele, funcția și salariul pentru toți angajații. | ||
- | {{:bd2:laboratoare:l04ex13.png?nolink&740|}} | + | |
+ | |||
+ | {{:bd2:laboratoare:lab4_ex13_new.png?nolink&740|}} | ||
==== Eficiența cursoarelor ==== | ==== Eficiența cursoarelor ==== | ||
Line 321: | Line 317: | ||
* Dacă salariu_sef >= salariu_mediu_departament atunci comision_sef = 20% * salariu_mediu_departament | * Dacă salariu_sef >= salariu_mediu_departament atunci comision_sef = 20% * salariu_mediu_departament | ||
- | {{:bd2:laboratoare:l04ex13.png?nolink&740|}} | + | {{:bd2:laboratoare:lab4_ex14_new.png?nolink&740|}} |