utiliser un morceau de code comme ceci
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| DECLARE
TYPE aug_salaire_typ IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
aug_salaire aug_salaire_typ;
max_id e_augmentation.no%TYPE;
PROCEDURE augmenter_salaire(nom_emp_in e_emp.nom%type)
l_dt_entree PLS_INTEGER;
l_salaire e_emp.salaire%TYPE;
AS
BEGIN
SELECT salaire, EXTRACT(YEAR FROM dt_entree)
INTO l_salaire, l_dt_entree
FROM e_emp
WHERE nom = nom_emp_in
FOR UPDATE OF salaire NOWAIT;
IF aug_salaire.EXISTS(l_dt_entree) THEN
UPDATE e_emp
SET salaire = salaire (1 + aug_salaire(l_dt_entree))
WHERE e_emp.nom = nom_emp;
-- tu peux utiliser un séquence pour le clé primaire
SELECT MAX(no)
INTO max_id
FROM e_augmentation;
INSERT INTO e_augmentation (no, augmentation, date_augmentation, emp_no) VALUES (NVL(max_id, 0) + 1, (l_salaire * aug_salaire.EXISTS(l_dt_entree)), SYSDATE, num_emp);
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('Employe ' || nom_emp_in || ' n''ai pas peux changher pour l''annee ' || l_dt_entree);
RETURN;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Employe ' || nom_emp_in || ' n''ai ete traité');
ROLLBACK;
END augmenter_salaire;
BEGIN
-- tu peux definir beaucoup d'annees ici, la procédure ne change pas
aug_salaire(1990) := 0.50;
aug_salaire(1991) := 0.25;
aug_salaire(1992) := 0.10;
-- traiter tout la table
FOR c_rec IN (SELECT nom FROM e_emp) LOOP
augmenter_salaire(c_rec.nom);
END LOOP;
END; |