Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
495
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.27 KB | None | 0 0
  1. //LAB3
  2. 1. Afisati nume, prenumele si ID-ul angajatilor cu EMPLOYEE_ID mai mic de 110. Utilizati tipul Record si atributul %TYPE.
  3. SET SERVEROUTPUT ON;
  4. DECLARE
  5. TYPE AngajatIM IS RECORD
  6. (ID employees.employee_ID%TYPE,
  7. prenume employees.first_name%TYPE,
  8. nume employees.last_name%TYPE
  9. );
  10.  
  11. CURSOR c_ang IS
  12. SELECT last_name, first_name , employee_id FROM employees WHERE employee_ID
  13. < 110;
  14. angajat AngajatIM;
  15. BEGIN
  16. OPEN c_ang;
  17. FETCH c_ang INTO angajat.nume, angajat.prenume, angajat.id ;
  18. WHILE c_ang%FOUND LOOP
  19.  
  20.  
  21. DBMS_OUTPUT.PUT_LINE(angajat.nume||' '||angajat.prenume||' '||angajat.id);
  22. FETCH c_ang INTO angajat.nume, angajat.prenume, angajat.id;
  23. END LOOP;
  24. CLOSE c_ang;
  25. END;
  26.  
  27.  
  28. 2. Afisati nume, prenumele si ID-ul angajatilor cu EMPLOYEE_ID mai mic de 110. Utilizati tipul Record si atributul %ROWTYPE
  29. SET SERVEROUTPUT ON;
  30. DECLARE
  31. angIM employees%ROWTYPE;
  32. CURSOR c_ang IS
  33. SELECT * FROM employees WHERE employee_ID
  34. < 110;
  35.  
  36. BEGIN
  37. OPEN c_ang;
  38. FETCH c_ang INTO angIM;
  39. WHILE c_ang%FOUND LOOP
  40.  
  41.  
  42. DBMS_OUTPUT.PUT_LINE(angIM.last_name||' '||angIM.first_name||' '||angIM.employee_id);
  43. FETCH c_ang INTO angIM;
  44. END LOOP;
  45. CLOSE c_ang;
  46. END;
  47. Creati duplicate pentru tabelele employees si departments cu numele XX_emp si XX_dep, unde XX reprezinta initialele studentului. În problemele care urmeaza se vor utiliza colectii.
  48. create table im_emp as select * from employees
  49. create table im_dep as select * from departments
  50.  
  51.  
  52. 3. Afisati angajatii cu un salariu mai mare decât 10000, în urmatoarea forma: are salariul Utilizati procedeul BULK COLLECT cu instructiunea SELECT.
  53. DECLARE
  54. TYPE emp_nume IS TABLE OF employees.last_NAME%type;
  55. TYPE emp_prn IS TABLE OF employees.first_NAME%type;
  56. TYPE emp_slr IS TABLE OF employees.salary%type;
  57. t_nume emp_nume;
  58. t_prn emp_prn;
  59. t_sal emp_slr;
  60. CURSOR c IS
  61. SELECT first_name, last_name, salary from employees
  62. WHERE salary > 10000;
  63. BEGIN
  64. OPEN c;
  65. FETCH c BULK COLLECT INTO t_nume, t_prn, t_sal;
  66. CLOSE c;
  67. FOR i IN t_nume.FIRST .. t_nume.LAST LOOP
  68. DBMS_OUTPUT.put_line(t_nume(i)||' '||t_prn(i)||' are salariul ' || t_sal(i));
  69. END LOOP;
  70. END;
  71.  
  72.  
  73. 4. Afisati angajatii al caror ID este mai mare decât 200 în ordine alfabetica. Utilizati procedeul BULK COLLECT cu instructiunea FETCH.
  74. DECLARE
  75. TYPE emp_nume IS TABLE OF employees.last_NAME%type;
  76. TYPE emp_prn IS TABLE OF employees.first_NAME%type;
  77. TYPE emp_id IS TABLE OF employees.employee_id%type;
  78. t_nume emp_nume;
  79. t_prn emp_prn;
  80. t_id emp_id;
  81. CURSOR c IS
  82. SELECT first_name, last_name, employee_id from employees
  83. WHERE employee_id > 200 order by last_name;
  84. BEGIN
  85. OPEN c;
  86. FETCH c BULK COLLECT INTO t_nume, t_prn, t_id;
  87. CLOSE c;
  88. FOR i IN t_nume.FIRST .. t_nume.LAST LOOP
  89. DBMS_OUTPUT.put_line(t_nume(i)||' '||t_prn(i)||' are salariul ' || t_id(i));
  90. END LOOP;
  91. END;
  92.  
  93.  
  94. 5. Afisati numarul de angajati pentru fiecare departament, în una din urmatoarele forme: In departamentul dep nu lucreaza niciun angajat. In departamentul dep lucreaza un angajat. In departamentul dep lucreaza nr angajati.
  95.  
  96.  
  97.  
  98. 6. Afisati numele managerului fiecarui departament sub forma: Departamentul nume_dep este condus de nume_manager.
  99. DECLARE
  100. TYPE tab_nume IS TABLE OF DEPARTMENTS.DEPARTMENT_NAME%type;
  101. TYPE tab_name IS TABLE OF employees.last_name%type;
  102. t_nume tab_nume;
  103. t_name tab_name;
  104. CURSOR c IS
  105. SELECT e.first_name, d.department_name FROM departments d, employees e
  106. WHERE d.manager_id=e.employee_id ORDER BY department_name;
  107. BEGIN
  108. OPEN c;
  109. FETCH c BULK COLLECT INTO t_nume, t_name;
  110. CLOSE c;
  111. FOR i IN t_nume.FIRST .. t_nume.LAST LOOP
  112. DBMS_OUTPUT.put_line('Departamentul ' || t_name(i) ||
  113. ' are managerul '|| t_nume(i));
  114. END LOOP;
  115. END;
  116.  
  117.  
  118. 7. Afisati numele angajatilor din departamantul IT.
  119. DECLARE
  120. TYPE tab_name IS TABLE OF employees.last_name%type;
  121. TYPE tab_pren IS TABLE OF employees.first_name%type;
  122. t_name tab_name;
  123. t_pren tab_pren;
  124. CURSOR c IS
  125. SELECT e.first_name,e.last_name FROM departments d, employees e
  126. WHERE d.department_id=e.department_id and d.department_name like 'IT' ORDER BY last_name;
  127. BEGIN
  128. OPEN c;
  129. FETCH c BULK COLLECT INTO t_name, t_pren;
  130. CLOSE c;
  131. FOR i IN t_name.FIRST .. t_name.LAST LOOP
  132. DBMS_OUTPUT.put_line( t_name(i) ||
  133. ' '|| t_pren(i));
  134. END LOOP;
  135. END;
  136.  
  137. //SIM Laborator 4
  138.  
  139.  
  140. 1. Creati un bloc PL/SQL care împarte doua numere introduse de la tastatura. Se va trata exceptia aparuta la împartirea prin 0.
  141. DECLARE
  142. a number;
  143. b number;
  144. BEGIN
  145. a:=&a;
  146. b:=&b;
  147. DBMS_OUTPUT.PUT_LINE(a/b);
  148. EXCEPTION
  149. WHEN ZERO_DIVIDE THEN
  150. DBMS_OUTPUT.PUT_LINE('S-a impartit la 0!');
  151. END;
  152.  
  153.  
  154. 2. Afisati numele unui departament identificat prin ID. ID-ul va fi introdus de la tastatura. Tratati exceptiile care pot sa apara.
  155. DECLARE
  156. d_name departments.department_name%TYPE;
  157. id departments.department_id%TYPE;
  158. BEGIN
  159. id:='&id';
  160. SELECT department_name INTO d_name FROM departments
  161. WHERE department_id=id;
  162. DBMS_OUTPUT.PUT_LINE(d_name || ' has id '|| id);
  163. EXCEPTION
  164. WHEN NO_DATA_FOUND THEN
  165. DBMS_OUTPUT.PUT_LINE('Nu exista departament cu acest id!');
  166. WHEN TOO_MANY_ROWS THEN
  167. DBMS_OUTPUT.PUT_LINE('Prea multe departamente cu acest id!');
  168. END;
  169.  
  170. Bun
  171. DECLARE
  172.  
  173. e_id employees.employee_id%TYPE;
  174. d_name departments.department_name%TYPE;
  175. name departments.department_name%TYPE;
  176. nr number;
  177. BEGIN
  178.  
  179. d_name:='&d_name';
  180.  
  181. SELECT department_name INTO name from departments
  182. where lower(department_name)=lower(d_name);
  183.  
  184. SELECT count(e.employee_id) INTO nr FROM employees e, departments d
  185. WHERE lower(d.department_name)=lower(d_name) and e.department_id=d.department_id;
  186. DBMS_OUTPUT.PUT_LINE(d_name || ' has '|| nr || ' employees!');
  187.  
  188. EXCEPTION
  189.  
  190. WHEN NO_DATA_FOUND THEN
  191. DBMS_OUTPUT.PUT_LINE('Nu exista departament cu acest nume!');
  192. WHEN TOO_MANY_ROWS THEN
  193. DBMS_OUTPUT.PUT_LINE('Prea multe departamente cu acest id!');
  194. END;
  195.  
  196.  
  197. 3. Afisati numele unui angajat identificat prin ID. ID-ul va fi introdus de la tastatura. Definiti o exceptie care se declanseaza atunci când se introduce un numar mai mic decât 100. Tratati si celelalte situatii care pot sa apara.
  198. DECLARE
  199. mai_mic EXCEPTION;
  200. e_name employees.last_name%TYPE;
  201. id employees.employee_id%TYPE;
  202. BEGIN
  203. id:='&id';
  204. IF id<100 THEN
  205. RAISE mai_mic;
  206. END IF;
  207. SELECT last_name INTO e_name FROM employees
  208. WHERE employee_id=id;
  209. DBMS_OUTPUT.PUT_LINE(e_name || ' has id '|| id);
  210.  
  211. EXCEPTION
  212. WHEN mai_mic THEN
  213. DBMS_OUTPUT.PUT_LINE('Id-ul este prea mic! Sunt permise doar id-uri mai mari de 100');
  214. WHEN NO_DATA_FOUND THEN
  215. DBMS_OUTPUT.PUT_LINE('Nu exista departament cu acest id!');
  216. WHEN TOO_MANY_ROWS THEN
  217. DBMS_OUTPUT.PUT_LINE('Prea multe departamente cu acest id!');
  218. END;
  219.  
  220.  
  221. 4. Afisati numarul de angajati dintr-un departament identificat prin nume. Numele se introduce de la tastatura.
  222. DECLARE
  223. e_id employees.employee_id%TYPE;
  224. d_name departments.department_name%TYPE;
  225. nr number;
  226. BEGIN
  227. d_name:='&d_name';
  228. SELECT count(e.employee_id) INTO nr FROM employees e, departments d
  229. WHERE lower(d.department_name)=lower(d_name) and e.department_id=d.department_id;
  230. DBMS_OUTPUT.PUT_LINE(d_name || ' has '|| nr || ' employees!');
  231.  
  232. EXCEPTION
  233.  
  234. WHEN NO_DATA_FOUND THEN
  235. DBMS_OUTPUT.PUT_LINE('Nu exista departament cu acest nume!');
  236. WHEN TOO_MANY_ROWS THEN
  237. DBMS_OUTPUT.PUT_LINE('Prea multe departamente cu acest id!');
  238. END;
  239.  
  240.  
  241. 5. Creati un exemplu pentru tratarea exceptiei CURSOR_ALREADY_OPEN.
  242. SET SERVEROUTPUT ON;
  243. DECLARE
  244. d_id departments.department_id%TYPE;
  245. d_name departments.department_name%TYPE;
  246. CURSOR d_info is SELECT department_id, department_name from departments
  247. WHERE department_id>100;
  248. BEGIN
  249. OPEN d_info;
  250. FETCH d_info into d_id, d_name;
  251. WHILE d_info%FOUND LOOP
  252. FETCH d_info into d_id, d_name;
  253.  
  254. DBMS_OUTPUT.PUT_LINE('Department '||d_name || ' has the id '|| d_id);
  255. END LOOP;
  256. OPEN d_info;
  257. EXCEPTION
  258. WHEN CURSOR_ALREADY_OPEN THEN
  259. DBMS_OUTPUT.PUT_LINE('The cursor is already opened!');
  260. WHEN NO_DATA_FOUND THEN
  261. DBMS_OUTPUT.PUT_LINE('Nu exista departament cu acest id!');
  262. WHEN TOO_MANY_ROWS THEN
  263. DBMS_OUTPUT.PUT_LINE('Prea multe departamente cu acest id!');
  264. END;
  265.  
  266. ///Laborator 5 SIM
  267.  
  268.  
  269. 1. Scrieti o functie care returneaza ID-ul unei persoane identificata prin nume si prenume.
  270. SET SERVEROUTPUT ON;
  271. DECLARE
  272. v_nume employees.last_name%TYPE;
  273. --v_nume employees.first_name%TYPE;
  274. v_id employees.employee_id%type;
  275. FUNCTION f2 (p_nume IN employees.last_name%TYPE)
  276. RETURN NUMBER
  277. IS
  278. id employees.employee_id%type;
  279. BEGIN
  280. SELECT employee_id INTO id FROM employees
  281. WHERE upper(last_name) = upper(p_nume);
  282. RETURN id;
  283. EXCEPTION
  284. WHEN NO_DATA_FOUND THEN
  285. RETURN -1;
  286. WHEN TOO_MANY_ROWS THEN
  287. RETURN -2;
  288. WHEN OTHERS THEN
  289. RETURN -3;
  290. END f2;
  291. BEGIN
  292. v_id:= f2('&v_nume');
  293. IF v_id>0 THEN
  294. DBMS_OUTPUT.PUT_LINE('Id-ul este ' || v_id);
  295. ELSE
  296. CASE v_id
  297. WHEN -1 THEN
  298. DBMS_OUTPUT.PUT_LINE('Nu exista niciun angajat cu numele dat');
  299. WHEN -2 THEN
  300. DBMS_OUTPUT.PUT_LINE('Exista mai multi angajati cu numele dat');
  301. ELSE
  302. DBMS_OUTPUT.PUT_LINE('A aparut o eroare!');
  303. END CASE;
  304. END IF;
  305. END;
  306.  
  307.  
  308. 2. Scrieti o procedura care afi?eaza numele unei persoane identificata prin ID, precum si departamentul în care lucreaza.
  309. DECLARE
  310. PROCEDURE p2
  311. IS
  312. v_nume employees.last_name%type;
  313. v_id employees.employee_id%type;
  314. v_dep departments.department_name%type;
  315. BEGIN
  316. SELECT last_name, department_name INTO v_nume, v_dep FROM departments d, employees e
  317. WHERE e.employee_id = &v_id and e.department_id = d.department_id;
  318. DBMS_OUTPUT.PUT_LINE('Numele este ' || v_nume || ' si departamentul este '|| v_dep);
  319. END p2;
  320. BEGIN
  321. --apelul procedurii
  322. p2;
  323. END;
  324.  
  325.  
  326. 3. Scrieti o procedura stocata care mareste salariul unei persoane identificata prin ID astfel: daca persoana are 0.1-0.2 puncte comision, salariul creste cu 10%, iar daca persoana are peste 0.2 de puncte, salariul creste cu 25%. Procedura primeste ID-ul ca parametru de intrare si returneaza salariul actual si salariul modificat ca parametri de iesire. Aten?ie: modificarea se va face în tabelul XX_Angajati, iar numele procedurii stocate va fi de forma XX_nume.
  327. /* CREATE PROCEDURE mpcc_nume(a_sal OUT NUMBER, m_sal OUT NUMBER)
  328. IS
  329. CP EMPLOYEES.COMMISSION_PCT%TYPE;
  330. BEGIN
  331. SELECT NVL(COMMISSION_PCT,0) , SALARY into cp, a_sal FROM MI_ANG
  332. WHERE EMPLOYEE_ID= &ID;
  333. IF(CP>=0.1 AND CP <0.2) THEN
  334. DBMS_OUTPUT.PUT_LINE('Salariul vechi este ' || a_sal || ' si salariul nou este '|| a_sal*1.1);
  335. ELSIF(CP >=0.2) THEN
  336. DBMS_OUTPUT.PUT_LINE('Salariul vechi este ' || a_sal || ' si salariul nou este '|| a_sal*1.25);
  337. END IF;
  338.  
  339. END mpcc_nume; */
  340.  
  341. create or replace PROCEDURE ioana (p_id IN number, p_sal_act out number, p_sal_mod out number)
  342. IS
  343. p_comm mi_ang.commission_pct%type;
  344. BEGIN
  345. SELECT nvl(commission_pct, 0), salary INTO p_comm, p_sal_act FROM mi_ang
  346. where employee_id = p_id;
  347.  
  348. if p_comm <= 0.2 then
  349. update mi_ang set salary = salary + salary * 0.1 where employee_id = p_id;
  350. else
  351. if p_comm > 0.2 then
  352. update mi_ang set salary = salary + salary * 0.25 where employee_id = p_id;
  353. end if;
  354. end if;
  355. select salary INTO p_sal_mod from mi_ang where employee_id = p_id;
  356.  
  357. END ioana;
  358.  
  359. DECLARE
  360. v_id mi_ang.employee_id%type;
  361. v_sal_act mi_ang.salary%type;
  362. v_sal_mod mi_ang.salary%type;
  363.  
  364. BEGIN
  365. --apelul procedurii
  366. ioana(&v_id, v_sal_act, v_sal_mod);
  367. DBMS_OUTPUT.PUT_LINE('Salariul inainte de marire: ' || v_sal_act || '. Salariul dupa marire : ' || v_sal_mod);
  368. END;
  369.  
  370. 4. Scrieti o func?ie stocata care pentru un anumit cod de departament, dat ca parametru, returneaza numarul salariatilor care lucreaza în el.
  371.  
  372. 5. ?terge?i toate obiectele create.
  373.  
  374. //Laborator 6 SIM
  375.  
  376.  
  377. 1. Scrie?i o procedura stocata care afi?eaza to?i angaja?ii al caror nume începe cu o anumita litera. Se va afi?a: numele (cu majuscule), prenumele ?i anul angajarii. Indica?ie: se vor utiliza func?iile SUBSTR, UPPER, EXTRACT, SQLERRM.
  378.  
  379. SET SERVEROUTPUT ON;
  380. declare type tab_nume is table of varchar2(50);
  381. tn tab_nume;
  382. type tab_an is table of number;
  383. ta tab_an;caracter char(1);
  384. i integer;
  385. procedure pStocata(l_nume out tab_nume,l_an out tab_an,c in char)
  386. is
  387. begin
  388. select concat(upper(last_name),concat(' ',first_name)) nume, extract(year from hire_date) bulk collect into l_nume,l_an from employees where substr(upper(last_name),0,1)=c;
  389. end pStocata;
  390. begin
  391. caracter:='&caracter';
  392. pStocata(tn,ta,upper(caracter));
  393. for i in tn.first .. tn.last
  394. loop
  395. dbms_output.put_line(tn(i)||' - '||ta(i));
  396. end loop;
  397. --dbms_output.put_line('Caracterul introdus: '||caracter);
  398. end;
  399.  
  400. // SIM Laborator 7
  401.  
  402.  
  403. 1. Modificati exemplul 1 astfel încât trigger-ul sa nu permita modificari în zilele de joi/vineri, apoi efectuati o stergere din tabelul XX_angajati.
  404. CREATE OR REPLACE TRIGGER mi_ex1
  405. BEFORE INSERT OR UPDATE OR DELETE ON mi_angajati
  406. BEGIN
  407. IF TO_CHAR(SYSDATE, 'D')= 5 THEN
  408. RAISE_APPLICATION_ERROR(-20001,'Tabelul nu poate fi actualizat');
  409. END IF;
  410. END;
  411. DELETE FROM mi_angajati WHERE employee_id<110
  412.  
  413.  
  414. 2. Eliminati trigger-ul creat anterior si testati exemplul 2.
  415. drop trigger mi_ex1;
  416. CREATE OR REPLACE TRIGGER mi_ex2
  417. AFTER DELETE ON mi_angajati
  418. FOR EACH ROW
  419. BEGIN
  420. DBMS_OUTPUT.PUT_LINE('A fost sters un angajat');
  421. END;
  422. DELETE FROM mi_angajati WHERE employee_id<110
  423.  
  424.  
  425. 3. Creati un tabel de audit numit XX_Operatii_Angajati care sa contina urmatoarele coloane: DataModif DATE Operatie VARCHAR(20) ValInitiala NUMBER(8,2) ValFinala NUMBER(8,2) În acest tabel de audit vor fi stocate toate operatiile facute de utilizatori în tabela XX_angajati pe coloana salary. Realizati un trigger numit XX_monitorizare “sensibil” la INSERT, UPDATE, DELETE care sa se declanseze pentru fiecare linie modificata în parte si sa înregistreze fiecare operatie efectuata în tabelului de audit XX_Operatii_Angajati. Dupa realizarea trigger-ului modificati, inserati, respectiv stergeti linii din tabela XX_angajati.
  426. create table mi_Operatii_Angajati (
  427. DataModif DATE,
  428. Operatie VARCHAR(20),
  429. ValInitiala NUMBER(8,2),
  430. ValFinala NUMBER(8,2) );
  431.  
  432. set serveroutput on;
  433. create or replace trigger mi_pb3
  434. after insert or update or delete on mi_angajati
  435. for each row
  436. begin
  437. if inserting then
  438. insert into mi_Operatii_Angajati values(sysdate,'insert',:old.salary,:new.salary);
  439. elsif deleting then
  440. insert into mi_Operatii_Angajati values(sysdate,'delete',:old.salary,:new.salary);
  441. elsif updating('salary') then
  442. insert into mi_Operatii_Angajati values(sysdate,'update',:old.salary,:new.salary);
  443. end if;
  444. end;
  445.  
  446. insert into mi_angajati(first_name, last_name,email, phone_number,hire_date, job_id,salary, manager_id, department_id) values ('Ciprian', 'Stavovei', 'satv@yahoo.com','515.124.4269','22-12-2015' , 2200 , 110, 108,100);
  447.  
  448. select * from mi_Operatii_Angajati
  449. delete from mi_angajati
  450. where employee_id = 110
  451.  
  452. update mi_angajati
  453. set salary = 2000
  454. where salary < 2000
  455.  
  456. //SIM LABORATOR 8
  457.  
  458.  
  459.  
  460. 1. Creati un pachet care sa contina functii pentru calculul valorii medii a salariului pentru un anumit departament, pentru toti angajatii, respectiv pentru salariatii angajati într-un anumit an (dat ca parametru).
  461. CREATE OR REPLACE PACKAGE mi_pachet1 IS
  462. FUNCTION f_mediadep(dep departments.department_id%TYPE)
  463. RETURN NUMBER;
  464. FUNCTION f_media(hire number)
  465. RETURN NUMBER;
  466. END mi_pachet1;
  467. CREATE OR REPLACE PACKAGE BODY mi_pachet1 IS
  468. FUNCTION f_mediadep(dep departments.department_id%TYPE)
  469. RETURN NUMBER
  470. IS
  471. numar NUMBER;
  472. BEGIN
  473. SELECT avg(salary) INTO numar FROM employees
  474. WHERE department_id=dep;
  475. RETURN numar;
  476. END f_mediadep;
  477. Function f_total
  478. return number is
  479. total number;
  480. BEGIN
  481. SELECT avg(salary) INTO total
  482. FROM employees;
  483. return total;
  484. end f_total;
  485. FUNCTION f_media(hire number)
  486. RETURN NUMBER
  487. IS
  488. sal NUMBER;
  489. BEGIN
  490. SELECT avg(salary) INTO sal
  491. FROM employees WHERE extract(year from hire_date) = hire;
  492. RETURN sal;
  493. END f_media;
  494. END mi_pachet1;
  495. SELECT mi_pachet1.f_mediadep(80) FROM DUAL;
  496. SELECT mi_pachet1.f_media(1999) FROM DUAL;
  497. SELECT mi_pachet1.f_total FROM DUAL;
  498.  
  499. SET SERVEROUTPUT On
  500. BEGIN
  501. DBMS_OUTPUT.PUT_LINE('Media salariilor din departament: '|| mi_pachet1.f_mediadep(80));
  502. DBMS_OUTPUT.PUT_LINE('Media salariilor celor angajati intr-un anumit an: '|| mi_pachet1.f_media(&a));
  503. DBMS_OUTPUT.PUT_LINE('Media salariilor este : '|| mi_pachet1.f_total);
  504. END;
  505.  
  506.  
  507.  
  508.  
  509. 2. Creati un pachet care contine:
  510. create table mi_dep as select * from departments
  511. a. procedurile ADD_DEP, MODIF_DEP si DEL_DEP corespunzatoare operatiilor de adaugare, actualizare (a numelui) si stergere a unui departament din tabelul XX_dep
  512. b. functia GET_DEP care determina denumirea unui departament, pe baza codului acestuia
  513. CREATE OR REPLACE PACKAGE mi_pachet2 IS
  514. FUNCTION get_dep(dep mi_dep.department_id%TYPE)
  515. RETURN mi_dep.department_name%TYPE;
  516. PROCEDURE add_dep(dep mi_dep%ROWTYPE);
  517. PROCEDURE mod_dep(dep mi_dep.department_id%TYPE, nume mi_dep.department_name%TYPE);
  518. PROCEDURE del_dep(dep mi_dep.department_id%TYPE);
  519. END mi_pachet2;
  520.  
  521. CREATE OR REPLACE PACKAGE BODY mi_pachet2 IS
  522. FUNCTION get_dep(dep mi_dep.department_id%TYPE)
  523. RETURN mi_dep.department_name%TYPE
  524. IS
  525. nume mi_dep.department_name%TYPE;
  526. BEGIN
  527. SELECT department_name into nume FROM mi_dep
  528. WHERE department_id=dep;
  529. RETURN nume;
  530. EXCEPTION
  531. WHEN NO_DATA_FOUND THEN return 'departamentul nu exista!';
  532. END get_dep;
  533.  
  534.  
  535. PROCEDURE add_dep(dep mi_dep%ROWTYPE) AS
  536. BEGIN
  537. INSERT INTO mi_dep VALUES(dep.DEPARTMENT_ID, dep.DEPARTMENT_NAME, dep.MANAGER_ID, dep.LOCATION_ID);
  538. END add_dep;
  539. PROCEDURE mod_dep(dep mi_dep.department_id%TYPE, nume mi_dep.department_name%TYPE) AS
  540. BEGIN
  541. UPDATE mi_dep
  542. SET department_name = nume
  543. WHERE department_id = dep;
  544. END mod_dep;
  545. PROCEDURE del_dep(dep mi_dep.department_id%TYPE) AS
  546. BEGIN
  547. DELETE FROM mi_dep
  548. WHERE department_id = dep;
  549. END del_dep;
  550.  
  551. END mi_pachet2;
  552.  
  553. SELECT mi_pachet2.get_dep(80) FROM DUAL;
  554.  
  555.  
  556. //Sim Laborator 9
  557.  
  558.  
  559. 1. Creati un script PL/SQL care apeleaza functia XX_numar pentru a afisa numarul salariatilor din tabelul employees al caror salariu depaseste valoarea 10000, respectiv numarul salariatilor din tabelul XX_emp al caror salariu depaseste valoarea 8000.
  560. CREATE OR REPLACE FUNCTION mi_numar(val NUMBER, tabel VARCHAR2)
  561. RETURN NUMBER IS
  562. sir VARCHAR2(500);
  563. rez NUMBER;
  564. BEGIN
  565. sir := 'SELECT COUNT(*) FROM ' || tabel ||
  566. ' WHERE salary >= :x';
  567. EXECUTE IMMEDIATE sir INTO rez USING val;
  568. RETURN rez;
  569. END mi_numar;
  570.  
  571. SET SERVEROUTPUT ON;
  572. BEGIN
  573. dbms_output.put_line('Numar salariati ' || mi_numar(10000, 'employees'));
  574. END;
  575.  
  576. SET SERVEROUTPUT ON
  577. BEGIN
  578. dbms_output.put_line('Numar salariati ' || mi_numar(8000, 'mi_emp'));
  579. END;
  580.  
  581.  
  582.  
  583. 2. Utilizând SQL dinamic nativ, sa se creeze tabelul XX_tab(col VARCHAR2(15)), apoi sa se insereze în acesta numele departamentelor din tabelul XX_dep, sa se tipareasca continutul tabelului utilizând un bloc anonim, iar în final sa se stearga tabelul creat.
  584. create table mi_tab(col VARCHAR2(15))
  585.  
  586. DECLARE
  587. bloc VARCHAR2(200);
  588. BEGIN
  589. EXECUTE IMMEDIATE 'INSERT INTO mi_tab SELECT department_name FROM mi_dep';
  590. bloc := 'BEGIN
  591. FOR i IN (SELECT * FROM mi_tab) LOOP
  592. DBMS_OUTPUT.PUT_LINE (i.col);
  593. END LOOP;
  594. END;';
  595. EXECUTE IMMEDIATE bloc;
  596. EXECUTE IMMEDIATE 'DROP TABLE mi_tab';
  597. END;
  598.  
  599.  
  600. 3. Creati un pachet care contine: a. o functie prin care se vor obtine toti angajatii care au un anumit job, dat ca parametru b. o procedura prin care se mareste cu o anumita valoare (data ca parametru) salariile angajatilor care au un anumit job (dat ca parametru)
  601. SET SERVEROUTPUT ON;
  602. CREATE OR REPLACE PACKAGE mi_pachet AS
  603. TYPE refcursor IS REF CURSOR;
  604. FUNCTION f1 (id employees.job_id%TYPE) RETURN refcursor;
  605. PROCEDURE p1(valoare NUMBER,id employees.job_id%TYPE);
  606. END mi_pachet;
  607.  
  608.  
  609. CREATE OR REPLACE PACKAGE BODY mi_pachet AS
  610. FUNCTION f1 (id employees.job_id%TYPE) RETURN refcursor IS
  611. rez refcursor;
  612. comanda VARCHAR2(500);
  613. BEGIN
  614. comanda := 'SELECT first_name FROM employees WHERE upper(job_id)=' || upper (id);
  615. OPEN rez FOR comanda;
  616. RETURN rez;
  617. END;
  618. PROCEDURE p1(valoare NUMBER,id employees.job_id%TYPE) is
  619. begin
  620. execute immediate 'UPDATE mi_emp set salary=salary +' || valoare || ' where upper( job_id)='|| upper( id);
  621. end p1;
  622. END mi_pachet;
  623.  
  624. set serveroutput on;
  625. DECLARE
  626. bloc VARCHAR2(500);
  627. BEGIN
  628. EXECUTE IMMEDIATE 'INSERT INTO cioata_tab SELECT department_name FROM
  629. cioata_dep';
  630. bloc := 'BEGIN
  631. FOR i IN (SELECT * FROM cioata_tab) LOOP
  632. DBMS_OUTPUT.PUT_LINE (i.col);
  633. END LOOP;
  634. END;';
  635. EXECUTE IMMEDIATE bloc;
  636. EXECUTE IMMEDIATE 'DROP TABLE cioata_tab';
  637. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement