Laborator 8: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea II - functii) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de bloc

Documente similare
Laborator 7: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea I - proceduri) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blo

Aggregating Data

Managementul Resurselor Umane

Laborator5_SQL_an2

RZOLVARE EXERCITIU ZODII declare cursor distributie_zodie is select nume_zodie, count(*) distributie from zodiac z join utilizatori u on to_date(to_ch

proiectarea bazelor de date

PHP (II)

Microsoft Word - Curs_07.doc

Baze de date-Anul 2 (semestrul 2)

Baze de date

Laborator02

Baze de date - Anul 2 Laborator 8 Limbajul de definire a datelor (LDD) (partea I) În general, instrucţiunile LDD sunt utilizate pentru definirea struc

Proceduri stocate Syntax: CREATE PROCEDURE <Name> type1,...] AS -- secventa de comenzi SQL GO O procedura stocata se ruleaza cu EXEC: EXEC <N

Microsoft Word - Curs 11 - PHP.doc

PowerPoint Presentation

PowerPoint Presentation

Laborator 3

Top

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

PowerPoint Presentation

tehnologii web

PowerPoint Presentation

Laborator - Configurarea Rutelor IPv4 Statice și Implicite Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gate

Mai multe despre optimizare

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Paradigme de programare

Utilizare Internet

Metode avansate de gestiune a documentelor și a sistemelor de calcul - LABORATOR 1 -

SUBPROGRAME

PowerPoint Presentation

Paradigme de Programare

Prezentarea calculatorului

ADRIAN TRIF BAZE DE DATE APLICAŢII ACCESS UTPRESS Cluj-Napoca, 2019 ISBN

Baze de date-Anul 2

Anexa nr. 2 FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior UNIVERSITATEA DE VEST TIMISOARA 1.2 Facultatea FIZICA 1.3 De

Limbaje de Programare Curs 8 – Fisiere

Declararea variabilelor

Documentaţie Tehnică Verificare TVA API Ultima actualizare: 1 ianuarie / 92 1

Addendum Syllabus 6 Microsoft Access 2016 REF Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului ma

Microsoft Word - Curs_10.doc

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

proiectarea bazelor de date

aplicatii java

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare

Microsoft Word - Curs_08.doc

Raportarea serviciilor de dializă la nivel CNAS

Proiectarea Sistemelor Software Complexe

Entrepreneurship and Technological Management

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Metode avansate de gestiune a documentelor și a sistemelor de calcul - curs 1 -

Slide 1

Ingineria Sistemelor de Programare

Baze de date - Anul 2 Laborator 9 Limbajul de definire a datelor (LDD) - II : Definirea vizualizărilor, secvenţelor, indecşilor, sinonimelor, tabelelo

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

ALGORITHMICS

Slide 1

PowerPoint Presentation

EXCEL FĂRĂ SECRETE Grafice şi diagrame

E_d_Informatica_sp_MI_2015_bar_02_LRO

1. Găsiți k numerele cele mai apropiate într-un şir nesortat Dându-se un şir nesortat și două numere x și k, găsiți k cele mai apropiate valori de x.

INSTITUTUL DE DEZVOLTARE A SOCIETĂŢII INFORMAŢIONLE

A

Microsoft Word - CarteC.doc

Analiză de flux de date 29 octombrie 2012

Programarea şi utilizarea calculatoarelor

PROIECT DIDACTIC Clasa a VII-a Informatică și TIC

PowerPoint Presentation

CL2009R0976RO bi_cp 1..1

Raportarea serviciilor de dializă la nivel CJAS

CABINET MINISTRU

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Microsoft Word - Fisa disciplinei BD_I_IE doc

GT-100IP InternetPhone [VoIP] Ghidul Utilizatorului (V1.0)

Microsoft Word - CarteC.doc

Ghid de Referință Explicații sumare ale operațiunilor de rutină HL-L2312D HL-L2357DW HL-L2352DW HL-L2372DN HL-L2375DW Brother recomandă să păstrați ac

Microsoft PowerPoint - UBD3-slides.ppt

Ingineria Sistemelor de Programare

E_d_Informatica_sp_SN_2014_bar_10_LRO

Analiză statică Analiza fluxului de date 23 octombrie 2014

Microsoft Word - lab1_2007.doc

Metode API - integrare FGO v.2.5 Cuprins ISTORIC VERSIUNI... 2 INTRODUCERE... 2 APELARE... 4 NOMENCLATOARE... 4 FACTURA... 5 EMITERE... 5 PRINT... 6 S

PowerPoint Presentation

PowerPoint Presentation

Modulul 1 M1-2.3 Protocoale şi servicii în reţea În acest capitol ne propunem să abordăm următoarele: Protocoalele şi aplicaţiile folosite în reţelele

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

Modul Modbus ASCII SISTEME DE COMUNICATIE CURS 5 - Constantinescu Catalin Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj

L7

Minicurs CCS C / Aplicatia1 1.Programul CCS C Compiler. Instalare.Creare proiect. Descarcati ultima versiune a programului de

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Prezentarea calculatorului

Introducere în limbajul JavaScript

Transcriere:

