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 :

Utilisation du Case à l'intérieur d'un Loop


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 80
    Par défaut Utilisation du Case à l'intérieur d'un Loop
    Bonjour tout le monde;

    J'essaie d'apprendre le langage PL/SQL

    je ne sais pas si c'est faisable d'utiliser une boucle avec case et loop, voilà ce que j'ai fait :

    --déclarer un curseur
    -- parcourir le curseur avec un loop , et effectuer les traitements avec un case
    for compteur in curseur loop
    case ...etc.
    l'erreur que j'ai est : le symbole case rencontré à la place d'un des symboles suivants: begin declare etc

    Pouvez vous m'éclairer s'il vous plait.
    Merci de votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Par défaut
    Tu peux nous mettre en copier/coller le code tu as écrit ? On y verrait plus clair déjà, non ?

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 80
    Par défaut
    Salut!

    oui merci.
    alors voici la portion (pas du tout fameuse) que j'ai faite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    declare c varchar2(100) :='';
         compteur number :=0;
         cursor cur is (select * from client);
     begin
         for var in cur loop
             case var.fonction
             when 'Boulanger' then c:=c||'Boulanger  '; compteur:=compteur+var.capital; 
                                   insert into recap (Fcts, Total)
                                          values (c,compteur);
         else message ('La fonction est: '||var.fonction);
         end case;
     end loop;
     end;
    bon le but c'est de me familiariser avec le case
    les tables :
    client(mat, nom, prenom, fonction, capital)
    recap (Fcts, Total)

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Par défaut
    Ok,
    Desfois il ne faut pas se prendre la tête avec du code compliqué ... qui ne compile pas. L'utilisation du CASE ici n'est pas du tout bonne. A la place il est plus approprié d'utiliser l'opérateur IF ... THEN ... ELSE ... END IF;

    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
    DECLARE
       c          VARCHAR2 (100) := '';
       compteur   NUMBER         := 0;
     
       CURSOR cur
       IS
          (SELECT *
             FROM client);
    BEGIN
       FOR var IN cur
       LOOP
          IF var.fonction = 'Boulanger'
          THEN
             c := c || 'Boulanger  ';
             compteur := compteur + var.capital;
     
             INSERT INTO recap(fcts, total)
                  VALUES (c, compteur);
          ELSE
             MESSAGE ('La fonction est: ' || var.fonction);
          END IF;
       END LOOP;
    END;
    /
    Par contre l'utilisation du case dans une requête SQL simple peut être justifiée :

    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
     
    insert into client values (1, 'Durand', 'Alain', 'Boulanger', 10);
    insert into client values (1, 'Durond', 'Alexandre', 'Ouvrirr', 20);
    insert into client values (1, 'Dupond', 'Alexis', 'Patissier', 30);
    insert into client values (1, 'Dupont', 'Alban', 'Médecin', 40);
    insert into client values (1, 'Dupand', 'Alin', 'Cardiologue', 50);
    insert into client values (1, 'Dupont', 'Alexandri', 'Boulanger', 60);
    insert into client values (1, 'Dury', 'Jérome', 'Boulanger', 12);
    insert into client values (1, 'Dugary', 'Christophe', 'Footballeur', 70);
    COMMIT ;
     
     
    SELECT mat, fonction,
           CASE
              WHEN fonction = 'Boulanger'
                 THEN 'BL'
              WHEN fonction = 'Patissier'
                 THEN 'PT'
              WHEN fonction = 'Footballeur'
                 THEN 'FT'
              ELSE 'AUTRE'
           END AS fct
      FROM client;

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 80
    Par défaut
    Merci beaucoup alexisongagna d'avoir ^pris la peine de me répondre et pour les astuces aussi!
    oui c'est vrai un if aurait été mieux, mais je voulais tester rapidement histoire d'apprendre vite :p

    je vais réessayer avec tes portions

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 80
    Par défaut
    Alors ça fonctionne bien sous sql plus, mais pas sous PL/sql : )

    je pense d'après cette discussion http://www.developpez.net/forums/d90...l/case-pl-sql/, que c'est dû à la version que j'utilise : la version 8i d'oracle

    alexisongagna STP, peut tu me dire si la syntaxe de ma portion est juste (le melange entre un curseur, un loop et un case)? (je sais l'utilisation d'un case est inutile dans ce cas précis)

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

Discussions similaires

  1. Utilisation de case dans un script
    Par mirlidas dans le forum Linux
    Réponses: 1
    Dernier message: 11/12/2006, 14h46
  2. Réponses: 21
    Dernier message: 21/07/2006, 16h55
  3. [Swing] Utilisation de cases à cocher
    Par gids01 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 25/04/2006, 15h21
  4. Réponses: 24
    Dernier message: 24/11/2005, 10h28
  5. [mySQL] Newbie : Utilisation de CASE
    Par SergeF dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 14/07/2005, 00h39

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