Resolution d'1 exercice pl/sql

Résolu
7ammouda Messages postés 10 Statut Membre -  
imoooo Messages postés 17 Statut Membre -
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. sanou2a89
     
    je veu vrmt avoir un cours de pl/sql bien detaillé svp
    2
  2. Utilisateur anonyme
     
    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
  3. ta7founa Messages postés 1 Statut Membre 3
     
    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. WALLOULA
       
      salut je veux savoir est ce qu'on peut avoir deux curseurs explicites ?
      merci pour votre aide
      0
    2. informaticienne
       
      wi on peu,
      0
    3. imoooo Messages postés 17 Statut Membre
       
      Merciiiii
      0
  4. Kayle
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Moerco-fr Messages postés 5 Statut Membre 3
     
    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
  7. Moerco-fr Messages postés 5 Statut Membre 3
     
    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
  8. Utilisateur anonyme
     
    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
  9. 7ammouda Messages postés 10 Statut Membre
     
    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
  10. hasna abir Messages postés 1 Statut Membre
     
    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