Resolution d'1 exercice pl/sql

Résolu/Fermé
7ammouda Messages postés 10 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 27 mai 2008 - 26 mars 2008 à 15:48
imoooo Messages postés 14 Date d'inscription jeudi 19 mai 2016 Statut Membre Dernière intervention 2 juin 2016 - 2 juin 2016 à 18:17
Bonjour,
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)

9 réponses

sanou2a89 Messages postés 1 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 12 décembre 2009 2
12 déc. 2009 à 16:13
je veu vrmt avoir un cours de pl/sql bien detaillé svp
2
Utilisateur anonyme
27 mars 2008 à 15:24
Regarde juste un peu plus haut tu as la solution. Si tu ne comprends pas poses des questions au lieu de débilement remettre ta demande -_-
2
ta7founa Messages postés 1 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 9 avril 2008 3
9 avril 2008 à 22:35
slt 7ammouda, t'inquiéte pas
voici la bonne solution :


SET SERVEROUTPUT ON
ACCEPT p_num PROMPT 'Saisissez le nombre d'employés les mieurs rénumérés:'
DECLARE
v_csal NUMBER;
v_count NUMBER;
v_num NUMBER:=&p_num;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR emp_cursor IS
SELECT ename, sal FROM emp
ORDER BY sal DESC;
TYPE typ_tab_emp IS TABLE OF emp_cursor%ROWTYPE
INDEX BY BINARY_INTEGER;
tab_emp typ_tab_emp;
BEGIN
SELECT COUNT(DISTINCT SAL), COUNT(SAL) INTO v_csal,v_count FROM EMP;
IF v_num=0 OR v_num>v_count THEN
DBMS_OUTPUT.PUT_LINE('Saisie erronée!');
ELSIF v_csal=v_count THEN
OPEN emp_cursor;
FETCH emp_cursor INTO v_ename, v_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND LOOP
tab_emp(emp_cursor%ROWCOUNT).ename:=v_ename;
tab_emp(emp_cursor%ROWCOUNT).sal:=v_sal;
FETCH emp_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE emp_cursor;
FOR cpt IN 1..v_num LOOP
DBMS_OUTPUT.PUT_LINE('Nom: '||tab_emp(cpt).ename||' et sal: '||tab_emp(cpt).sal);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('Il y a des employés qui ont le même salaire!');
END IF;
END;
/
2
salut je veux savoir est ce qu'on peut avoir deux curseurs explicites ?
merci pour votre aide
0
wi on peu,
0
imoooo Messages postés 14 Date d'inscription jeudi 19 mai 2016 Statut Membre Dernière intervention 2 juin 2016
2 juin 2016 à 18:17
Merciiiii
0
creer la table "Messages" avec une seule colonne "Results" de tupe "Number(2)"
ecrivez un bloc PL/SQL pour insérer des nombres dans la table "Messages"
A.insérer les nombres de 1 à 10, en excluant 6 et 8.
B.effectuer une validation "commit" avant la fin du bloc.
C.afficher le contenu de la table "Messages" pour tester votre bloc PL/SQL.
2

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Moerco-fr Messages postés 5 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 19 décembre 2009 3
9 juil. 2008 à 01:08
comme ça, à première vue, mais je n'ai rien pour tester :

create table messages(results number(2));

declare
  i number(2);
begin
  for i in 1..10 loop
    if i not in (6,8) then
      insert into messages values (i);
    end if;
  end loop;

  commit;
end;
/

select * from messages;
2
Moerco-fr Messages postés 5 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 19 décembre 2009 3
2 avril 2008 à 01:29
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.

Alors comme je n'ai pas de noyau Oracle sur place, je n'ai pas testé, même pas la syntaxe, mais ça peut donner une idée; ça devrait quand même pas être trop faux, le PL c'est mon métier, même si je ne manipule pas très souvent certaines notions comme les varray utilisés ici.

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;
/
1
Utilisateur anonyme
26 mars 2008 à 17:03
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 ;-)
0
7ammouda Messages postés 10 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 27 mai 2008
27 mars 2008 à 13:36
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.
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 et
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 structure de la table est la suivante
empno (numero emp)
ename (nom)
job
mgr(manager)
sal(salaire)
hiredate(date d'embauche)
deptno(numéro département)
merci d'avance
0
hasna abir Messages postés 1 Date d'inscription dimanche 21 avril 2013 Statut Membre Dernière intervention 21 avril 2013
21 avril 2013 à 22:03
je besoin d'une solution !!!
écrire une fonction en PL/SQL qui retourne le nombre de laboratoire pour une faculté donnée puis un bloc qui appelle cette fonction et l'expérimente avec quelques laboratoire de la BD
0