Laborator 8: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea II - functii) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blocurile anonime) care poate primi parametri şi poate fi invocat dintr-un anumit mediu ( de exemplu, SQL*Plus, Oracle Forms, Oracle Reports etc.) Subprogramele sunt bazate pe structura de bloc PL/SQL. Similar, ele conţin o parte declarativă opţională, o parte executabilă obligatorie şi o parte de tratare de excepţii opţională. Exista 2 tipuri de subprograme: 1. proceduri; 2. funcţii (trebuie să conţină cel puţin o comandă RETURN); Subprogramele pot fi: o locale (în cadrul unui alt bloc PL/SQL sau subprogram) o stocate (create cu comanda CREATE) - odată create, procedurile şi funcţiile sunt stocate în baza de date, motiv pentru care se numesc subprograme stocate. Sintaxa simplificată pentru crearea unei funcţii este următoarea: [CREATE [OR REPLACE] ] FUNCTION nume_funcţie [ (lista_parametri) ] RETURN tip_de_date {IS AS} [declaraţii locale] partea executabilă [EXCEPTION partea de tratare a excepţiilor] END [nume_funcţie]; Lista de parametri conţine specificaţii de parametri separate prin virgulă de forma: nume_parametru mod_parametru tip_parametru; O functie îndeplineste urmatoarele condiţii: Acceptă numai parametri de tip IN Acceptă numai tipuri de date SQL, nu şi tipuri specifice PL/SQL Returnează valori de tipuri de date SQL. Nu modifică tabelul care este blocat pentru comanda respectiva (mutating tables) Poate fi folosită în lista de expresii a comenzii SELECT, în clauzele WHERE si HAVING, CONNECT BY, START WITH, ORDER BY, GROUP BY, clauza VALUES a comenzii INSERT, clauza SET a comenzii UPDATE. În cazul în care se modifică un obiect (vizualizare, tabel etc) de care depinde un subprogram, acesta este invalidat. Revalidarea se face fie prin recrearea subprogramului fie prin comanda: ALTER FUNCTION nume_functie COMPILE;

Ştergerea unei funcţii se realizează prin comenzile: DROP PROCEDURE nume_proc; DROP FUNCTION nume_functie; Informaţii despre funcţiile deţinute de utilizatorul curent se pot obţine interogând vizualizarea USER_OBJECTS din dicţionarul datelor. SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION'); Obs: STATUS starea subprogramului (validă sau invalidă). Codul complet al unui subprogram poate fi vizualizat folosind următoarea sintaxă: SELECT TEXT FROM USER_SOURCE WHERE NAME = 'nume_subprogram' ORDER BY LINE; Eroarea apărută la compilarea unui subprogram poate fi vizualizată folosind următoarea sintaxă: SELECT LINE, POSITION, TEXT FROM USER_ERRORS WHERE NAME = 'nume'; Erorile pot fi vizualizate şi prin intermediul comenzii SHOW ERRORS. Descrierea specificaţiei unui subprogram se face prin comanda DESCRIBE. Când este apelată o procedură PL/SQL, sistemul Oracle furnizează două metode pentru definirea parametrilor actuali: o specificarea explicită prin nume o specificarea prin poziţie Exemplu: subprog(a tip_a, b_tip_b, c tip_c, d tip_d) - specificare prin poziţie: subprog(var_a,var_b,var_c,var_d); - specificare prin nume: subprog(b=>var_b,c=>var_c,d=>var_d,a=>var_a); - specificare prin nume şi poziţie: subprog(var_a,var_b,d=>var_d,c=>var_c); Probleme rezolvate a). Funcţii locale 1. Să se creeze o procedură stocată care pentru un anumit cod de departament (dat ca parametru) calculează prin intermediul unor funcţii locale numărul de salariaţi care lucrează în el, suma salariilor şi numărul managerilor salariaţilor care lucrează în departamentul respectiv.

CREATE OR REPLACE PROCEDURE problema1_pnu (p_dept emp.deptno%type) AS FUNCTION nrsal (v_dept emp.deptno %TYPE) v_numar NUMBER(3); SELECT COUNT(*) INTO v_numar RETURN v_numar; END nrsal; FUNCTION sumasal(v_dept emp.deptno %TYPE) v_suma emp.sal%type; SELECT SUM(sal) INTO v_suma RETURN v_suma; END sumasal; FUNCTION nrmgr(v_dept emp.deptno %TYPE) v_numar NUMBER(3); SELECT COUNT(DISTINCT mgr) INTO v_numar RETURN v_numar; END nrmgr; -- partea executabila a procedurii problema1_pnu DBMS_OUTPUT.PUT_LINE('Numarul salariatilor care lucreaza in departamentul ' p_dept ' este ' nrsal(p_dept)); DBMS_OUTPUT.PUT_LINE('Suma salariilor angajatilor din departamentul ' p_dept ' este ' sumasal(p_dept)); DBMS_OUTPUT.PUT_LINE('Numarul de manageri din departamentul ' p_dept ' este ' nrmgr(p_dept)); EXECUTE problema1_pnu(50); 2. Să se creeze două funcţii (locale) supraîncărcate (overloaded) care să calculeze media salariilor astfel: - prima funcţie va avea ca argument codul departamentului, adică funcţia calculează media salariilor din departamentul specificat

- a doua funcţie va avea două argumente, unul reprezentând codul departamentului, iar celălalt reprezentând job-ul, adică funcţia va calcula media salariilor dintr-un anumit departament şi care aparţin unui job specificat DECLARE medie1 NUMBER(10,2); medie2 NUMBER(10,2); FUNCTION medie (v_dept emp.deptno%type) rezultat NUMBER(10,2); SELECT AVG(sal) INTO rezultat RETURN rezultat; FUNCTION medie (v_dept emp.deptno%type, v_job emp.job_id %TYPE) rezultat NUMBER(10,2); SELECT AVG(sal) INTO rezultat WHERE deptno = v_dept AND job = v_job; RETURN rezultat; medie1:=medie(80); DBMS_OUTPUT.PUT_LINE('Media salariilor din departamentul 80 este ' medie1); medie2 := medie(80, 'SA_REP'); DBMS_OUTPUT.PUT_LINE('Media salariilor reprezentantilor de vanzari din departamentul 80 este ' medie2); b) Funcţii stocate 3. Să se creeze o funcţie stocată care determină numărul de salariaţi din emp angajaţi după 1995, într-un departament dat ca parametru. Să se apeleze această funcţie prin diferite modalităţi: - printr-o comandă SELECT; - într-un bloc PL/SQL.

CREATE OR REPLACE FUNCTION problema3_pnu (p_dept emp.deptno%type) RETURN NUMBER IS rezultat NUMBER; SELECT COUNT(*) INTO rezultat WHERE deptno=p_dept AND TO_CHAR(hire_date,'yyyy')>1995; RETURN rezultat; END problema8_pnu; 1) SELECT problema3_pnu (80) FROM dual; 2) DECLARE p_dep NUMBER :=50; nr NUMBER; v_dep emp.deptno%type; nr := problema3_pnu (v_dep); IF nr<>0 THEN DBMS_OUTPUT.PUT_LINE('numarul salariatilor angajati după 1995 in departamentul ' v_dep ' este ' nr); ELSE DBMS_OUTPUT.PUT_LINE('departamentul cu numarul ' v_dep ' nu are angajati'); END IF; 4. Să se calculeze recursiv numărul de permutări ale unei mulţimi cu n elemente, unde n va fi transmis ca parametru. CREATE OR REPLACE FUNCTION permutari_pnu(p_n NUMBER) RETURN INTEGER IS IF (p_n=0) THEN RETURN 1; ELSE RETURN p_n*permutari_pnu (p_n-1); END IF; END permutari_pnu; DECLARE g_n NUMBER;

g_n := permutari_pnu (5); DBMS_OUTPUT.PUT_LINE('permutari ' g_n); 5. Să se afişeze numele, job-ul şi salariul angajaţilor al căror salariu este mai mare decât media salariilor din tabelul emp. CREATE OR REPLACE FUNCTION medie_pnu medie NUMBER; SELECT AVG(sal) INTO medie ; RETURN medie; SELECT ename, job, sal WHERE sal >= medie_pnu; 6. a) Analizaţi subprogramele create anterior în vizualizarea din dicţionarul datelor USER_OBJECTS. b) Regăsiţi codul unuia dintre subprogramele create anterior în vizualizarea USER_SOURCE. c) Aflaţi tipul parametrilor uneia dintre procedurile create anterior utilizând comanda DESCRIBE. Probleme propuse spre rezolvare 1. Să se creeze o funcţie stocată care determină numărul de salariaţi care au fost angajaţi ulterior tuturor subalternilor unui manager al cărui cod este dat ca parametru. Să se apeleze această funcţie într-un bloc PL/SQL. 2. Să se creeze trei funcţii locale cu acelaşi nume care să calculeze numărul de salariaţi astfel: - prima funcţie va avea ca argument codul departamentului, adică funcţia calculează numărul de salariaţi din departamentul specificat; - a doua funcţie va avea două argumente, unul reprezentând codul departamentului, iar celălalt reprezentând anul angajării, adică funcţia va calcula numărul de salariaţi din departament şi care au fost angajaţi într-un anumit an; - a treia funcţie va avea trei argumente, unul reprezentând codul departamentului, unul reprezentând anul angajării, iar celălalt grila de salarizare, adică funcţia va calcula numărul de salariaţi din departament, care au fost angajaţi într-un anumit an şi au salariul într-o anumită grilă de salarizare.

3. Să se creeze o funcţie pentru calculul recursiv al combinărilor. 4. Să se modifice salariul unui angajat al cărui cod este introdus ca parametru astfel încât să devină media salariilor angajaţilor care câştigă comision dintr-un departament dat ca parametru. 5. Să se scrie o funcţie care să întoarcă, pentru un angajat al cărui cod este specificat ca parametru, vechimea exprimată în luni. Să se utilizeze funcţia într-o instrucţiune SELECT care să întoarcă numele angajaţilor, salariul şi numărul de luni lucrate.