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 :

IF annee = valeur then


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Informatique
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut IF annee = valeur then
    ci-joint un imprime écran de ma base de données Nom : code.JPG
Affichages : 104
Taille : 151,4 Ko

    Bonjour tout monde,
    Je souhaiterais savoir quelle est la syntaxe correcte quand on a un attribut (date_entree) qui est de type date (ex : 13/12/14)

    Je veux faire le test sur l'année
    si date_entree = 1990 faire
    si date_entree = 1992 faire
    ...
    ..etc
    Le problème c'est qu'il m’insère les valeurs dans la table e_aumentation (no, date-augmentation et emp_no) mais pas l'augmentation, en plus j'ai l'impression qu'il ne fait même pas le test.
    v_augm : valeur d'augmentation

    Voici mon code, si vous pourriez m'aider SVP c'est urgent et merci.

    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
    set serveroutput on ;
    DECLARE
      salaire_emp    e_emp.salaire%TYPE ;
      date_ent    e_emp.dt_entree%TYPE ;
      v_augm e_augmentation.augmentation% TYPE;
      date_aug e_augmentation.date_augmentation%TYPE;
      num_emp e_emp.no% TYPE;
      dt_entree date_ent% TYPE;
      nom_emp e_emp.nom% TYPE;
      salaire salaire_emp% TYPE;
      augmentation v_augm% TYPE;
    BEGIN
    nom_emp:='&nom_emp';
        SELECT   
            e_emp.no, e_emp.nom, e_emp.salaire, e_emp.dt_entree
        INTO
            num_emp, nom_emp, salaire_emp, date_ent
        FROM
            e_emp
        WHERE   
            e_emp.nom = nom_emp for UPDATE of e_emp.salaire;
    IF
        date_ent = to_date(1990,'YYYY')
      THEN
            dbms_output.put_line ('le test');
            v_augm :=salaire * 0.5;
            UPDATE e_emp set salaire = salaire + v_augm
            where e_emp.nom= nom_emp;
        ELSIF
        date_ent = to_date(1991,'YYYY')
        THEN
            v_augm :=salaire * 0.25;
            UPDATE e_emp set salaire = salaire + v_augm where e_emp.nom=nom_emp;
        ELSIF
        date_ent = to_date(1992,'YYYY')
      THEN
        v_augm :=salaire * 0.10;
        UPDATE e_emp set salaire = salaire + v_augm where e_emp.nom=nom_emp;
      ELSE  v_augm := 0;
        END IF ;
      date_aug := sysdate;
        INSERT INTO e_augmentation (no, augmentation, date_augmentation, emp_no)
        VALUES
            (1, v_augm, date_aug, num_emp);
    COMMIT;
    END;

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 27
    Points : 51
    Points
    51
    Par défaut
    pour faire le test sur l'année: TO_CHAR(date_ent,'YYYY') = '1990'

  3. #3
    Membre à l'essai
    Homme Profil pro
    Informatique
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Je vous remercie pour votre participation
    mais comment voulez vous l’intégrer dans une condition If (condition) then ?????

    if date_entree = TO_CHAR(date_ent,'YYYY') = '1990' ??????????

    ce n'est pas possible de faire ça!!!

  4. #4
    Membre confirmé
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Points : 542
    Points
    542
    Par défaut
    Bonjour,

    En faisant ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IF  EXTRACT(year FROM date_ent) = 1990 THEN ...
     
    ELSIF  EXTRACT(year FROM date_ent) = 1992 THEN ...
     
    END IF;

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 27
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par slim025 Voir le message
    Je vous remercie pour votre participation
    mais comment voulez vous l’intégrer dans une condition If (condition) then ?????

    if date_entree = TO_CHAR(date_ent,'YYYY') = '1990' ??????????

    ce n'est pas possible de faire ça!!!
    Ben si c'est possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare
    date_ent date;
    begin
    date_ent:=sysdate;
      if TO_CHAR(date_ent,'YYYY') = '2014'  then
         dbms_output.put_line('OK');
      end if;
    end;
    Le test marche bien! Après un if avec deux fois le signe = ça marche moins bien

  6. #6
    Membre à l'essai
    Homme Profil pro
    Informatique
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je vous remercie de m'avoir aidé à résoudre ce problème. en fait, c'est avec l'idée de Bibeleuh que j'ai pu le résoudre.

    Mais est-ce que quelqu'un d'entre vous pourrait me dire comment fait-t-on pour mettre à jour le salaire de tous les emplois, donc sans demander je suppose le nom tous des employés mais juste en comparant leur date d'entrée?!!!!! (Il faut que j'utilise la boucle FOR LOOP END LOOP, j'ai essayé de la mettre un peu partout mais ça ne marche pas)

    Quelqu'un a une idée ?

    voici le code correct au cas où quelqu'un aurait besoin de la solution.

    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
    52
    53
    54
    55
    56
    57
    58
    set serveroutput on ;
    DECLARE
      salaire_emp    e_emp.salaire%TYPE ;
      date_ent    e_emp.dt_entree%TYPE;
      v_augm NUMBER(7,0);
      date_aug e_augmentation.date_augmentation%TYPE;
      num_emp e_emp.no% TYPE;
      nom_emp e_emp.nom% TYPE;
      salaire salaire_emp% TYPE;
      augmentation v_augm% TYPE;
      dt_entree date_ent% TYPE;
      aumentation NUMBER;
      no number;
      i INTEGER;
     
    BEGIN
            i:=0;
            nom_emp:='&nom_emp';    
    SELECT   
            e_emp.no, e_emp.nom, e_emp.salaire, e_emp.dt_entree
        INTO
            num_emp, nom_emp, salaire_emp, date_ent
        FROM
            e_emp
        WHERE   
            e_emp.nom = nom_emp;
     
            IF (EXTRACT(year FROM date_ent) = '1990') THEN
                    UPDATE e_emp set salaire = (salaire + (salaire * 0.5))
                    where e_emp.nom = nom_emp;               
                      IF augmentation = 0 OR augmentation is null then
                          augmentation := (salaire_emp * 0.5);
                          v_augm := augmentation;
                      end if;
     
    ELSIF (EXTRACT(year FROM date_ent) = '1991')
                THEN
                    UPDATE e_emp set salaire = (salaire + (salaire * 0.25))
                    where e_emp.nom = nom_emp;
                      IF augmentation = 0 OR augmentation is null then
                          augmentation := (salaire_emp * 0.25);
                          v_augm := augmentation;
                      end if;
              ELSIF (EXTRACT(year FROM date_ent) = '1992')
                THEN
                    UPDATE e_emp set salaire = (salaire + (salaire * 0.10))
                    where e_emp.nom = nom_emp;
                      IF augmentation = 0 OR augmentation is null then
                          augmentation := (salaire_emp * 0.10);
                          dbms_output.put_line ('augmentation insérée');
                          v_augm := augmentation;
                      end if;
            END IF;
                date_aug := sysdate;
                INSERT INTO e_augmentation (no, augmentation, date_augmentation, emp_no)
                VALUES (2, v_augm, date_aug, num_emp);     
    COMMIT;
    END;

    Bien cordialement.

    S.B

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    développeur Oracle
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Roumanie

    Informations professionnelles :
    Activité : développeur Oracle
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 26
    Points
    26
    Par défaut utiliser un morceau de code comme ceci
    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
    DECLARE
      TYPE aug_salaire_typ IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
      aug_salaire aug_salaire_typ;
        max_id e_augmentation.no%TYPE;
     
      PROCEDURE augmenter_salaire(nom_emp_in e_emp.nom%type)
        l_dt_entree PLS_INTEGER;
          l_salaire e_emp.salaire%TYPE;
      AS
         BEGIN
             SELECT salaire, EXTRACT(YEAR FROM dt_entree)
             INTO l_salaire, l_dt_entree
             FROM e_emp
             WHERE nom = nom_emp_in
             FOR UPDATE OF salaire NOWAIT;
     
             IF aug_salaire.EXISTS(l_dt_entree) THEN
                 UPDATE e_emp
                 SET salaire = salaire (1 + aug_salaire(l_dt_entree))
                 WHERE e_emp.nom = nom_emp;
     
                 -- tu peux utiliser un séquence pour le clé primaire
                 SELECT MAX(no)
                 INTO max_id
                 FROM e_augmentation;
     
                 INSERT INTO e_augmentation (no, augmentation, date_augmentation, emp_no) VALUES (NVL(max_id, 0) + 1, (l_salaire * aug_salaire.EXISTS(l_dt_entree)), SYSDATE, num_emp);
     
                 COMMIT;
             ELSE
                 DBMS_OUTPUT.PUT_LINE('Employe ' ||  nom_emp_in || ' n''ai pas peux changher pour l''annee ' || l_dt_entree);
                 RETURN;    
             END IF;
        EXCEPTION
             WHEN OTHERS THEN
                 DBMS_OUTPUT.PUT_LINE('Employe ' ||  nom_emp_in || ' n''ai ete traité');
                 ROLLBACK;
        END augmenter_salaire; 
    BEGIN
        -- tu peux definir beaucoup d'annees ici, la procédure ne change pas
       aug_salaire(1990) := 0.50;
       aug_salaire(1991) := 0.25;
       aug_salaire(1992) := 0.10;
     
         -- traiter tout la table
         FOR c_rec IN (SELECT nom FROM e_emp) LOOP
             augmenter_salaire(c_rec.nom);
         END LOOP;
    END;

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

Discussions similaires

  1. If colonne = différentes valeurs then
    Par 67jero dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/06/2010, 16h25
  2. test if then else qql soit la valeur
    Par didier.schmit dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 29/02/2008, 02h33
  3. Exclure valeur avec if then else
    Par kgb1917 dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/10/2007, 13h33
  4. Réponses: 4
    Dernier message: 06/01/2006, 18h41
  5. case/when avec plusieurs valeurs pour le then
    Par Neo41 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2005, 15h58

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