CORRIGÉ – DEVOIR SURVEILLÉ – PL/SQL : Programmation avancée
Exercice 1 : Curseur et traitement conditionnel (5 points)
Correction :
DECLARE
CURSOR c_employes IS SELECT id_emp, salaire FROM employés;
BEGIN
FOR emp IN c_employes LOOP
IF [Link] < 2000 THEN
UPDATE employés SET prime = 500 WHERE id_emp = emp.id_emp;
ELSIF [Link] BETWEEN 2000 AND 5000 THEN
UPDATE employés SET prime = 1000 WHERE id_emp = emp.id_emp;
ELSE
UPDATE employés SET prime = 1500 WHERE id_emp = emp.id_emp;
END IF;
END LOOP;
COMMIT;
END;
Exercice 2 : Procédure avec gestion d'exception (5 points)
Correction :
CREATE OR REPLACE PROCEDURE ajouter_client (
p_id_client IN NUMBER,
p_nom IN VARCHAR2,
p_ville IN VARCHAR2
) IS
e_client_existe EXCEPTION;
PRAGMA EXCEPTION_INIT(e_client_existe, -1);
BEGIN
INSERT INTO clients (id_client, nom, ville)
VALUES (p_id_client, p_nom, p_ville);
DBMS_OUTPUT.PUT_LINE('Client ajouté avec succès.');
EXCEPTION
WHEN e_client_existe THEN
DBMS_OUTPUT.PUT_LINE('Erreur : Le client existe déjà.');
END;
Exercice 3 : Fonction de calcul (5 points)
Correction :
CREATE OR REPLACE FUNCTION calculer_ttc(p_id_produit NUMBER) RETURN NUMBER IS
v_prix_ht produits.prix_ht%TYPE;
v_ttc NUMBER(8,2);
BEGIN
SELECT prix_ht INTO v_prix_ht FROM produits WHERE id_produit = p_id_produit;
v_ttc := v_prix_ht * 1.20;
RETURN v_ttc;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, 'Produit introuvable.');
END;
Exercice 4 : Déclencheur (Trigger) (5 points)
Correction :
CREATE OR REPLACE TRIGGER trg_update_stock
AFTER UPDATE OF quantite ON stock
FOR EACH ROW
BEGIN
INSERT INTO historique_stock (id_article, date_modif, ancienne_quantite, nouvelle_quantite)
VALUES (:OLD.id_article, SYSDATE, :[Link], :[Link]);
END;