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

JDBC Java Discussion :

Requête paramétrée avec une clause where IN(?)


Sujet :

JDBC Java

  1. #1
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 370
    Points : 40 164
    Points
    40 164
    Par défaut Requête paramétrée avec une clause where IN(?)
    Bonjour,

    Je cherche à exécuter une requête du type "select ... from ... where champ in (1,2,3,4)". J'en suis pour l'instant réduit à construire ma clause in() par concaténation. Est-il possible de la définir via un paramètre pour avoir quelque chose comme "where champ in (?)" ?

    J'ai bien essayé de le faire, puis de passer mon paramètre sous la forme
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    s.setString(1, StringUtils.join(maListe, ","));
    mais j'obtiens alors une erreur "ORA-01722: Nombre non valide" lors de l'exécution du PreparedStatement.

    Quelle est la bonne marche à suivre pour passer une liste en paramètre dans une clause IN ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Le problème c'est qu'en faisant

    where champ in (?)
    et
    s.setString(1, StringUtils.join(maListe, ","));

    Tu vas avoir une requête du style where champ in ('1, 2, 3, 4').


    Essaye de construire ta requête de la façon suivante :

    where champ in (?, ? , ? .... ?)

    et

    for(String value : liste) {
    s.setString(index++, value);
    }



    http://www.javaranch.com/journal/200...l200510.jsp#a2

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 370
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par Mathieu.J Voir le message
    Essaye de construire ta requête de la façon suivante :where champ in (?, ? , ? .... ?)
    Le problème en procédant comme ça, c'est que la requête dépend du nombre d'éléments à déclarer dans la clause IN, et il n'est donc plus possible de préparer le statement à l'avance. Chaque exécution demandera une repréparation du statement.

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Je n'ai pas la solution mais seulement une piste. En fait ça marche avec une procédure stockée mais avec un prepared statement j'y crois pas trop ...

    je te l'indique même si je pense que tu va garder ta concaténation ...

    Utilise un paramètre de type tableau que tu passes en argument à ta procédure PL/SQL

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE TYPE TABLEOFINT is TABLE OF NUMBER;
    Dans cette procédure, pour le IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IN (SELECT * FROM TABLE(CAST (:MON_PARAM AS TABLEOFINT)))

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par khayyam90 Voir le message
    Le problème en procédant comme ça, c'est que la requête dépend du nombre d'éléments à déclarer dans la clause IN, et il n'est donc plus possible de préparer le statement à l'avance. Chaque exécution demandera une repréparation du statement.
    Tu peux le construire dynamiquement en fonction du nombre d'entrée dans ta liste.
    Edit : oui ça demande de reconstruire le statement à chaque fois...

Discussions similaires

  1. DELETE avec une clause where
    Par liberty74 dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/08/2007, 11h56
  2. Jointure avec une clause where
    Par pepi22 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 19/08/2007, 10h24
  3. Insert avec une clause where !?
    Par Thomad dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/08/2006, 09h55
  4. Requête sql dans une clause Where
    Par PrinceMaster77 dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/07/2006, 11h30
  5. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 17h05

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