IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Problème dans une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 52
    Points : 42
    Points
    42
    Par défaut Problème dans une procédure
    bonjour tout le monde;
    je vous serait très reconnaissant si vous voulez bien me dire ou est e problème.
    En faite il s'agit d'une procédure en pl sql qui fait une augmentation salariale
    je vous joint le modèle physique en pièce jointe.Nom : MPD.GIF
Affichages : 240
Taille : 46,9 Ko

    L'énoncé est comme suit :
    Automatisez à l’aide d’unité(s) de programmation PL/SQL l’augmentation salariale des employés ayant plus de 10 ans d’expérience pour un travail donné dans l’entreprise.
    Une augmentation de salaire signifie passer d’un salaire de niveau n à un salaire de niveau n+1 (classe_salariale.niveau_sal). Les employés en niveau 5 (maximum de classe_salariale.niveau_sal) n’ont pas le droit à une augmentation de salaire.
    Notez qu’il n’y a que 5 enregistrements dans la table CLASSE_SALARIALE (correspondant aux 5 niveaux de salaire).

    le problème dans ma requête que j arrive pas a trouver comment updater la table travaille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     create or replace procedure augmentation_salariale (nombre_années_experience in number)  is 
    Begin
          declare 
          cursor cursor_1 is 
        select   emp_id,travaille.sal_id,dep_id , classe_salariale.niveau_sal,debut  from   travaille, classe_salariale 
          where  travaille.sal_id = classe_salariale.sal_id 
          and    classe_salariale.niveau_sal < 5
          and    to_char(sysdate,'yyyy')-to_char(travaille.debut,'yyyy') > nombre_années_experience; 
     
          niveau_salaire     classe_salariale.niveau_sal%type; 
          identifiant_salaire  classe_salariale.sal_id%type;
          identifiant_employe  travaille.emp_id%type ;
          identifiant_dep    travaille.dep_id%type;
          begin 
          open cursor_1;
          loop 
                  fetch cursor_1 into identifiant_employe ,identifiant_dep, identifiant_salaire, niveau_salaire, date_debut ;
                  exit when cursor_1%notfound ;
                  update travaille  set emp_id= identifiant_employe,
                  sal_id =(select sal_id from classe_salariale where classe_salariale.niveau_sal= niveau_salaire  + 1),
     
                  dep_id = identifiant_dep,
                  where travaille.debut= date_debut; 
     
          end loop; 
          close cursor_1;
     
    end;
    end;
     
    execute augmentation_salariale(10);

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Quelques petites astuces :
    1/ Pas obligé de mettre un DECLARE dans une proc, elle se situe entre le IS et le BEGIN
    2/ Eviter si possible les OPEN CURSOR, préférer les FOR LOOP plus simples.

    Ensuite pour ton souci d'update, tu y es presque. Tu dois mettre la PK de la table Travaille dans la condition Where car tu mets à jour ligne par ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set emp_id= identifiant_employe
    il ne faut pas, tu ne modifies pas cette colonne.

    Je te donne juste une petite correction et la méthode avec le FOR LOOP, à toi de continuer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CREATE OR REPLACE PROCEDURE augmentation_salariale (nombre_années_experience IN number)  IS 
     
      CURSOR cursor_1 IS 
        SELECT   emp_id,travaille.sal_id,dep_id , classe_salariale.niveau_sal,debut  FROM   travaille, classe_salariale 
        WHERE  travaille.sal_id = classe_salariale.sal_id 
        AND    classe_salariale.niveau_sal < 5
        AND    TO_CHAR(SYSDATE,'yyyy')-TO_CHAR(travaille.debut,'yyyy') > nombre_années_experience; 
     
    BEGIN 
      FOR res1 IN cursor_1;
      LOOP 
     
        UPDATE travaille  
        set sal_id =(SELECT sal_id FROM classe_salariale WHERE classe_salariale.niveau_sal= res1.niveau_sal  + 1)
        WHERE ... pk = cursor.pk_de_travaille..
     
      END LOOP; 
     
    END;
    Bien sur, il est encore optimisable. Le SQL est fait pour traiter ce genre de procédure en une seule requête, mais ce n'est pas le but de ton TP je pense.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 52
    Points : 42
    Points
    42
    Par défaut problème dans une procédure
    Bonjour McM,
    Merci infiniment pour tes corrections, ça m'a servis d'exécuter la procédure mais sans aucun effet sur la table travaille .
    et effet la procédure s'exécute sans mettre a jour le SAL_ID dans la table travaille;
    et je ne sais pas ou est le problème .
    je vous joint le nouveau code sql ci-dessous

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    create or replace procedure augmentation_salariale (nombre_années_experience in number)  is 
     
              cursor cursor_1 is 
                   select   emp_id,travaille.sal_id,dep_id , classe_salariale.niveau_sal from   travaille, classe_salariale 
                    where  travaille.sal_id = classe_salariale.sal_id 
                     and    classe_salariale.niveau_sal < 5
                      and    to_char(sysdate,'yyyy')-to_char(travaille.debut,'yyyy') > nombre_années_experience; 
     
          niveau_salaire     classe_salariale.niveau_sal%type; 
          identifiant_salaire  classe_salariale.sal_id%type;
          identifiant_employe  travaille.emp_id%type ;
          identifiant_dep    travaille.dep_id%type;
     
          begin 
          for res in cursor_1 loop
     
     
                  fetch cursor_1 into identifiant_employe ,identifiant_dep, identifiant_salaire, niveau_salaire ;
                   exit when cursor_1%notfound ;
                    update travaille  set  sal_id =(select sal_id from classe_salariale where classe_salariale.niveau_sal= niveau_salaire + 1)
                    where 
                    travaille.emp_id=identifiant_employe and travaille.dep_id=identifiant_dep and travaille.sal_id=identifiant_salaire;
                      commit;
     
          end loop;
     
     
     
    end;
     
    show errors,
     
    execute augmentation_salariale(10);

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Et bien voila une seconde raison pour éviter les fetch et préférer le FOR LOOP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select   emp_id, travaille.sal_id, dep_id, classe_salariale.niveau_sal from   travaille, classe_salariale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fetch cursor_1 into identifiant_employe ,identifiant_dep, identifiant_salaire, niveau_salaire ;
    L'ordre des colonnes n'est pas le bon.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    J'ajouterai que pour débugguer, tu peux utiliser du DBMS_OUTPUT.PUT_LINE si tu lances ta requête avec sql+ ou un sqldev, afin d'avoir des traces, ou de mettre des infos dans une table de trace.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 52
    Points : 42
    Points
    42
    Par défaut
    Bonjour Mcm;

    Merci infiniment pour votre aide très précieuse, voilà j'ai pu résoudre mon problème en se basant bien sur sur vos conseils concernant l'utilisation de boucle à la place de fetch et aussi l'inversion de l'ordre des identifiants.
    je mets ci-dessous le code corrigé.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    create or replace procedure augmentation_salariale (nombre_années_experience in number)  is 
     
              cursor cursor_1 is 
                   select   emp_id,dep_id ,travaille.sal_id, classe_salariale.niveau_sal from   travaille, classe_salariale 
                    where  travaille.sal_id = classe_salariale.sal_id 
                     and    classe_salariale.niveau_sal < 5
                      and    to_char(sysdate,'yyyy')-to_char(travaille.debut,'yyyy') > nombre_années_experience; 
          begin 
          for res in cursor_1 loop
                    update travaille  set  sal_id =(select sal_id from classe_salariale where classe_salariale.niveau_sal= res.niveau_sal + 1)
                    where 
                    travaille.emp_id=res.emp_id and travaille.dep_id=res.dep_id and travaille.sal_id=res.sal_id;
                    commit;
          end loop;
    end;
     
    execute augmentation_salariale(10);
    [/CODE]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème dans une procédure
    Par winnyzeboss1 dans le forum SQL
    Réponses: 2
    Dernier message: 08/11/2006, 11h00
  2. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  3. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 17h45
  4. Problème d'alter table dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2005, 09h19
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo