Sie sind auf Seite 1von 4

PROGRAMMATION DAPPLICATION BASE DE DONNEES

PL/SQL

TP04 Curseurs et Exceptions

Exercice

Pr requis : Utilisation de la table employees et h_employees. H_employees est limage de la table employees. Rajouter un champ DT_HIST de type date, PK sur (EMPLOYEE_NUMBER, DT_HIST). Ecrire un programme PL/SQL qui gre : -La mise jour des salaires de la table employees de la faon suivante : Le salari ayant un salaire infrieur la moyenne de son dpartement est augment de 10%. On pourra utiliser un curseur pour manipuler les donnes. ( syntaxe explicite OPEN, FETCH,CLOSE) -Linsertion des anciennes valeurs dans une table dhistorique. -La gestion dinsertion de doublons dans la table dhistorique. (Affichage des messages derreur et code erreur)

Exemple de cration de table H_EMPLOYEES : CREATE TABLE H_EMPLOYEES AS SELECT * FROM EMPLOYEES WHERE 1=2; ALTER TABLE H_EMPLOYEES ADD ( DT_HIST DATE ); ALTER TABLE H_EMPLOYEES ADD CONSTRAINT PK_H_EMPLYEES PRIMARY KEY (EMPLOYEE_NUMBER,DT_HIST);

ESIAG L3 Programmation Bases de donnes

A noter que la commande CTAS (Create Table As Select) ne copie pas les contraintes de la table mre. Ici la pk_employee nest pas recopie sur h_employee. Dans notre exemple, il apparat clair que lon ne pourra insrer dans h_employee un employee_number donn que pour une date donne. Il faut donc excuter 2 fois ce bloc PL/SQL pour constater une erreur dans linsertion dans la table h_employee :

DECLARE v_emptno employees.employee_number%type; v_ename employees.employee_name%type; v_salary employees.salary%type; v_salary_old employees.salary%type; v_sal_moy_dept employees.salary%type; v_dept_id employees.department_id%type; CURSOR my_employees IS SELECT employee_number, employee_name, department_id, salary FROM employees; BEGIN OPEN my_employees; LOOP FETCH my_employees INTO v_emptno, v_ename, v_dept_id , v_salary; EXIT WHEN my_employees%NOTFOUND; SELECT AVG(salary) INTO v_sal_moy_dept FROM employees WHERE department_id = v_dept_id; ESIAG L3 Programmation Bases de donnes

v_salary_old IF v_salary v_salary

:= v_salary; < v_sal_moy_dept THEN := ROUND(v_salary*1.1);

UPDATE employees SET salary = v_salary WHERE employee_number = v_emptno; DBMS_OUTPUT.PUT_LINE('employee : '||v_ename|| ' salaire : ' || v_salary); INSERT INTO H_EMPLOYEES ( EMPLOYEE_NUMBER, EMPLOYEE_NAME, DEPARTMENT_ID, SALARY, DT_HIST ) VALUES ( v_emptno, v_ename, v_dept_id , v_salary_old, TRUNC(sysdate) ); END IF; END LOOP; CLOSE my_employees; EXCEPTION WHEN NO_DATA_FOUND THEN

ESIAG L3 Programmation Bases de donnes

DBMS_OUTPUT.PUT_LINE('Pas de donnees'); ROLLBACK; WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS'); ROLLBACK; WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('DUP_VAL_ON_INDEX '); DBMS_OUTPUT.PUT_LINE('SQLCODE' || SQLCODE || 'SQLERROR' || SQLERRM); ROLLBACK; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLCODE : ' || SQLCODE || ' SQLERROR : ' || SQLERRM); ROLLBACK; END;

ESIAG L3 Programmation Bases de donnes

Das könnte Ihnen auch gefallen