P. 1
Subprograme PL/SQL.doc

Subprograme PL/SQL.doc

|Views: 39|Likes:
subprograme pl/sql, definite, exemple, exercitii propuse, tipuri de subprograme, depanare subprograme PL/SQL
subprograme pl/sql, definite, exemple, exercitii propuse, tipuri de subprograme, depanare subprograme PL/SQL

More info:

Published by: Georgiana Florentina Spiridon on Oct 27, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

05/25/2014

pdf

text

original

Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 8

Subprograme PL/SQL
        

Blocuri PL/SQL care au nume Pot fi proceduri /functii Se pot stoca la nivel de Oracle Server (proceduri/functii stocate) sau de aplicatie (Developer Suite) Se pot grupa in pachete de programe (PACKAGE) Variabilele declarate in zona declarativa a procedurii se numesc parametri formali (formal parameters). Pentru acestia se pot specifica valori implicite (DEFAULT) Variabilele utilizate in apelul procedurii/functiei se numesc parametri actuali (actual parameters) Când procedura/functia e apelata, variabilele din procedura sunt incarcate cu valorile variabilelor definite in zona declarativa a blocului anonim In corpul procedurilor/functiilor nu se pot utiliza variabile globale sau de substitutie, acestea vor fi transmise in subprograme cu ajutorul parametrilor Pentru afisarea erorilor aparute la compilare se utilizeaza SHOW ERRORS

1. PROCEDURI
Parametrii utilizati in procedura (parametri formali) pot fi de tip: • IN (valoarea parametrului actual este transferata in variabila definita in procedura. Aceasta variabila este considerata read-only). Când procedura se încheie, controlul revine mediului apelant. Parametrul actual nu se modifica. Este modul implicit. • OUT (valoarea parametrului formal este transferata in parametrul actual când procedura se incheie) • IN OUT (valorile sunt transferate de la un tip de variabilă la celălalt (la lansarea în execuţie/terminarea procedurii)) un parametru IN poate apare numai în partea dreapta a (:=) un parametru OUT poate apare numai în partea stânga a (:=) un parametru IN OUT poate apare în ambele părţi ale (:=)

  

Sintaxa pentru crearea unei proceduri: CREATE [OR REPLACE] PROCEDURE NUME_PROC [(param1 [IN|OUT|IN OUT] TIP1, Param2[IN|OUT|IN OUT] TIP2, ....) ] -- tipul variabilelor este precizat fara dimensiune (ex: NUMBER sau VARCHAR2) IS|AS -- zona de declarare a variabilelor utilizate in subprogram -- NU se utilizeaza DECLARE BEGIN ---[EXCEPTION] -----END [NUME_PROC]; Pentru a sterge procedura: DROP PROCEDURE NUME_PROC;
1

