BUT2FA BD

This commit is contained in:
2026-01-15 13:31:16 +01:00
commit 22f16cb959
17 changed files with 1283 additions and 0 deletions

129
CM_A_24/CG_CM_A_24.txt Normal file
View File

@@ -0,0 +1,129 @@
Exercice 1 :
1. Fonction pour retourner le salaire moyen d'un JOB
CREATE OR REPLACE FUNCTION get_salaire_moyen(p_job VARCHAR2)
RETURN NUMBER AS
salaire_moyen NUMBER;
BEGIN
SELECT AVG(SAL)
INTO salaire_moyen
FROM EMP
WHERE JOB = p_job;
IF salaire_moyen IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'Le JOB spécifié n''existe pas.');
END IF;
RETURN salaire_moyen;
END;
/
2. Afficher la liste des JOBs et leur salaire moyen par ordre décroissant
SELECT
JOB,
AVG(SAL) AS Salaire_Moyen
FROM
EMP
GROUP BY
JOB
ORDER BY
Salaire_Moyen DESC;
Exercice 2 :
Trigger pour mettre à jour Nombre_Emp dans Suivi_Emp
CREATE OR REPLACE TRIGGER trg_update_nombre_emp
AFTER INSERT OR DELETE OR UPDATE OF DEPTNO ON EMP
FOR EACH ROW
DECLARE
v_nombre_emp NUMBER;
BEGIN
-- Calculer le nombre d'employés pour le département affecté
SELECT COUNT(*)
INTO v_nombre_emp
FROM EMP
WHERE DEPTNO = :NEW.DEPTNO;
-- Mettre à jour la table Suivi_Emp
UPDATE SUIVI_EMP
SET Nombre_Emp = v_nombre_emp
WHERE DEPTNO = :NEW.DEPTNO;
-- Si suppression ou transfert, mettre à jour l'ancien département
IF UPDATING AND :OLD.DEPTNO IS NOT NULL AND :OLD.DEPTNO != :NEW.DEPTNO THEN
SELECT COUNT(*)
INTO v_nombre_emp
FROM EMP
WHERE DEPTNO = :OLD.DEPTNO;
UPDATE SUIVI_EMP
SET Nombre_Emp = v_nombre_emp
WHERE DEPTNO = :OLD.DEPTNO;
END IF;
END;
/
Exercice 3 :
Script pour mettre à jour la colonne COMM dans EMP en fonction de COMM_MIN
BEGIN
UPDATE EMP e
SET COMM = (
SELECT COMM_MIN
FROM EMP_SEUIL es
WHERE e.JOB = es.JOB
)
WHERE EXISTS (
SELECT 1
FROM EMP_SEUIL es
WHERE e.JOB = es.JOB
AND (e.COMM IS NULL OR e.COMM < es.COMM_MIN)
);
END;
/
Exercice 4 :
Procédure sp_update_commission pour mettre à jour COMM
CREATE OR REPLACE PROCEDURE sp_update_commission(p_job VARCHAR2, p_com NUMBER) AS
BEGIN
UPDATE EMP
SET COMM = p_com
WHERE JOB = p_job
AND (COMM IS NULL OR COMM < p_com);
-- Vérification : Si la commission mise à jour est inférieure à COMM_MIN
UPDATE EMP e
SET COMM = (
SELECT COMM_MIN
FROM EMP_SEUIL es
WHERE e.JOB = es.JOB
AND es.JOB = p_job
)
WHERE EXISTS (
SELECT 1
FROM EMP_SEUIL es
WHERE e.JOB = es.JOB
AND es.JOB = p_job
AND p_com < es.COMM_MIN
);
END;
/

BIN
CM_A_24/CM_A_24.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

116
CM_A_24/DS_CM_A_24.txt Normal file
View File

