Correction Examen Mai 2024
1/
CREATE VIEW V_Stat AS
SELECT
[Link],
[Link],
COUNT([Link]) AS nbre_Compétence
FROM Offres_Emplois o JOIN Candidatures ca ON [Link] = [Link]
JOIN
Candidats_Competences cc ON [Link] = [Link]
JOIN
Competences c ON [Link] = [Link]
GROUP BY
[Link]
with read only
2/
DECLARE
CURSOR cur_Candidates IS
SELECT [Link], [Link], [Link]érience, [Link],
[Link] AS DureeDeChomage
FROM Candidats c
LEFT JOIN Candidatures ca ON [Link] = [Link]
WHERE [Link] IS NULL -- Candidats jamais sélectionnés
[Link] > 12;
BEGIN
FOR candidate IN cur_Candidates LOOP
DBMS_OUTPUT.PUT_LINE('Nom: ' || [Link]);
DBMS_OUTPUT.PUT_LINE('Prénom: ' || [Link]);
DBMS_OUTPUT.PUT_LINE('Début d''Expérience: ' || TO_CHAR([Link]érience,
'DD-MM-YYYY'));
DBMS_OUTPUT.PUT_LINE('Durée de Chômage: ' || [Link] || ' mois');
END LOOP;
END;
3/A- Écrire une procédure stockée PROC_Candidats_Domaine qui permet d’afficher les noms et
prénoms des candidats qui ont postulé pour des offres d'emploi dans le domaine passé en paramètre.
Utiliser un curseur paramétré.
B- Tester la procédure pour le domaine : Web
A- CREATE OR REPLACE PROCEDURE PROC_Candidats_Domaine ( p_Domaine IN
VARCHAR2)
IS
CURSOR candidats_cur(p_Domaine VARCHAR2) IS
SELECT DISTINCT [Link], [Link]
FROM Candidats c
JOIN Candidatures ca ON [Link] = [Link]
JOIN OffresEmplois o ON [Link] = [Link]
WHERE [Link] = p_Domaine;
v_Nom [Link]%TYPE;
v_Prenom [Link]%TYPE;
BEGIN
OPEN candidats_cur(p_Domaine);
LOOP
FETCH candidats_cur INTO v_Nom, v_Prenom;
EXIT WHEN candidats_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Nom: ' || v_Nom);
DBMS_OUTPUT.PUT_LINE('Prénom: ' || v_Prenom);
END LOOP;
CLOSE candidats_cur;
END PROC_Candidats_Domaine;
B- BEGIN
PROC_Candidats_Domaine('WEB');
END;
4/ CREATE OR REPLACE FUNCTION FN_NombreCompetencesCandidat (
p_IDCandidat [Link]%TYPE) RETURN NUMBER IS
v_NombreCompetences number ;
v_IDCandidat [Link]%TYPE ;
BEGIN
SELECT IDCandidat
INTO v_IDCandidat
FROM CANDIDATS
WHERE IDCandidat = p_IDCandidat;
SELECT COUNT(*)
INTO v_NombreCompetences
FROM CANDIDATS_COMPETENCES
WHERE IDCandidat = p_IDCandidat;
RETURN v_NombreCompetences;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Erreur: Candidat non trouvé.');
RETURN 0;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erreur: ' || SQLERRM);
RETURN NULL;
END FN_NombreCompetencesCandidat;
5)
a-
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE CLASSIFICATIONS_CANDIDATS (
ID_Classification INTEGER PRIMARY KEY,
ID_Candidat INTEGER NOT NULL,
Classe VARCHAR2(100) NOT NULL,
CONSTRAINT FK_Candidat FOREIGN KEY (ID_Candidat) REFERENCES
CANDIDATS(IDCandidat)
)';
END;
b-
CREATE SEQUENCE SeqClass
START WITH 1024
INCREMENT BY 1;
c- CREATE OR REPLACE TRIGGER T_Classifier
AFTER INSERT ON Candidats_Competences
FOR EACH ROW
DECLARE
v_Domaine VARCHAR2(100);
v_IDClassification NUMBER;
BEGIN
-- Initialiser le domaine à une chaîne vide
v_Domaine := '' '';
-- Déterminer le domaine en fonction des compétences
IF :[Link] IN ( 'Php', 'JavaScript', 'NodeJS') THEN
v_Domaine := 'Web';
ELSIF :[Link] IN ('Hadoop', 'Spark') THEN
v_Domaine := 'BigData';
ELSIF :[Link] IN (
'PowerBI', 'Talend' ) THEN
v_Domaine := 'BI';
END IF;
-- Insérer dans la table Classifications_Candidats si un domaine a été trouvé
IF v_Domaine IS NOT NULL THEN
v_IDClassification := [Link];
INSERT INTO Classifications_Candidats (ID_Classification, IDCandidat, Domaine)
VALUES (v_IDClassification, :[Link], v_Domaine);
END IF;
END;
/