|
|
|
|
Resolution d'1 exercice pl/sql
Dernière réponse le 7 mar 2009 à 22:02:14 7ammouda, le 26 mar 2008 à 15:48:35Bonjour,
est ce quelk1 peut me donner une solution pour cet exercice:
Créer un bloc PL/SQL qui détermine les n employés ayant les salaires les plus élevés.
a. La valeur de n est introduite via un paramètre de substitution SQL*PLUS.
b. Récupérez les noms et les salaires des n personnes les mieux rémunérées dans la table EMP
les enregistrer dans une table PL/SQL.
c. Assurez-vous qu'il n'y a aucun couple d'employés ayant le même salaire.
d. Testez les cas particuliers tels que n = 0 et n > au nombre d’employés dans la table EMP.
e. Affichez le contenu de la table PL/SQL à l’écran.
La table EMP est comme suit:
EMPNO(numero de l'employé)
ENAME(le nom de l'employé)
SAl(le salaire)
JOB
MGR(le manager de l'employé)
HIREDATE(date d'embauche)
DEPTNO(numero du departement)
Configuration: Windows XP Firefox 2.0.0.12
Voici un début de réponse :
CREATE OR REPLACE PROCEDURE Top_Employe(n IN NUMBER)
IS
nb_emp NUMBER;
CURSOR c_tab_temp
IS
SELECT ENAME, SAL
FROM tab_temp;
BEGIN
IF n < 0 THEN
DBMS_OUTPUT.put_line('Le nombre d''employé ne peut pas être négatif');
return;
END IF;
SELECT count(ENAME) INTO nb_emp FROM EMP;
IF nb_emp < n THEN
DBMS_OUTPUT.put_line('Le nombre d''employé dans la table est inférieur à ce que vous demandez');
return;
END IF;
INSERT INTO tab_temp
SELECT ENAME, SAL
FROM EMP
WHERE ROWNUM < n;
COMMIT;
--Vérification des salaires identiques
--Affichage des données contenues dans le curseur
END;
/
Ça te donne une bonne base pour continuer ;-) -- Alex pour vous servir -- -- N'oubliez pas de mettre vos sujets en "Résolu" lorsque vous avez la réponse ;-) -- |
Je veux Créer un bloc PL/SQL qui détermine les n employés ayant les salaires les plus élevés en utilisant un curseur explicite.
|
Bon pour fêter mon inscription sur le forum et comme je me suis amusé à écrire tout ça,je le poste, même si le sujet est marqué comme résolu.
set serveroutput on -- enable dbms_output
define n=5
declare
cursor csr_top_emp is
select ename, sal from emp order by sal desc;
type top_type is varray(&n) of csr_top_emp%ROWTYPE;
top_tab top_type;
top_idx pls_integer;
idx pls_integer;
prev_sal emp.sal%TYPE := -1;
exists_same_sal boolean := FALSE;
ex_n_to_low exception;
begin
top_idx := 0;
if &n <= 0 then
raise ex_n_to_low;
end if;
-- Parcours des employés par salaire décroissant
for csr_rec in csr loop
top_idx := top_idx + 1;
-- Détection salaires identiques
if csr_rec.sal = prev_sal then
exists_same_sal := TRUE;
end if;
prev_sal := csr_rec.sal;
-- collecte des top n
if top_idx <= &n then
top_tab(top_idx) := csr_rec;
end if;
end loop;
-- Affichage de la table des n top salaires
DBMS_OUTPUT.put_line(rpad('Employé', 30)||' '||lpad('Salaire', 12));
DBMS_OUTPUT.put_line(rpad(null, 30, '-')||' '||lpad(null, 12, '-'));
for idx in 1 .. top_idx loop
DBMS_OUTPUT.put_line(rpad(top_tab.ename, 30)||' '||lpad(top_tab.sal, 12));
end loop;
-- Affichage Warning si nombre demandé trop grand
if top_idx <= &n then
DBMS_OUTPUT.put_line('WARNING: Le nombre d''employés est inférieur au nombre demandé');
end if;
-- Affichage Warning si existe salaires identiques
if exists_same_sal = TRUE then
DBMS_OUTPUT.put_line('WARNING: Des employés ont un salaire identique');
end if;
exception
when ex_n_to_low then
DBMS_OUTPUT.put_line('ERROR: Le nombre d''employés demandé ne peut être négatif');
end;
/
|
Slt 7ammouda, t'inquiéte pas
|
Creer la table "Messages" avec une seule colonne "Results" de tupe "Number(2)"
|

