Resolution d'1 exercice pl/sql

Résolu
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)
Configuration: Windows XP
Firefox 2.0.0.12

9 réponses

  1. je veu vrmt avoir un cours de pl/sql bien detaillé svp
    2
    1. 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
      1. 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
        1. salut je veux savoir est ce qu'on peut avoir deux curseurs explicites ?
          merci pour votre aide
          0
        2. wi on peu,
          0
        3. Merciiiii
          0
      2. 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
        1. 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
          1. 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
            1. 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
              1. 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
                1. 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