@@ -0,0 +1,116 @@
/* Exercice 1 */
On souhaite connaitre le salaire moyen des JOB. Ecrire une fonction qui prend en paramètre un JOB et retourne le salaire moyen du JOB. Traiter le cas où le JOB passé en paramètre n'existe pas.
Afficher la liste des JOBs et leur salaire moyen par ordre décroissant de salaire.
CREATE OR REPLACE FUNCTION avg_sal_job(p_job EMP.JOB%TYPE)
RETURN NUMBER
IS
v_avg_sal NUMBER;
v_job_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_job_count FROM EMP WHERE JOB = p_job;
IF v_job_count = 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'JOB ' || p_job || ' n''existe pas');
END IF;
SELECT AVG(SAL) INTO v_avg_sal FROM EMP WHERE JOB = p_job;
RETURN v_avg_sal;
END;
/
-- Liste des JOBs et salaire moyen
SELECT JOB, ROUND(AVG(SAL), 2) AS "Salaire moyen"
FROM EMP
GROUP BY JOB
ORDER BY "Salaire moyen" DESC;
/* Exercice 2 */
Créer 1 trigger qui met à jour automatiquement la colonne Nombre_Emp de la table Suivi_Emp si:
- un nouvel employé est embauché dans un département
- un nouvel employé démissionne
- un employé est muté d'un département à un autre
CREATE OR REPLACE TRIGGER trg_update_suivi_emp
AFTER INSERT OR DELETE OR UPDATE OF DEPTNO ON EMP
FOR EACH ROW
BEGIN
IF INSERTING THEN
MERGE INTO SUIVI_EMP s
USING DUAL ON (s.DEPTNO = :NEW.DEPTNO)
WHEN MATCHED THEN
UPDATE SET s.Nombre_Emp = s.Nombre_Emp + 1
WHEN NOT MATCHED THEN
INSERT (DEPTNO, Nombre_Emp) VALUES (:NEW.DEPTNO, 1);
ELSIF DELETING THEN
UPDATE SUIVI_EMP SET Nombre_Emp = Nombre_Emp - 1 WHERE DEPTNO = :OLD.DEPTNO;
DELETE FROM SUIVI_EMP WHERE DEPTNO = :OLD.DEPTNO AND Nombre_Emp = 0;
ELSIF UPDATING('DEPTNO') THEN
-- Ancien département
UPDATE SUIVI_EMP SET Nombre_Emp = Nombre_Emp - 1 WHERE DEPTNO = :OLD.DEPTNO;
DELETE FROM SUIVI_EMP WHERE DEPTNO = :OLD.DEPTNO AND Nombre_Emp = 0;
-- Nouveau département
MERGE INTO SUIVI_EMP s
USING DUAL ON (s.DEPTNO = :NEW.DEPTNO)
WHEN MATCHED THEN
UPDATE SET s.Nombre_Emp = s.Nombre_Emp + 1
WHEN NOT MATCHED THEN
INSERT (DEPTNO, Nombre_Emp) VALUES (:NEW.DEPTNO, 1);
END IF;
END;
/
/* Exercice 3 */
Ecrire un script qui met à jour le colonne COMM de la table EMP en fonction de la commission minimale COMM_MIN de la table EMP_SEUIL; Tout employé de la table EMP doit avoir une commission supérieure ou égale au montant de la commission minimale.
- Si COMM is null → COMM_MIN
- Si COMM < COMM_MIN COMM_MIN
UPDATE EMP e
SET COMM = (
SELECT GREATEST(COALESCE(e.COMM, es.COMM_MIN), es.COMM_MIN)
FROM EMP_SEUIL es
WHERE es.JOB = e.JOB
)
WHERE EXISTS (
SELECT 1 FROM EMP_SEUIL es WHERE es.JOB = e.JOB
);
/* Exercice 4 */
Ecrire une procédure sp_update_commission qui prend en paramètre un JOB p_job et une commission p_com. La procédure devra :
- Mettre à jour la table EMP_SEUIL; le job p_job aura pour nouvelle commission p_com.
- Mettre à jour la table EMP ; Si un employé ayant le job p_job a une commission inférieure à p_com, alors la commission doit être mise à jour (la commission doit toujours être supérieure à la commission minimale).
CREATE OR REPLACE PROCEDURE sp_update_commission (
p_job EMP_SEUIL.JOB%TYPE,
p_com EMP_SEUIL.COMM_MIN%TYPE
)
IS
BEGIN
MERGE INTO EMP_SEUIL d
USING (SELECT p_job AS JOB, p_com AS COMM_MIN FROM DUAL) s
ON (d.JOB = s.JOB)
WHEN MATCHED THEN
UPDATE SET d.COMM_MIN = s.COMM_MIN
WHEN NOT MATCHED THEN
INSERT (JOB, COMM_MIN) VALUES (s.JOB, s.COMM_MIN);
UPDATE EMP
SET COMM = GREATEST(COALESCE(COMM, p_com), p_com)
WHERE JOB = p_job;
END;
/