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 :

Aide correction requetes pl/ sql


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 67
    Par défaut Aide correction requetes pl/ sql
    Bonjour , je me presente je suis un deputant en pl/ sql

    je desire avoir de l'aide et une correction de cette requetes

    je dois faire une fonction de mise a jour des salaires de tous les employer qui appartien a un deparement a lexeption du chef departement ( le numero de departement doit etre entrrer en parametre avec le taux d'augmentation) la mise a jour doit s'appliquer seulement si le total des salaires de tous les employer de ce departement ne depasse pas 15000

    comment appliquer le <15000 et comment exclure le chef departement me pose un problem

    voici ce que j'ai tenter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE PROCEDURE AugmenteSalair(taux In Number, 
              numdep In Number, nbContratMod Out Number) IS
    Begin
       if taux > 0 AND taux <= 100 then
       	Update Employes set salaireemploye = 
                        salaireemploye*(1 + (taux/100)) 
    	WHERE  numdep =(select NumDepartement from departements  where chefDepartement=null) ;
            nbContratMod := SQL%ROWcount;
       else
            nbContratMod := -1;
       end if;  
    End;
    /
    merci pour l'aide et pour l'explication

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 67
    Par défaut
    P.S : Pour mieux comprendre voici le shema de ma bd

    Uploaded with ImageShack.us

  3. #3
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Bonjour,


    . . . WHERE chefDepartement=NULL
    Rien n'est jamais égal à NULL (même la valeur NULL elle-même). Afin de vérifier si la valeur du chefDepartement est NULL il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    . . . WHERE chefDepartement IS NULL . . .
    En se basant sur la définition de vos tables, le code ressemblera à celui-ci
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    CREATE OR REPLACE PROCEDURE AugmenteSalair
    (
        taux            IN  NUMBER, 
        numdep          IN  NUMBER, 
        nbContratMod    OUT NUMBER
    ) 
    IS
        l_total_salaire PLS_INTEGER;
    BEGIN
        SELECT SUM(salaireEmploye)
        INTO l_total_salaire
        FROM employes
        WHERE numDepartement = numdep;
     
        IF l_total_salaire > 15000
        THEN
            RETURN;
        END IF;
     
        IF taux > 0 AND taux <= 100
        THEN
            UPDATE Employes
            SET salaireemploye = salaireemploye * (1 + (taux/100)) 
            WHERE  NumDepartement = numdep AND
                   NumDepartement IN
                   (
                        SELECT NumDepartement 
                        FROM departements
                        WHERE chefDepartement IS NULL
                   );
            nbContratMod := SQL%ROWcount;
        END IF;
     
        EXCEPTION
            /* 
             * Ici vous remplacez DBMS_OUTPUT.PUT_LINE
             * avec la routine appropriée afin de mettre
             * à jour votre table/fichier de log
             */ 
            WHEN NO_DATA_FOUND 
            THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
                RAISE;
            WHEN TOO_MANY_ROWS
                THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
                RAISE;
     
    END AugmenteSalair;
    /

    Cordialement,

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 67
    Par défaut
    Permettez moi de vous remercier , ça ne vous dérange pas si vous m'expliquer un peu? En effet , j'aimerais comprendre le code , si ça ne vous dérange pas

  5. #5
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Citation Envoyé par napi15 Voir le message
    Permettez moi de vous remercier , ca vous derange si vous m'expliquer un peu? En effet , j'aimerais comprendre le code , si ca vous derange pas
    Tout d'abord, je pense que je me suis trompé sur les nom des columns (d'habitude on fourni la description DDL/DML des tables au lieu des noms sous-lignés, c'est plus clair).

    Je pense que c'est ça la bonne version de la requête UPDATE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    UPDATE Employes t1
            SET salaireemploye = salaireemploye * (1 + (taux/100)) 
            WHERE  NumDepartement = numdep AND
                   NumEmployee NOT IN
                   (
                        SELECT ChefDepartement 
                        FROM departements t2
                        WHERE t1.NumDepartement = t2.NumDepartement AND
                        ChefDepartement IS NOT NULL
                   );

    En fait je me suis basé sur les règles définies dans votre commentaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE OR REPLACE PROCEDURE AugmenteSalair
    (
        taux            IN  NUMBER, 
        numdep          IN  NUMBER, 
        nbContratMod    OUT NUMBER
    ) 
    IS
        l_total_salaire PLS_INTEGER;
    l_total_salaire est la variable que l'on va utiliser pour calculer la somme de tous les salaires du départment numdep (passé en paramètre de la procédure), c'est nécessaire car vous avez dit qu'il n'y aura d'augmentation que si la somme ne dépasse pas 15000.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN
        SELECT SUM(salaireEmploye)
        INTO l_total_salaire
        FROM employes
        WHERE numDepartement = numdep;
    Et bien justement on vient de calculer la somme des salaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IF l_total_salaire > 15000
        THEN
            RETURN;
        END IF;
    Si la somme dépasse 15000 et bien ce n'est plus la peine de continuer, et on quitte la procédure (RETURN)

    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
     
    IF taux > 0 AND taux <= 100
        THEN
            UPDATE Employes t1
            SET salaireemploye = salaireemploye * (1 + (taux/100)) 
            WHERE  NumDepartement = numdep AND
                   NumEmployee NOT IN
                   (
                        SELECT ChefDepartement 
                        FROM departements t2
                        WHERE t1.NumDepartement = t2.NumDepartement AND
                        ChefDepartement IS NOT NULL
                   );
            nbContratMod := SQL%ROWcount;
        END IF;
    on fait le UPDATE uniquement pour les employés du département en question,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     . . . WHERE  NumDepartement = numdep . . .
    pour les salariés à l'excepttion de chef du département
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    . . . 
    AND
    NumEmployee NOT IN
    (
        SELECT ChefDepartement 
        FROM departements t2
        WHERE t1.NumDepartement = t2.NumDepartement AND
        ChefDepartement IS NOT NULL
    );
    Et on compte le nombre des lignes affectées par cet UPDATE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    . . .  nbContratMod := SQL%ROWcount; . . .
    La partie finale du code, les deux exceptions sont pour le cursor IMPLCIT, SELECT INTO que l'on fait au début du code SELECT SUM(salaireEmploye) INTO l_total_salaire . . . (C'est-ce qu'il faut faire en général quand on utilise IMPLICIT CURSOR)


    Cordialement,
    Dariyoosh

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par dariyoosh Voir le message
    ...
    La partie finale du code, les deux exceptions sont pour le cursor IMPLCIT, SELECT INTO que l'on fait au début du code SELECT SUM(salaireEmploye) INTO l_total_salaire . . . (C'est-ce qu'il faut faire en général quand on utilise IMPLICIT CURSOR)
    Dans quels cases précis pensez vous que votre Select SUM(…) pourrait soulever les exceptions évoquées : NO_DATA_FOUND et TOO_MANY_ROWS ?

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Citation Envoyé par dariyoosh Voir le message
    La partie finale du code, les deux exceptions sont pour le cursor IMPLCIT, SELECT INTO que l'on fait au début du code SELECT SUM(salaireEmploye) INTO l_total_salaire . . . (C'est-ce qu'il faut faire en général quand on utilise IMPLICIT CURSOR)
    Sauf qu'une agrégation (sans GROUP BY) ne renverra jamais TOO_MANY_ROWS.
    De même elle ne renverra pas NO_DATA_FOUND :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> select 1 from dual where 1=0;
     
    no rows selected
     
    SQL> select sum(1) from dual where 1=0;
     
        SUM(1)
    ----------
     
     
    SQL>
    Donc dans ce cas précis cette gestion des exceptions n'apporte rien.

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

Discussions similaires

  1. [SQL] Aide pour requete
    Par fallais dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/08/2006, 14h44
  2. Besoin aide pour Requete SQL
    Par mystik11 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/07/2006, 11h34
  3. [OGS ?] Demande d'aide pour requete SQL
    Par hamtary dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/03/2006, 12h58
  4. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39
  5. [SQL] aide pour requete UPDATE SVP
    Par ganok dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/03/2005, 09h17

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