Vous êtes sur la page 1sur 5

TD1_Groupe_Karama_Majd_Houssem

** Exercice 1:
DECLARE
v_prix_dinars PRODUIT.prixuni%TYPE;
v_prix_euros NUMBER(10, 0);
v_num_prod PRODUIT.numprod%TYPE;
v_desig PRODUIT.desi%TYPE;
v_num_fouriss PRODUIT.numfour%TYPE;
x_count NUMBER := 0;

CURSOR c_produits IS
SELECT numprod, desi, prixuni, numfour
FROM PRODUIT;
BEGIN
SELECT COUNT(*) INTO x_count FROM PRODUIT;
IF x_count = 0 THEN
INSERT INTO PRODUIT2 VALUES (0, 'Pas de produit', NULL);
ELSE
FOR i IN c_produits LOOP
v_num_prod := i.numprod;
v_desig := UPPER(i.desi); -- Convertir en majuscules
v_prix_dinars := NVL(i.prixuni, 0); -- Traiter les cas où le prix est NULL
v_prix_euros := ROUND(v_prix_dinars / 2.129);
INSERT INTO PRODUIT2 (numprod, desi, prixuni, numfour)
VALUES ( v_num_prod, v_desig, v_prix_euros, i.numfour);
END LOOP;
END IF;
END;
** Exercice 2:
DECLARE
v_n_uplets NUMBER;
v_jongleurs NUMBER;
v_proportion NUMBER;
BEGIN
SELECT COUNT(*) INTO v_n_uplets FROM PERSONNEL;
SELECT COUNT(*) INTO v_jongleurs FROM PERSONNEL WHERE Role = 'Jongleur';
v_proportion := (v_jongleurs / v_n_uplets) * 100;
DBMS_OUTPUT.PUT_LINE('La proportion des jongleurs est : ' || v_proportion || '%');
EXCEPTION
IF v_n_uplets = 0 THEN
DBMS_OUTPUT.PUT_LINE ('Erreur Fatale :La table PERSONNEL est vide.');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('Aucune donnée trouvée dans la table PERSONNEL.');
END;
** Exercice 3:
DECLARE
v_Nom_table VARCHAR2(100);
v_Type_table VARCHAR2(20);
BEGIN
DBMS_OUTPUT.PUT_LINE('----------------------------------------');
DBMS_OUTPUT.PUT_LINE('| TNAME | TABTYPE |');
DBMS_OUTPUT.PUT_LINE('----------------------------------------');

FOR i IN (SELECT nom_table, type_table FROM Users


UNION ALL
SELECT nom_view, 'VIEW' FROM Views)
LOOP
v_Nom_table := i.nom_table;
v_Type_table := i.type_table;
DBMS_OUTPUT.PUT_LINE('| ' || RPAD(v_Nom_table, 20) || ' | ' || RPAD(v_Type_table, 15) ||
' |');
END LOOP
DBMS_OUTPUT.PUT_LINE('----------------------------------------');
END;

RPAD est utilisée pour ajuster la longueur de la chaîne afin qu'elle ait une longueur fixe de 20
caractères pour le nom de la table et 15 caractères pour le type.
** Exercice 4:
DECLARE
CURSOR c_vols IS
SELECT VolNum, AvNum, HeureDep, HeureArr
FROM VOL
WHERE AvNum IN (1, 2, 4, 8);
v_num_vol VOL.VolNum%TYPE;
v_num_avion VOL.AvNum#%TYPE;
v_heure_depart VOL.HeureDep%TYPE;
v_heure_arret VOL.HeureArr%TYPE;
v_duree_vol NUMBER;
BEGIN
OPEN c_vols;
LOOP
FETCH c_vols INTO v_num_vol, v_num_avion, v_heure_depart,v_heure_arret;
EXIT WHEN c_vols%NOTFOUND;
v_duree_vol := v_heure_arret - v_heure_depart;
IF v_num_avion IN (1, 4) THEN
v_duree_vol := v_duree_vol * 0.9;
ELSIF v_num_avion IN (2, 8) THEN
v_duree_vol := v_duree_vol * 0.85;
END IF;
UPDATE VOL
SET HeureArr = v_heure_depart + v_duree_vol
WHERE VolNum = v_num_vol;
DBMS_OUTPUT.PUT_LINE('Vol ' || v_num_vol || ' : Nouvelle heure d''arrivée = ' ||
(v_heure_depart + v_duree_vol));
END LOOP;
CLOSE c_vols;
END;

** Exercice 5:
DECLARE
CURSOR c IS
SELECT num_attribut, COUNT(*) AS nb_occurrences
FROM TEST_DBL
GROUP BY num_attribut
HAVING COUNT(*) > 1;
BEGIN
DBMS_OUTPUT.PUT_LINE('Valeurs présentes au moins en double :');

FOR i IN c LOOP
DBMS_OUTPUT.PUT_LINE('Valeur : ' || i.num_attribut || ', Occurrences : ' ||
i.nb_occurrences);
END LOOP;

-- Suppression des doublons


DELETE FROM TEST_DBL
WHERE ROWID NOT IN (
SELECT MIN(ROWID)
FROM TEST_DBL
GROUP BY num_attribut
HAVING COUNT(*) > 1
);
DBMS_OUTPUT.PUT_LINE('Doublons supprimés.');
END;

ROWID garantit que seule une occurrence de chaque valeur de num_attribut


est conservée dans la table.

Vous aimerez peut-être aussi