This shows you the differences between two versions of the page.
bd2:laboratoare:05 [2019/10/27 21:55] ciprian.truica [Considerente asupra procedurilor și funcțiilor] |
bd2:laboratoare:05 [2020/11/05 13:27] (current) ciprian.truica [Laboratorul 05 - PL/SQL Subprograme] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 05 - PL/SQL Subprograme ===== | ===== Laboratorul 05 - PL/SQL Subprograme ===== | ||
+ | |||
===== Conținut ===== | ===== Conținut ===== | ||
Line 6: | Line 7: | ||
* Proceduri PL/SQL | * Proceduri PL/SQL | ||
* Funcții PL/SQL | * Funcții PL/SQL | ||
+ | * Considerente asupra procedurilor și funcțiilor | ||
+ | * Informații din dicționarul bazei de date | ||
===== Subprograme ===== | ===== Subprograme ===== | ||
Line 99: | Line 102: | ||
<color red>Ex. 1.</color> Exemplu de procedură declarată într-un bloc. | <color red>Ex. 1.</color> Exemplu de procedură declarată într-un bloc. | ||
- | {{:bd2:laboratoare:l05ex01.png?nolink&600|}} | + | {{:bd2:laboratoare:l05ex01.png?nolink&730|}} |
- | <color red>Ex. 2.</color> Să se scrie o procedură declarată în cadrul unui bloc care întoarce salariu maxim pentru un ID de departament și o funcție introduse de la tastatură. Salariu maxim să fie returnat folosindu-se o variabilă scalară. Să se traducă joburile în limba română, în cadrul procedurii. | + | <color red>Ex. 2.</color> Să se scrie o procedură declarată în cadrul unui bloc care întoarce salariu maxim pentru un ID de departament și o funcție introduse de la tastatură. Salariu maxim să fie returnat folosindu-se o variabilă scalară. Să se traducă joburile în limba română, în cadrul procedurii. Aveți grijă la cum sunt repartizate job-urile în departamente. |
- | {{:bd2:laboratoare:l05ex02.png?nolink&600|}} | + | {{:bd2:laboratoare:l05ex02.png?nolink&730|}} |
==== Proceduri stocate ==== | ==== Proceduri stocate ==== | ||
Line 134: | Line 137: | ||
* **[PRAGMA AUTONOMOUS_TRANSACTION]** – specifică că execuția procedurii suspendă tranzacția curentă care se reia după terminarea execuției procedurii, adică într-o tranzacție imbricăm o altă tranzacție cu propriile sale comenzi TCL (COMMIT și ROLLBACK) | * **[PRAGMA AUTONOMOUS_TRANSACTION]** – specifică că execuția procedurii suspendă tranzacția curentă care se reia după terminarea execuției procedurii, adică într-o tranzacție imbricăm o altă tranzacție cu propriile sale comenzi TCL (COMMIT și ROLLBACK) | ||
- | <color red>Ex. 3.</color> Să se creeze o procedură stocată care calculează veniturile angajaților cu o vechime de peste 20 de ani în firmă, dintr-un anumit departament. | + | <color red>Ex. 3.</color> Să se creeze o procedură stocată care calculează veniturile angajaților cu o vechime de peste 10 de ani în firmă, dintr-un anumit departament. |
- | {{:bd2:laboratoare:l05ex03.png?nolink&600|}} | + | {{:bd2:laboratoare:l05ex03.png?nolink&730|}} |
<note> | <note> | ||
Line 154: | Line 157: | ||
<color red>Ex. 4.</color> Să se scrie o procedură nestocată, care utilizează un cursor, pentru calculul numărului de zile de concediu pentru toți angajații, după următorul algoritm: | <color red>Ex. 4.</color> Să se scrie o procedură nestocată, care utilizează un cursor, pentru calculul numărului de zile de concediu pentru toți angajații, după următorul algoritm: | ||
- manageri de departament: | - manageri de departament: | ||
- | * Vechimea < 32 de ani primesc 20 zile de concediu | + | * Vechimea < 13 de ani primesc 20 zile de concediu |
- | * Vechimea >= 32 de ani primesc 22 zile de concediu | + | * Vechimea >= 13 de ani primesc 22 zile de concediu |
- angajații care nu sunt șefi: | - angajații care nu sunt șefi: | ||
- | * Vechimea < 32 de ani primesc 15 zile de concediu | + | * Vechimea < 13 de ani primesc 15 zile de concediu |
- | * Vechimea >= 32 de ani primesc 22 zile de concediu | + | * Vechimea >= 13 de ani primesc 22 zile de concediu |
- | {{:bd2:laboratoare:l05ex04.png?nolink&600|}} | + | {{:bd2:laboratoare:l05ex04.png?nolink&730|}} |
<color red>Ex. 5.</color> Să se scrie un program PL/SQL cu o procedură care distribuie salariul șefului de departament la subalternii lui, în funcție de vechimea în companie, astfel: | <color red>Ex. 5.</color> Să se scrie un program PL/SQL cu o procedură care distribuie salariul șefului de departament la subalternii lui, în funcție de vechimea în companie, astfel: | ||
Line 168: | Line 171: | ||
Fondul de premiere se distribuie în mod egal la toți subalternii dintr-o grupă. | Fondul de premiere se distribuie în mod egal la toți subalternii dintr-o grupă. | ||
- | {{:bd2:laboratoare:l05ex05.png?nolink&600|}} | + | {{:bd2:laboratoare:l05ex05.png?nolink&730|}} |
==== Tipul Colecție ca parametri ==== | ==== Tipul Colecție ca parametri ==== | ||
Line 178: | Line 181: | ||
<color red>Ex. 6.</color> Să se creeze un vector fie la nivelul dicționarului de date, fie local. Într-un bloc, să se definească și inițializeze o variabilă de tipul nou creat și să se apeleze o procedură care afișează valorile elementelor. Să se șteargă tipul din dicționarul de date. | <color red>Ex. 6.</color> Să se creeze un vector fie la nivelul dicționarului de date, fie local. Într-un bloc, să se definească și inițializeze o variabilă de tipul nou creat și să se apeleze o procedură care afișează valorile elementelor. Să se șteargă tipul din dicționarul de date. | ||
- | | {{:bd2:laboratoare:l05ex06a.png?nolink&600|}} | {{:bd2:laboratoare:l05ex06b.png?nolink&600|}} | | + | {{:bd2:laboratoare:l05ex06a.png?nolink&730|}} |
- | | {{:bd2:laboratoare:l05ex06c.png?nolink&600|}} | {{:bd2:laboratoare:l05ex06d.png?nolink&600|}} | | + | |
- | | {{:bd2:laboratoare:l05ex06e.png?nolink&600|}} | | + | {{:bd2:laboratoare:l05ex06b.png?nolink&730|}} |
+ | |||
+ | {{:bd2:laboratoare:l05ex06c.png?nolink&730|}} | ||
+ | |||
+ | {{:bd2:laboratoare:l05ex06d.png?nolink&730|}} | ||
+ | |||
+ | {{:bd2:laboratoare:l05ex06e.png?nolink&730|}} | ||
Line 186: | Line 195: | ||
<color red> Ex. 7. </color> Exemplu de cursor ca parametru. | <color red> Ex. 7. </color> Exemplu de cursor ca parametru. | ||
- | | {{:bd2:laboratoare:l05ex07a.png?nolink&600|}} | {{:bd2:laboratoare:l05ex07b.png?nolink&600|}} | | + | |
- | | {{:bd2:laboratoare:l05ex07c.png?nolink&600|}} | | + | {{:bd2:laboratoare:l05ex07a.png?nolink&730|}} |
+ | |||
+ | {{:bd2:laboratoare:l05ex07b.png?nolink&730|}} | ||
+ | |||
+ | {{:bd2:laboratoare:l05ex07c.png?nolink&730|}} | ||
Line 241: | Line 254: | ||
<color red>Ex. 8.</color>Să se scrie o funcție locală care primește ca parametru un identificator de departament și returnează numărul salariaților din departamentul respectiv. | <color red>Ex. 8.</color>Să se scrie o funcție locală care primește ca parametru un identificator de departament și returnează numărul salariaților din departamentul respectiv. | ||
- | {{:bd2:laboratoare:l05ex08.png?nolink&600|}} | + | {{:bd2:laboratoare:l05ex08.png?nolink&730|}} |
==== Funcții stocate ==== | ==== Funcții stocate ==== | ||
Line 288: | Line 301: | ||
Pentru stocarea punctelor acumulate de fiecare angajat, se va crea o tabelă temp_puncte care are următoarele coloane: idAng, nrPuncte, idDept. | Pentru stocarea punctelor acumulate de fiecare angajat, se va crea o tabelă temp_puncte care are următoarele coloane: idAng, nrPuncte, idDept. | ||
- | {{:bd2:laboratoare:l05ex09.png?nolink&600|}} | + | {{:bd2:laboratoare:l05ex09.png?nolink&730|}} |
<note> | <note> | ||
Line 369: | Line 382: | ||
Codul sursă al procedurilor și funcțiilor stocate se găsește în dicționarul bazei de date, în view-ul USER_SOURCE, care are următoarea structură: | Codul sursă al procedurilor și funcțiilor stocate se găsește în dicționarul bazei de date, în view-ul USER_SOURCE, care are următoarea structură: | ||
- | {{:bd2:laboratoare:l05s1.png?nolink&600|}} | + | {{:bd2:laboratoare:l05s1.png?nolink&730|}} |
Unde: | Unde: | ||
Line 383: | Line 396: | ||
</code> | </code> | ||
- | {{:bd2:laboratoare:l05s2.png?nolink&600|}} | + | {{:bd2:laboratoare:l05s2.png?nolink&730|}} |
Pentru a vizualiza toate procedurile, funcțiile și tipurile de date create de utilizatorul curent, se poate folosi următoarea cerere SQL: | Pentru a vizualiza toate procedurile, funcțiile și tipurile de date create de utilizatorul curent, se poate folosi următoarea cerere SQL: | ||
Line 393: | Line 406: | ||
</code> | </code> | ||
- | {{:bd2:laboratoare:l05s3.png?nolink&600|}} | + | {{:bd2:laboratoare:l05s3.png?nolink&730|}} |
- | + | ||
- | <color red>Ex. 10. </color> Să se scrie o funcție vare calculează impozitul pe venit în funcție de gradul de salarizare (gradul se găsește în tabela SALGRADE), folosindu-se următorul algoritm: | + | |
- | * Dacă grade = 1 atunci impozitul este 10% din venit | + | |
- | * Dacă grade = 2 atunci impozitul este 15% din venit | + | |
- | * Dacă grade = 3 atunci impozitul este 20% din venit | + | |
- | * Dacă grade = 4 atunci impozitul este 25% din venit | + | |
- | * Dacă grade = 5 atunci impozitul este 30% din venit | + | |
- | Să se afișeze numele angajatului, dacă este șef de departament sau nu, gradul de salarizare, procentul, venitul și impozitul. | + | |
- | + | ||
- | {{:bd2:laboratoare:l05ex10.png?nolink&600|}} | + | |