nume%type. 10) Rollback. / --apelul procedurii intr-un bloc anonim SET SERVEROUTPUT ON DECLARE v_nume angajati. Update angajati Set salariul=salariul*(1+procent/100) Where id_angajat=p_id_angajat.id_angajat%type.nume%type. p_salariul OUT angajati.  din alt mediu Oracle (Oracle Developer Suite) Parametrii de tip IN Exemplu: Procedura modifica_salariul primeşte doi parametrii: p_id_angajat şi procent şi majorează cu procentul specificat salariul angajatului cu id_angajat=p_id_angajat: CREATE OR REPLACE PROCEDURE modifica_salariul_procent (p_id_angajat IN angajati.put_line('Angajatul are salariul de '||v_salariul). BEGIN Select salariul into v_salariul from angajati where id_angajat=p_id_angajat. p_salariul from angajati where id_angajat=p_id_angajat. DBMS_OUTPUT. Statistică şi Informatică Economică SGBD Oracle – seminarul 8 Apelul unei proceduri se poate realiza in urmatoarele moduri:  prin nume dintr-un bloc PL/SQL anonim sau un alt subprogram.PUT_LINE(' Angajatul '||p_nume||' are salariul de: '||p_salariul). Select salariul into v_salariul from angajati where id_angajat=p_id_angajat. p_nume OUT angajati.Facultatea de Cibernetică. END. / show errors. 2 . END.salariul%type. Parametrii de tip OUT Exemplu: Procedura primeşte ca parametru de tip IN id_ul unui angajat şi returnează prin parametrii de tip OUT numele şi salariul acestuia: CREATE OR REPLACE PROCEDURE cauta_angajat (p_id_angajat IN angajati. Dbms_output.  prin apel direct cu EXECUTE nume_proc sau EXEC nume_proc sau CALL nume_proc.put_line('Angajatul are acum salariul de '||v_salariul). procent IN number) IS v_salariul angajati. dbms_output. salariul into p_nume.id_angajat%type.salariul%type) IS BEGIN Select nume. EXECUTE modifica_salariul_procent(176.

END. / Apelul procedurii intr-un bloc anonim: SET SERVEROUTPUT ON DECLARE v_id_angajat angajati. / show errors. End.nume%type. BEGIN Select nume. Statistică şi Informatică Economică SGBD Oracle – seminarul 8 v_salariul angajati.id_angajat%type. MODIFICA_SALARIUL_PROCENT. END IF.id_angajat%type.Facultatea de Cibernetică.salariul%type. v_salariul). SAL_MEDIU (p_sal_mediu). salariul into nume. CREATE or REPLACE PROCEDURE modifica_salariul_med (p_id_angajat IN angajati. IF sal<p_sal_mediu then MODIFICA_SALARIUL_PROCENT (p_id_angajat.nume%type. 3 . v_nume angajati. / Exemplu: Procedura calculează salariul mediu şi îl returnează printr-un parametru de tip OUT: CREATE or REPLACE PROCEDURE sal_mediu (p_sal_mediu OUT number) IS BEGIN Select AVG(salariul) into p_sal_mediu from angajati. 15). END. sal angajati. sal from angajati where id_angajat= p_id_angajat. BEGIN Cauta_angajat(150.salariul%type. --apelul prin EXECUTE VARIABLE v_sal_mediu NUMBER EXECUTE sal_mediu(:v_sal_mediu) Print v_sal_mediu Parametrii de tip IN OUT Exemplu: Procedura modifică salariul unui angajat doar în cazul în care este mai mic decât media prin apelarea procedurii create mai sus. Procedura primeşte id-ul angajatului ca parametru de intrare şi salariul mediu actual şi prin returnează prin parametrul de tip IN OUT salariul mediu modificat prin apelul procedurii SAL_MEDIU. v_nume. p_sal_mediu IN OUT number) IS nume angajati.

--apelul procedurii pentru modificarea salariului modifica_salariul_med (v_id_angajat.PUT_LINE('Angajat inexistent! ID invalid'). / rollback.PUT_LINE('Salariul mediu este acum: '||v_sal_mediu). v_sal_mediu). CAUTA_ANGAJAT(v_id_angajat. v_sal_mediu number. v_nume. v_salariul). Stergerea unei proceduri se realizeaza prin comanda: DROP PROCEDURE nume_procedura. v_salariul). FUNCŢII: Sintaxa pentru crearea unei functii: CREATE [OR REPLACE] FUNCTION nume_functie [(param1 [IN] TIP1.. DBMS_OUTPUT. Statistică şi Informatică Economică SGBD Oracle – seminarul 8 v_salariul angajati. --apelul procedurii pentru aflarea salariului mediu SAL_MEDIU (v_sal_mediu). Vizualizarea procedurilor in dictionarul metadatelor se realizeaza prin: Select object_name From user_objects Where object_type='PROCEDURE'. v_nume. --apelul procedurii pentru vizualizarea datelor angajatului CAUTA_ANGAJAT(v_id_angajat. v_sal_mediu). v_salariul). .Facultatea de Cibernetică. CAUTA_ANGAJAT(v_id_angajat. Exception When NO_DATA_FOUND then DBMS_OUTPUT. Param2[IN] TIP2. --apelul cu id invalid v_id_angajat:=1230. 2. v_nume. BEGIN --apelul cu id valid =105 v_id_angajat:=105..salariul%type. Iar pentru a vizualiza corpul procedurii: Select text From user_source Where name='NUME_PROC' and type='PROCEDURE'. modifica_salariul_med (v_id_angajat.) ] 4 . END..

vizualizarea tipului returnat: describe verifica_salariul.id_angajat%type. ELSE return false. end. BEGIN --apelul procedurii pentru calculul salariului mediu: SAL_MEDIU (v_sal_mediu). [EXCEPTION] -----END [NUME_FUNCTIE]. / show errors -.nu se utilizeaza DECLARE BEGIN ---RETURN VALOARE. IF v_salariul > p_sal_mediu then return true.salariul%type. Pentru vizualizarea tipului returnat se utilizeaza: DESCRIBE nume_functie.tipul variabilelor este precizat fara dimensiune (ex: NUMBER sau VARCHAR2) IS|AS -.Facultatea de Cibernetică. end if. Statistică şi Informatică Economică SGBD Oracle – seminarul 8 RETURN TIP_DATA -. BEGIN SELECT salariul into v_salariul from angajati where id_angajat=p_id_angajat.zona de declarare a variabilelor utilizate in subprogram -. Exemplu: Returnează true/false daca salariatul are salariul mai mare/mai mic sau egal cu salariul mediu si null daca salariatul nu exista CREATE OR REPLACE FUNCTION verifica_salariul (p_id_angajat IN angajati. Pentru a sterge functia: DROP FUNCTION nume_functie. 5 . EXCEPTION WHEN no_data_found THEN return NULL. --apelul functiei: SET SERVEROUTPUT ON DECLARE v_sal_mediu number. p_sal_mediu IN number) RETURN Boolean IS v_salariul angajati.

pret. end if. v_sal_mediu)) then dbms_output. v_sal_mediu) IS NULL) then dbms_output. proc IN NUMBER) RETURN NUMBER IS BEGIN RETURN (value*proc).put_line('Angajat cu ID invalid!'). taxa (pret. v_sal_mediu)) then dbms_output. v_sal_mediu)) then dbms_output. Statistică şi Informatică Economică SGBD Oracle – seminarul 8 --primul apel al functiei IF (verifica_salariul(11. end if. taxa (pret.put_line('Salariatul are salariul mai mare decat media!').put_line('Angajat cu ID invalid!'). / Utilizarea functiilor PL/SQL in expresii SQL Exemplu: CREATE OR REPLACE FUNCTION taxa (value IN NUMBER.put_line('Salariatul are salariul mai mare decat media!'). v_sal_mediu) IS NULL) then dbms_output. / --apelul funcţiei SELECT id_produs. 0. else dbms_output. END taxa.put_line(' Salariatul are salariul mai mic decat media!'). else dbms_output. 0.put_line(' Salariatul are salariul mai mic decat media!'). Pot fi utilizate in toate clauzele SELECT: Exemplu: SELECT id_produs. cantitate. pret. elsif (verifica_salariul(104. END.Facultatea de Cibernetică. end if. elsif (verifica_salariul(11. v_sal_mediu) IS NULL) then dbms_output. --al treilea apel IF (verifica_salariul(104. --al doilea apel IF (verifica_salariul(110.put_line('Salariatul are salariul mai mare decat media!'). else dbms_output. cantitate.19) as tva FROM rand_comenzi.19) FROM rand_comenzi 6 .put_line(' Salariatul are salariul mai mic decat media!'). elsif (verifica_salariul(110.put_line('Angajat cu ID invalid!').

'cafea'. pret_min). 'kg'. Stergerea unei functii se realizeaza utilizand comanda: DROP FUNCTION nume_functie.19) DESC.19)>(select avg(taxa(pret. 0. 7 . Exemplu: Select text From user_source Where name='TAXA' and type='FUNCTION' ORDER BY line. 0. insert) sau comenzi DDL si nici comenzi pentru controlul tranzactiilor (commit. Statistică şi Informatică Economică SGBD Oracle – seminarul 8 WHERE taxa(pret. RETURN (pret_min+100). Vizualizarea functiilor in dictionarul metadatelor se realizeaza prin: Select object_name From user_objects Where object_type='FUNCTION'. delete. Exemplu: Apelul urmatoarei functii dintr-o instructiune SQL va returna o eroare: ORA04091: table [nume_tabela] is mutating. trigger/function may not see it CREATE OR REPLACE FUNCTION produs_nou (pret_min NUMBER) RETURN NUMBER IS BEGIN INSERT INTO produse values (1. Observatii! Functiile utilizate in expresii SQL trebuie sa accepte doar parametrii de tip IN si sa returneze numai tipuri de date specifice PL/SQL. Iar pentru a vizualiza corpul functiei: Select text From user_source Where name='NUME_FUNCTIE' and type=' FUNCTION ' ORDER BY line. END. Functiile nu trebuie sa contina comenzi DML (update. rollback) si nici nu trebuie sa apeleze alte subprograme care sa incalce aceste restrictii.19)) from rand_comenzi) ORDER BY taxa(pret. 0. Functiile apelate in cadrul expresiilor SQL pot fi continute in pachete. / --apelul din instructiuni SQL: UPDATE produse SET pret_min= produs_nou(2000) WHERE id_produs=111.Facultatea de Cibernetică.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->