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 :

Requête à paramètres multiples


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Requête à paramètres multiples
    Bonjour à tous,

    Je suis en face du problème suivant. J'aimerai créer une requête en oracle avec un paramètre qui peut prendre plusieurs valeurs. Mais seulement ma syntaxe est incorrecte.

    Il s'agit de rentrer plusieurs customer_group (par exemple : AUCHAN, BOULANGER) et de ressortir des informations liées aux quantity invoiced pour ces deux customers.

    La requête fonctionne bien sous SQL Server mais pas sous Oracle. Est-ce que quelqu'un pourrait m'aider ?!

    Ci-dessous, vous trouverez la requête sous SQL Server qui fonctionne suivie de la requête sous Oracle qui elle ne fonctionne pas avec plus de détails.

    -----------------------------------------------------------------------
    Voici ma requête sous SQL Server :
    SELECT
    F_INVOICE_VW_COHERENT.QUANTITY_INVOICED AS [Quantity Invoiced],
    D_TIME_VW.FULL_DATE AS Date,
    D_CUSTOMER_VW.CUSTOMER_GROUP AS Customer

    FROM
    F_INVOICE_VW_COHERENT INNER JOIN D_TIME_VW ON F_INVOICE_VW_COHERENT.DATE_KEY = D_TIME_VW.DATE_KEY INNER JOIN D_CUSTOMER_VW ON F_INVOICE_VW_COHERENT.CUSTOMER_KEY = D_CUSTOMER_VW.CUSTOMER_KEY

    WHERE
    (D_CUSTOMER_VW.CUSTOMER_GROUP IN (@Customer))
    AND
    (D_TIME_VW.FULL_DATE >= @StartDate)
    AND
    (D_TIME_VW.FULL_DATE < @EndDate + 1)

    Le @ signifie que c'est un paramètre entré ou selectionné par l'utilisateur. Pour la ligne rouge, l'utilisateur peut sélectionner dans une liste déroulante à check box, plusieurs Customers. Cette liste déroulante se base sur une requête écrite (select distinct CUSTOMER_GROUP from dbo.D_CUSTOMER_VW order by CUSTOMER_GROUP asc) mais elle se forme au niveau applicatif sous visual studio 2005.

    ------------------------------------------------------------

    Voici maintenant ma requête sous ORACLE :
    La deuxième requête est un test effectué en se concentrant sur la partie customer seulement (deux customers group sont par exemple AUCHAN, BOULANGER).
    Un choix multiple est également donné aux utilsateurs par le biais d'une liste déroulante à CheckBox (applicatif) basée sur une requête :

    -- REQUETE COMPLETE // BUG SUR LA CLAUSE WHERE LIEE AUX CUSTOMERS
    SELECT
    D_TIME_VWO.FULL_DATE,
    D_CUSTOMER_VWO.CUSTOMER_GROUP,
    F_INVOICE_VWO.QUANTITY_INVOICED

    FROM
    F_INVOICE_VWO,
    D_CUSTOMER_VWO,
    D_TIME_VWO

    WHERE
    F_INVOICE_VWO.CUSTOMER_KEY = D_CUSTOMER_VWO.CUSTOMER_KEY
    AND
    F_INVOICE_VWO.DATE_KEY = D_TIME_VWO.DATE_KEY
    AND
    (D_TIME_VWO.FULL_DATE >= TO_DATE(TO_CHAR(:startdate, 'YYYY-DD-MM'), 'YYYY-DD-MM'))
    AND
    (D_TIME_VWO.FULL_DATE < TO_DATE(TO_CHAR(:enddate, 'YYYY-DD-MM'), 'YYYY-DD-MM') + 1)
    AND
    D_CUSTOMER_VWO.CUSTOMER_GROUP IN
    (
    SELECT DISTINCT CUSTOMER_GROUP
    FROM D_CUSTOMER_VWO
    WHERE (CUSTOMER_GROUP = :Customers)
    )

    ORDER BY
    D_TIME_VWO.FULL_DATE,
    D_CUSTOMER_VWO.CUSTOMER_GROUP

    -- REQUETE TEST AVEC SEULEMENT LES CUSTOMERS

    SELECT
    DISTINCT CUSTOMER_GROUP
    FROM
    D_CUSTOMER_VWO
    WHERE
    CUSTOMER_GROUP IN (
    SELECT DISTINCT CUSTOMER_GROUP
    FROM D_CUSTOMER_VWO
    WHERE CUSTOMER_GROUP = (:Customers))


  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    qu'est ce qui ne va pas avec cette requête ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    je n'obtiens aucun résultat et aucun message d'erreur.

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Avec quel outil l'exécutes-tu ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    D_CUSTOMER_VWO est dans le FROM et dans la sous-requêtes... un des deux est probablement en trop

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Je l'exécute avec TOAD

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    si je fais par exemple une requête largement simplifiée pour essayer de mettre mes deux customers, je n'obtiens rien.
    par contre, si je mets uniquement un customer, j'obtiens le nom de ce customer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    CUSTOMER_GROUP 
    FROM
    D_CUSTOMER_VWO
    WHERE
    CUSTOMER_GROUP IN(:Customers)
    
    J'ai une fenêtre avec les paramètres qui apparait et je note la chaine suivante : AUCHAN, BOULANGER. Le type est bien STRING.

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Si je comprends ce que tu vais dans ta variable customers, tu indiques les AUCHAN et BOULANGER, c'est ça ? Qu'est-ce qui sépare les 2 valeurs ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Chez moi c'est pareil mais je trouve ça normal.

    Si tu exécutes ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    CUSTOMER_GROUP 
    FROM
    D_CUSTOMER_VWO
    WHERE
    CUSTOMER_GROUP IN (:Customers)
    Et que tu donnes à TOAD comme valeur pour :Customers Tu obtiendras ça en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
     CUSTOMER_GROUP 
     FROM
     D_CUSTOMER_VWO
     WHERE
     CUSTOMER_GROUP IN ('AUCHAN')
    Par contre si tu donnes à TOAD comme valeurs pour :Customers Tu obtiendras ça en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
      CUSTOMER_GROUP 
      FROM
      D_CUSTOMER_VWO
      WHERE
      CUSTOMER_GROUP IN ('AUCHAN, CASINO')
    et pas ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
       CUSTOMER_GROUP 
       FROM
       D_CUSTOMER_VWO
       WHERE
       CUSTOMER_GROUP IN ('AUCHAN', 'CASINO')
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  10. #10
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Ok, je comprends bien.
    En effet, je sépare bien mes deux customers par une virgule.

    Comment puis-je m'en sortir ?
    Je pensais à un SUBSTRING et/ou INSTRING ou quelquechose de ce genre mais le problème c'est que je ne sais pas combien d'occurence de customers je rencontrerai dans ma chaine.

    Merci beaucoup pour ces explications.

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    En faisant par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT
    CUSTOMER_GROUP 
    FROM
    D_CUSTOMER_VWO
    WHERE instr (:customers, CUSTOMER_GROUP) != 0
    Attention néanmoins aux perf, l'index sur cutomer_group (s'il existe) ne sera pas pris...

    Sinon, il te reste le SQL dynamique...
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  12. #12
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Super...
    la requête fonctionne isolément. c'est un premier point d'avancée... merci beaucoup !!
    Maintenant, si j'intègre cette query dans la requête suvante,

    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
     
    SELECT    
         D_TIME_VWO.FULL_DATE, 
         D_CUSTOMER_VWO.CUSTOMER_GROUP,
         F_INVOICE_VWO.QUANTITY_INVOICED
     
    FROM         
         F_INVOICE_VWO,
         D_CUSTOMER_VWO, 
         D_TIME_VWO
     
    WHERE  
          F_INVOICE_VWO.CUSTOMER_KEY =   
          D_CUSTOMER_VWO.CUSTOMER_KEY 
    AND F_INVOICE_VWO.DATE_KEY = 
          D_TIME_VWO.DATE_KEY 
    AND 
          (D_TIME_VWO.FULL_DATE >= TO_DATE(:startdate, 'YYYY-DD-MM')) AND 
          (D_TIME_VWO.FULL_DATE < TO_DATE(:enddate, 'YYYY-DD-MM') + 1) AND 
          (D_CUSTOMER_VWO.CUSTOMER_GROUP IN
                   (SELECT 
                         DISTINCT CUSTOMER_GROUP
                    FROM   
                         D_CUSTOMER_VWO D_CUSTOMER_VWO_1
                    WHERE 
                        (INSTR(:Customers, CUSTOMER_GROUP) <> 0)))
     
    ORDER BY 
           D_TIME_VWO.FULL_DATE, 
           D_CUSTOMER_VWO.CUSTOMER_GROUP
    Quand j'exécute la requête avec TOAD cela fonctionne parfaitement.
    Maintenant, mon but est de passer cela sous SQL Server 2005 (Reporting Services) qui va tapper sur ma base Oracle, la syntaxe doit donc être en Oracle.
    Et là, évidemment BUG : erreur ORA 12704. character set mismatch
    Je continue de chercher.

    En tout cas merci beaucoup pour votre aide...

    complément : j'ai testé en mettant des TO_CHAR et là, je n'ai plus l'erreur 12704 mais la ora 01722 avec un invalid number.

    Ce qui se passe à ce niveau : quand j'entre les customer group à la main dans ma case paramètres, la requête fonctionne. Par contre, quand je les coche via une liste déroulante définie dans les paramètres comme pouvant recevoir une multi values, ça ne fontionne plus... il y a un invald number.
    Une incompatibilté à ce niveau ?

  13. #13
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Je pense avoir trouvé d'où vient mon problème... un bug entre ma version d'oracle et les multi value parameters de Reporting Services.

    http://lab.msdn.microsoft.com/produc...a-54df86561a78

    J'ai tenté une connection sur une base de prod 10g ce matin avec la requête donnée et les perf sont catastrophiques...

    Vous m'aviez parlé de SQL dynamique ?
    Je vais peut-être me pencher sur cette solution alors...

    Merci beaucoup en tout cas à tous ceux qui ont passé du temps pour m'aider.

    Bonne journée à tous.

Discussions similaires

  1. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  2. Requête paramétrée
    Par lou.souleu dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2005, 05h36
  3. [VB.NET] [ADO.NET] Requête paramétrée
    Par DotNET74 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/03/2005, 08h39
  4. Requête paramétrée qui remplit une DBLookUpComboBox
    Par navis84 dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/12/2004, 21h23
  5. VBA & Requête paramétrée
    Par gripoil dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2004, 09h54

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