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 :

[Oracle]Problème avec PreparedStatement


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 37
    Points
    37
    Par défaut [Oracle]Problème avec PreparedStatement
    Bonjour à tous!

    Dans une servlet, je me connecte à une base de données Oracle pour récupérer des données et générer de l'XML.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    conn = DriverManager.getConnection(connStr);
    PreparedStatement stmt = conn.prepareStatement(query);
    stmt.setString(1, "test");
    ResultSet rset = stmt.executeQuery();
    Ma requête (partie la plus "intéressante"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...as result from project_view where collaboratorl like ('%?%')...
    Le problème est que le stmt.setString n'a aucun effet. Lorsqu'en debug, j'analyse la variable sql_query de l'objet stmt, on peut voir que celle-ci n'est pas modifiée par le "setString" et que le "?" est toujours présent au moment de l'exécution du stmt.

    Pourtant, tout le reste est ok, si je met les données en dur dans ma requête...

    Quelqu'un sait d'où vient le problème?

    Merci!

    Adrien

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est normal car à l'intérieur d'une chaine le ? est considéré comme un simple caractère et pas comme un paramètre...

    Il faut effectuer une concaténation...

    Le problème c'est que cela peut varier d'un SGBD à l'autre...

    La norme voudrait qu'on utilise l'opérateur || :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where collaboratorl like '%' || ? || '%'
    Mais ce n'est pas reconnu par tous les SGBD...

    Certain (comme MySQL) utilise la fonction CONCAT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where collaboratorl like CONCAT('%', ?, '%')
    Ou concatène automatiquement les chaines séparé par un simple espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where collaboratorl like '%' ? '%'
    D'autre utilise l'opérateur + (SQL Server il me semble) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where collaboratorl like '%' + ? + '%'

    Bref : difficile de faire "portable", il faudra adapter selon le SGBD...

    a++

  3. #3
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Merci beaucoup pour cette réponse!

    Après plusieurs essais il s'est avéré que c'est la solution suivante qui fonctionne avec Oracle:

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 525
    Points
    9 525
    Billets dans le blog
    1
    Par défaut
    Tu aurais pu faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PreparedStatement stmt = conn.prepareStatement(query);
    stmt.setString(1, "%test%");
    
    Ou si c'est une variable (vraissemblablement)
    
    String param = "Test";
    
    stmt.setString(1, "%"+param+"%");
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/05/2011, 11h07
  2. [ORACLE]Problème avec NUMBER
    Par HexChit dans le forum Oracle
    Réponses: 2
    Dernier message: 17/10/2006, 10h56
  3. [Oracle] problème avec INNER JOIN
    Par Philofish dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/09/2005, 10h20
  4. [JDBC]Problème avec PreparedStatement
    Par tomca dans le forum JDBC
    Réponses: 15
    Dernier message: 08/07/2005, 13h59
  5. [tomcat] [jsp] Problème avec driver OCI pour oracle
    Par nanardcompanie dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 01/07/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