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

Oracle Discussion :

PL/SQL avec WHERE IN [11g]


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 41
    Points : 35
    Points
    35
    Par défaut PL/SQL avec WHERE IN
    Bonjour,

    J'ai un problème d'interprétation de requête dans une clause IN.

    Je pars d'un logiciel que je ne contrôle qui récupère une liste de magasins au format VARCHAR(N) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LISTE_MAG := '''24'',''30'',''52'''
    Le N s'adapte au nombre de magasins récupérés.

    Voici le code :
    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
    create or replace PROCEDURE PROMO_W (LISTE_MAG VARCHAR2) IS
     
        nb_mag                                          NUMBER(4);
        vcode_mag                                       NUMBER(4);
        vliste_mag                                  VARCHAR2(200);
        vliste_mag2                                 VARCHAR2(200);
     
    BEGIN
     
      vliste_mag2 := translate(LISTE_MAG, 'A''', 'A');
      DBMS_Output.Put_Line ('Magasins translate : '||vliste_mag2);
     
      vliste_mag2:=','||vliste_mag2||',';
      SELECT REGEXP_COUNT(vliste_mag2,',',1,'i')-1 INTO nb_mag FROM dual;
      DBMS_Output.Put_Line ('Nb Magasins : '||nb_mag);
     
      vliste_mag := null;
      FOR i IN 1..nb_mag
      LOOP
        SELECT substr(vliste_mag2,1+instr (vliste_mag2,',',1,i),instr (vliste_mag2,',',1,i+1)- instr (vliste_mag2,',',1,i)-1) INTO vcode_mag FROM dual;
        vliste_mag := vliste_mag||','||to_number(vcode_mag);
      END LOOP;
     
      vliste_mag := substr(vliste_mag,2);
     
      DBMS_Output.Put_Line ('Magasins 2  : '||vliste_mag);
     
      FOR mag in (select nommagasin from magasins where codemagasin in (vliste_mag))
      LOOP
        DBMS_Output.Put_Line ('Magasins : '||mag.nommagasin);
      END LOOP;
    END;
    Je n'arrive pas à récupérer correctement ma liste de magasins pour ma condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where codemagasin in (vliste_mag)
    J'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Connexion à la base de données BBD_R7.
    ORA-01722: Nombre non valide
    ORA-06512: à "PROMO.PROMO_W", ligne 57
    ORA-06512: à ligne 8
    Magasins Init : '24','30','52'
    Magasins translate : 24,30,52
    Nb Magasins : 3
    Magasins 2  : 24,30,52
    Processus fermé.
    Déconnexion de la base de données BBD_R7.
    Est-ce qu'il existe un moyen de contourner ce problème sans passer par une boucle ?

    Merci d'avance pour l'aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Vous devriez trouver votre salut dans cet article (en anglais) :
    http://tkyte.blogspot.fr/2006/06/varying-in-lists.html

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Merci Waldar !!

    Cela répond exactement à ma problématique.

    La solution n'est pas triviale mais plutôt élégante

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

Discussions similaires

  1. requete SQL clause WHERE avec variable
    Par gabule dans le forum JDBC
    Réponses: 6
    Dernier message: 09/01/2019, 11h04
  2. ma Requête SQL avec WHERE me demande un parametre
    Par symbabeauchat dans le forum IHM
    Réponses: 3
    Dernier message: 13/08/2011, 10h53
  3. Requête sql avec where
    Par sondo dans le forum WinDev
    Réponses: 6
    Dernier message: 23/04/2008, 13h47
  4. requete SQL avec where dynamique dans une servlet
    Par Mickael Scofild dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 12/08/2007, 12h05
  5. [Oracle / Sql] clause where avec resultat d'une requete
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 2
    Dernier message: 31/01/2006, 09h37

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