BUT2FA BD
This commit is contained in:
129
CM_A_24/CG_CM_A_24.txt
Normal file
129
CM_A_24/CG_CM_A_24.txt
Normal 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
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
116
CM_A_24/DS_CM_A_24.txt
Normal 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;
|
||||
/
|
||||
Reference in New Issue
Block a user