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

Langage Java Discussion :

Clob à partir d'un String pour insertion dans Oracle


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 32
    Points : 22
    Points
    22
    Par défaut Clob à partir d'un String pour insertion dans Oracle
    Bonjour,

    J'ai une String, contenant en fait du texte au format XML, que je dois insérer dans une base de données Oracle.

    Toutefois, je ne sais pas comment transformer mes deux champs String en type java.sql.Clob.

    Ci-dessous le contenu de ma classe :


    public class DAO extends DAOStub
    {
    public void readFrom(DAO bo, boolean pk)
    {
    xmlBO object = (xmlBO) bo;
    this.setREXML(object.getReXML());
    this.setREPXML(object.getRepXML());

    }



    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Merci pour le lien.
    Toute fois j'ai réussis à insérer dans la base, mais mon problème actuel c'est que lorsque j'essaie de récupérer le contenu du champ blob qui est binaire.
    N'existe t'il pas un moyen de convertir le champ binaire vers une chaine de caractère.


    Class Insertion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PreparedStatement sta = connection
    				.prepareStatement("INSERT INTO XML VALUES (?, ?, ?)");
     
    sta.setBinaryStream(2, DAO.getBytesFromObject(xml), xml
    				.length());
    sta.setBinaryStream(3, DAO.getBytesFromObject(xml), xml
    				.length());
    sta.executeUpdate();
    Class Récuperation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PreparedStatement sta = connection.prepareStatement("SELECT * FROM XML WHERE NUMERO = ?");
     
    sta.setString(1, "123456");
    ResultSet result = sta.executeQuery();
    result.next();
    System.out.println(result.getBinaryStream(2));
    System.out.println("\n\n\n");
    System.out.println(result.getBinaryStream(3));
    Résultat de la recupération :

    oracle.jdbc.driver.OracleConversionReader@633f3e4
    oracle.jdbc.driver.OracleBlobInputStream@69bb3e4


    Merci de votre réponse

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 25
    Points
    25
    Par défaut
    Pourquoi sauvegarder sous forme binaire ?

    J'utilise la méthode suivante :

    StringReader reader = new StringReader(monStringClobXML);
    preparedStatement.setCharacterStream(index, reader, monStringClobXML.length());


    ensuite getClob d'après mes souvenirs.

  5. #5
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Bonjour,
    j'ai une application qui fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Clob clob = rs.getClob(2);
    		BufferedReader clobReader = new BufferedReader(clob.getCharacterStream());
            String ligne = "";
            String buf=null;
            while((buf = clobReader.readLine()) != null){
               ligne+=buf+"\n";
            }
    Hormis le fait que la magouille sur le readLine n'est pas nécessaire et qu'on devrait passer par un StringBuilder plutôt que par une concaténation de String, ça marche.
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Merci pour ta réponse.

    J'ai ajouté le code comme suit :

    PreparedStatement sta = connection
    .prepareStatement("INSERT INTO XML VALUES (?, ?, ?)");
    sta.setString(1, "18745698964");

    StringReader reader = new StringReader("ffffffffff");
    sta.setCharacterStream(2, reader, 10);
    sta.setCharacterStream(3, reader, 10);
    sta.executeUpdate();

    sauf que je rencontre l'erreur ci-dessous:
    Exception in thread "main" java.sql.SQLException: Exception d'E/S: Stream closed
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
    at oracle.jdbc.driver.OraclePreparedStatement.setCharacterStream(OraclePreparedStatement.java:3533)
    at monPackage.dao.TestBlobWrite.main(TestBlobWrite.java:49)

  7. #7
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Bonjour,
    un objet Reader (ainsi que tous les dérivés, dont StringReader), ne peut se lire deux fois de suite.
    Il faut recréer un deuxième Reader.
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Merci pour tout vos réponse.

    J'ai une autre question commment je peux lire le contenu d'un blob qui contient du text sachant qu'il est enregistrer dans la table en binaire.

    Merci de votre réponse

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    J'ai pu enfin résoudre mon problème comme suit :


    PreparedStatement sta = connection
    .prepareStatement("SELECT * FROM XML WHERE NUMERO = ?");

    sta.setString(1, "1");
    ResultSet result = sta.executeQuery();
    result.next();
    Blob ch1 = result.getBlob(2);
    String a = new String(ch1.getBytes(2, (int) ch1.length()));

    Merci pour tout le monde

  10. #10
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    attention à l'encoding!!

    cette méthode va utiliser l'encoding par défaut de la plateforme pour faire la conversion byte->char. Selon le poste de travail qui exécute ce code, les résultats pourront être différents!

    il faut passer par un CharsetDecoder pour pouvoir spécifier un charset à utiliser pour le décodage. mais il faut aussi connaitre le charset utilisé lors de la conversion char->byte.....

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/06/2006, 12h17
  2. Réponses: 9
    Dernier message: 20/04/2006, 11h07
  3. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13
  4. Réponses: 9
    Dernier message: 13/10/2005, 18h24
  5. Réponses: 6
    Dernier message: 06/10/2005, 11h30

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