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 :

Problème INSERT via JDBC


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Par défaut Problème INSERT via JDBC
    Bonjour,

    j'effectue plusieurs INSERT et je rencontre un problème de type : java.sql.SQLException: ORA-01722: Nombre non valide

    Voici une ligne qui s'insère correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    72,'','','','ID1','-1','750010002','CP','1','-1','','','','','','ID2','','','Agence2','','','0','Reprise','Inactif','0','Nom','Admin Dynamics','','','','','','','','','','','','') SELECT 1 FROM DUAL
    et une autre qui lève une exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    73,'37, rue Test,'','','ID1','-1','1','CP','0','-1','','','','','','ID2','','','Agence1','','','8.75','En cours','Actif','1','Nom','Admin Dynamics','','',TO_DATE(SUBSTR('2018-02-20 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),TO_DATE(SUBSTR('2018-02-20 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),TO_DATE(SUBSTR('2006-12-27 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),TO_DATE(SUBSTR('2018-02-19 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),TO_DATE(SUBSTR('2018-02-20 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),TO_DATE(SUBSTR('2009-09-30 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),TO_DATE(SUBSTR('2018-02-20 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),TO_DATE(SUBSTR('2018-02-20 02:00:00.0' ,1,19), 'YYYY-MM-DD HH:MI:SS'),'',''
    Je fais une requête contenue dans une boucle qui permet de récupérer les données et de les insérer ligne par ligne.
    Requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String insertQuery = "INSERT INTO "+maTable+" ( "+colonneTable+" ) VALUES "+InsertValue+"";
    InsertValue correspond par exemple au ligne cité ci dessus.

    L'erreur obtenue fait référence à un Nombre invalide, '8.75'. Lorsque je remplace le point par une virgule l'erreur n'apparait plus.

    J'ai essayé de changer le "NLS_LANG" du JDBC sous la forme ,. mais l'erreur persiste.

    Y a-t-il une autre soluion que de changer le point par une virgule sinon il faudrait faire après l'INSERT une modification sur la base?

    Merci de votre aide !

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Deux choses :
    1- Il ne faut pas utiliser de Statement pour faire ça mais un PreparedStatement
    Avec un Statement :
    Si tu as des apostrophes dans une chaine, il faut les doubler
    Tu risques des attaques par injection
    etc...

    2- Un nombre n'est pas mis entre apostrophes mais directement
    Dans ton cas, si tu mettais 8.75 plutôt que '8.75', ça fonctionnerait

    Bref, je te suggère de faire quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    (En supposant que col1 soit une chaîne de caractère, col2 une Date, col3 un Double)
     
    PreparedStatement pstmtInsert = connection.prepareStatement("insert into MaTable(col1, col2, col3) values(?, ?, ?);
    for (....)
    {
        pstmtInsert.setString(1, maValeurString);
        pstmtInsert.setDate(2, maValeurDate);
        pstmtInsert.setDouble(3, maValeurDouble);
        pstmtInsert.executeUpdate();
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre très actif
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Par défaut
    Concernant ta réponse :
    Citation Envoyé par OButterlin Voir le message
    Deux choses :
    Bref, je te suggère de faire quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    (En supposant que col1 soit une chaîne de caractère, col2 une Date, col3 un Double)
    PreparedStatement pstmtInsert = connection.prepareStatement("insert into MaTable(col1, col2, col3) values(?, ?, ?);
    for (....)
    {
        pstmtInsert.setString(1, maValeurString);
        pstmtInsert.setDate(2, maValeurDate);
        pstmtInsert.setDouble(3, maValeurDouble);
        pstmtInsert.executeUpdate();
    }
    La colonne 2 d'une table peut très bien être un String alors que sur une autre table ce sera un Double, ça serait compliqué (pour moi ) de mettre en place ce systeme.

    J'ai bien pris note pour le PreparedStatement et le Statement.

    Pour situer un peu le contexte, je créé un flux sur Talend Open Studio. Ce flux doit insérer les données présentent dans des vues dans les tables correspondantes. Actuellement nous avons un flux par table et vue correspondante. J'ai donc créé un flux talend "générique" qui permet de renseigner les différentes variables (Base de données, serveur, user, etc) dans un fichier de context en .CSV. Cependant les tables et les vues correspondantes ne sont pas forcément au même format (ID en plus, colonne non présente sur la vue ou sur la table, etc). Par exemple le format des DATE n'est pas le même, j'ai donc du récupérer toutes les colonnes au format date pour le mettre au même standard. Tu me conseilles donc de faire la même chose que ça mais pour les valeurs numériques ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je n'ai pas tout compris...

    Quelle est la source des données que tu veux insérer dans tes tables ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre très actif
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Je n'ai pas tout compris...

    Quelle est la source des données que tu veux insérer dans tes tables ?
    La source est une vue la cible une table, cependant je dois faire faire en sorte que ça fonctionne quelques soientt la vue, la table et leurs structures.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Est-ce que c'est la structure de ta vue qui détermine la structure de ta table ?
    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. Problème insertion données JDBC
    Par kenda10 dans le forum JDBC
    Réponses: 4
    Dernier message: 18/09/2012, 20h31
  2. [Oracle] Problème d'insertion de ligne via JDBC
    Par Invité dans le forum JDBC
    Réponses: 3
    Dernier message: 17/07/2007, 12h21
  3. Réponses: 9
    Dernier message: 11/06/2007, 16h58
  4. Problème insertion dans bdd access. Via VB express 2005
    Par Frosaf dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/06/2007, 18h19
  5. Problème de récupération de blob via JDBC
    Par realworld dans le forum Oracle
    Réponses: 2
    Dernier message: 24/01/2007, 10h27

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