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 :

[JDBC]Blob à partir d'un String pour insertion dans Oracle


Sujet :

JDBC Java

  1. #1
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut [JDBC]Blob à 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. Je pense utiliser JDBC.

    Toutefois, je ne sais pas comment transformer ma String en type java.sql.Blob, je ne trouve pas de constructeur qui va bien... Des pistes ?

    Autre point, j'ai pas mal lu, en faisant mes recherches, qu'il était plus conseillé d'utiliser oracle.sql.blob, à priori pour des raisons de taille supérieure à 4Ko. Est ce une "simple" restriction de JDBC ? Est ce toujours d'actualité ?

    Merci d'avance
    ZedroS
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

  2. #2
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Voila un exemple d'ajout en blob :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //parametre : byte[] blob;
    PreparedStatement pstmt = connexion.getConnexion().prepareStatement("insert into t_table (fichier) values( ?)");
        //ajout des parametres
        pstmt.clearParameters();
        pstmt.setBinaryStream( 1, new ByteArrayInputStream(blob) ,blob.length);
        //execution de la requete
        pstmt.executeUpdate();
    Pour le reste :
    getBytes
    public byte[] getBytes()
    Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.
    The behavior of this method when this string cannot be encoded in the default charset is unspecified. The CharsetEncoder class should be used when more control over the encoding process is required.


    Returns:
    The resultant byte array
    Since:
    JDK1.1
    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java
    "La liberté de tout être s'arréte là où commence celle de l'autre... Respecter l'autre, c'est préserver sa liberté d'être, de penser et de vivre"

  3. #3
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Merci beaucoup pour cette réponse.

    Toutefois, je n'arrive pas à m'en servir correctement, Oracle me renvoit l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: ORA-01461: une valeur 'LONG' ne peut être liée que dans une colonne de type 'LONG'
    Bref, j'en déduis que setBinaryStream n'insert pas un blob comme désiré.

    Du coup je cherche, depuis quelque temps déjà, mais bon, j'suis lent, c'est ainsi

    Toute aide est appréciée

    ++
    ZedroS
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

  4. #4
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    A propos, pour plus de clarté sur mes possibles erreurs, mon code concerné est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    byte[] blob = xmlString.getBytes();
    pstmt.setBinaryStream(i++, new ByteArrayInputStream(blob),blob.length);
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

  5. #5
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    bonjour,

    Vérifiez que çàa ne vient pas de là :

    (le numéro du premier index des ? est 1).


    bon courage.

  6. #6
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Bon, j'ai fait 'achement de progrès !

    En fait, faut faire un truc du genre :
    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
     
    // INSERTION :
    st.executeUpdate("INSERT INTO MY_TABLE VALUES(" + id+ "',EMPTY_CLOB())");
    // On retourne chercher la ligne ...
    ResultSet rs = st.executeQuery("SELECT MY_CLOB FROM ENTITYJOBOBJECT WHERE ID=" + id + " FOR UPDATE OF MY_CLOB");
     while (rs.next())
    {
         CLOB c = ((OracleResultSet) rs).getCLOB(1);
        // renvoi le text
         String text = myobject.getVeryLongText() 
         Writer out = c.getCharacterOutputStream();
         out.write(text);
         out.close();
    }
    rs.close();
    st.close();
    Attention toutefois : il ne faut PAS être en autocommit.

    J'ai encore un chtit souci pour l'insertion de mon clob, je reviens clore le sujet dès que tout est réglé
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

  7. #7
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Bon, ben en fait j'ai une erreur java.lang.ClassCastException désormais, sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myClob = ((OracleResultSet) rs).getCLOB(1);
    Pourtant c'est ce que je vois de fait un peu partout sur internet, notamment là : http://www.sogid.com/javalist/fils2001/jdbc_clob.html .

    Vous avez des pistes ?
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

  8. #8
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Bon, je commence à désespérer...

    J'ai pris une portion de code qui marche ailleurs dans l'application, dans un autre workspace certes mais tout de même... Voici ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    pstmt = conn.prepareStatement("select F_TEST from FRM_LECTORA_RESULT where R_ID = ? FOR UPDATE");
    pstmt.setString(1, id);
    ResultSet rs = pstmt.executeQuery();
    rs.next();
    CLOB dbClob = (CLOB)rs.getClob(1);
    Writer os=dbClob.getCharacterOutputStream();
    os.write(xmlString);
    os.close();
    Mes imports sont (je ne sors que ceux à priori notables) :
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import oracle.sql.CLOB;
    import javax.sql.DataSource;

    L'erreur est sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CLOB dbClob = (CLOB)rs.getClob(1);
    Le message est :java.lang.ClassCastException

    Sachant que je viens de me battre pour avoir les mêmes imports que l'endroit où se code marche, je commence grave à ne plus savoir vers quel saint me tourner... Vous avez des pistes ?
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

  9. #9
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    En fait, après moultes recherches, je commence désormais à me demander si l'erreur ne vient pas de ma configuration.

    Pour info, donc, j'utilise un tomcat4.1.30 sur du Oracle 9i. J'ai configuré ma connexion au niveau de mon contexte tomcat et j'y accède en JNDI depuis mon code (via le web.xml).

    J'ai lu quelque part que l'on pouvait configurer les drivers JDBC pour qu'ils fassent du "Native results", cad qu'ils renvoient les résultats au format du driver implémentant JDBC. En fait, je ne sais pas trop comment Tomcat4.1 fonctionne de ce côté là, j'ai pas mal cherché et essayé des choses mais ça n'a pas fait marcher pour autant mon appli... Est ce une piste valable ? Auriez vous plus d'infos ?

    ZedroS, quasi désespéré !
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

  10. #10
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    En fait, le problème venait de mon tomcat qui ne renvoyait pas des résultats selon le driver Oracle, juste selon l'interface JDBC. Ca marche bien pour les données "simples" (date, varchar...) mais pour les types complexes de type CLOB, il FAUT impérativement des renvois natifs.

    Ceci dit, je me connecte désormais directement et ça tourne bien
    Merci d'utiliser le bouton [Résolu] pour les sujets qui le sont.
    [pub]mon blog franco anglais, article du moment: Wicket: fournir des données JSON via Ajax[/pub]

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

Discussions similaires

  1. Clob à partir d'un String pour insertion dans Oracle
    Par Incinerator dans le forum Langage
    Réponses: 9
    Dernier message: 20/11/2009, 19h50
  2. Réponses: 6
    Dernier message: 09/06/2006, 13h17
  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, 18h13
  4. Réponses: 9
    Dernier message: 13/10/2005, 19h24
  5. Réponses: 6
    Dernier message: 06/10/2005, 12h30

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