Pseudo-Archive Java :
Accueil -|- Visuel -|- Logistique -|- Applications réparties
La pseudo-archive Java est un service proposé par la SARL diaam informatique, et il est hébergé par la Sogid.
diaam informatique
From:           	Laurent Forêt <l.foret@korom.net>
To:             	"Java Strasbourg" <java@u-strasbg.fr>
Subject:        	CLOB et JDBC.
Date sent:      	Tue, 14 Aug 2001 10:08:49 +0200
Send reply to:  	java@u-strasbg.fr

Bonjour,

 j'aimerai insérer une String dans un CLOB d'une base Oracle.

  PreparedStatement ps = dbCon.prepareStatement("INSERT INTO TABLE (DATA)
VALUES (?)");
  ps.setString(1,maString);
  ps.execute();

La column DATA de ma table TABLE est un CLOB,

ne marche pas évidemment . il faudrait :
ps.setClob(monClob);

Comment transformer maString en monClob ?

Pour info j'utilise le driver d'Oracle (classes111.zip de l'archive
jdbc80520-nt.zip).

Par avance merci.
-------------------------------------
Laurent Forêt
Service développement
l.foret@korom.net
www.korom.net

     

From:           	Speh Sylvain <sylvain.speh@CLERMONT.cemagref.fr>
To:             	java@u-strasbg.fr
Subject:        	RE: CLOB et JDBC.
Date sent:      	Tue, 14 Aug 2001 10:28:16 +0200
Send reply to:  	java@u-strasbg.fr

Bonjour,

je vais te répondre pour les BLOB, ça devrait être pareil pour les CLOB :
a priori, avec les LOB, il faut streamer les données après avoir fait une
requête SQL. De plus, il ne faudrait pas utiliser les types
java.sql.types, mais leurs équivalents Oracle, plus complets et coder, en
supposant que le CLOB soit la nième colonne, ça donne quelque chose comme
:

CLOB clob = null ;
File binaryFile = null ;
clob = ((OracleResultSet) SA.results).getCLOB(n);
binaryFile = new File("mon-fichier");
instream = new FileInputStream(binaryFile);

et ... tu streame ton fichier
et ... pense à bien closer tes buffers, ça fait perdre des données sinon

Y'a peut-être plus simple, ça m'étonnerait que les gens d'Oracle n'aient
pas pensé à inclure les streams dans leurs propres packages, mais je ne
suis pas au courant.


Il doit y avoir des exemples sur le site d'Oracle. A défaut, je peux te
fournir le code avec des BLOB.

Voilà,


Sylvain SPEH
Spécialiste MVS/CICS/COBOL/DB2
Junior en Java/Oracle
Actuellement en recherche d'emploi
Stagiaire CNAM au Cemagref - LISC de Clermont-Ferrand
Tél. prof : 04.73.44.06.17 - Sylvain.speh@wanadoo.fr



-----Message d'origine-----
De : Laurent Forêt [mailto:l.foret@korom.net]
Envoyé : mardi 14 août 2001 10:09
À : Java Strasbourg
Objet : CLOB et JDBC.


Bonjour,

 j'aimerai insérer une String dans un CLOB d'une base Oracle.

  PreparedStatement ps = dbCon.prepareStatement("INSERT INTO TABLE (DATA)
VALUES (?)");
  ps.setString(1,maString);
  ps.execute();

La column DATA de ma table TABLE est un CLOB,

ne marche pas évidemment . il faudrait :
ps.setClob(monClob);

Comment transformer maString en monClob ?

Pour info j'utilise le driver d'Oracle (classes111.zip de l'archive
jdbc80520-nt.zip).

Par avance merci.
-------------------------------------
Laurent Forêt
Service développement
l.foret@korom.net
www.korom.net

     

From:           	Laurent Forêt <l.foret@korom.net>
To:             	"Java Strasbourg" <java@u-strasbg.fr>
Subject:        	RE: CLOB et JDBC.
Date sent:      	Tue, 14 Aug 2001 10:57:20 +0200
Send reply to:  	java@u-strasbg.fr



> -----Message d'origine-----
> De : Speh Sylvain [mailto:sylvain.speh@CLERMONT.cemagref.fr]
> Envoyé : mardi 14 août 2001 10:28
> À : java@u-strasbg.fr
> Objet : RE: CLOB et JDBC.
>
>
> Bonjour,
>
> je vais te répondre pour les BLOB, ça devrait être pareil pour les CLOB
> : a priori, avec les LOB, il faut streamer les données après avoir fait
> une requête SQL. De plus, il ne faudrait pas utiliser les types
> java.sql.types, mais leurs équivalents Oracle, plus complets et coder,
> en supposant que le CLOB soit la nième colonne, ça donne quelque chose
> comme :
>
Ils sont dans quels packages. Y a t'il une javadoc dispo.


> CLOB clob = null ;
> File binaryFile = null ;
> clob = ((OracleResultSet) SA.results).getCLOB(n);

C'est quoi SA.
Attention je veux insérer un CLOB pas récupérer

> binaryFile = new File("mon-fichier");
> instream = new FileInputStream(binaryFile);
>
> et ... tu streame ton fichier
> et ... pense à bien closer tes buffers, ça fait perdre des données sinon
>
> Y'a peut-être plus simple, ça m'étonnerait que les gens d'Oracle
> n'aient pas
> pensé à inclure les streams dans leurs propres packages, mais je
> ne suis pas
> au courant.

dans l'interface java.sql.Clob tu as une méthode getAsciiStream().

Moi j'aimerais un truc tout simple du genre
Clob monClob = new Clob(maStringdansuneInputStream);
ps.setClob(monClob);
ps.execute();

>
>
> Il doit y avoir des exemples sur le site d'Oracle. A défaut, je peux te
> fournir le code avec des BLOB.

Je veux bien. Ca me donnera une idée.

Merci.
>
> Voilà,
>
>
> Sylvain SPEH
> Spécialiste MVS/CICS/COBOL/DB2
> Junior en Java/Oracle
> Actuellement en recherche d'emploi
> Stagiaire CNAM au Cemagref - LISC de Clermont-Ferrand
> Tél. prof : 04.73.44.06.17 - Sylvain.speh@wanadoo.fr
>
>
>
> -----Message d'origine-----
> De : Laurent Forêt [mailto:l.foret@korom.net]
> Envoyé : mardi 14 août 2001 10:09
> À : Java Strasbourg
> Objet : CLOB et JDBC.
>
>
> Bonjour,
>
> 	j'aimerai insérer une String dans un CLOB d'une base Oracle.
>
>   PreparedStatement ps = dbCon.prepareStatement("INSERT INTO TABLE
>   (DATA)
> VALUES (?)");
>   ps.setString(1,maString);
>   ps.execute();
>
> La column DATA de ma table TABLE est un CLOB,
>
> ne marche pas évidemment . il faudrait :
> ps.setClob(monClob);
>
> Comment transformer maString en monClob ?
>
> Pour info j'utilise le driver d'Oracle (classes111.zip de l'archive
> jdbc80520-nt.zip).
>
> Par avance merci.
> -------------------------------------
> Laurent Forêt
> Service développement
> l.foret@korom.net
> www.korom.net
>
>

     

Date sent:      	Tue, 14 Aug 2001 11:09:26 +0200
From:           	Jerome Moliere <moliere@viveo-montpellier.com>
To:             	java@u-strasbg.fr
Subject:        	Re: CLOB et JDBC.
Send reply to:  	java@u-strasbg.fr

je sais pas si je vais t'avancer mais dans les projets Apache il y a
Turbine, comprenant Torque: or celui-ci (mapping O/R) a de tres bons
fichiers de docs..
http://cvs.apache.org/viewcvs/jakarta-turbine-torque/src/templates/sql/base/oracle/db.props

tu trouveras les types pour oracle pour ton mapping...

si les clobs  ressemblent aux blobs (je ne sais pas) tu devrais pouvoir
faireun truc du genre:
 maString.getBytes() puisque les BLOBs sont fait pour du binaire...


Jerome
     

From:           	Laurent Forêt <l.foret@korom.net>
To:             	"Java Strasbourg" <java@u-strasbg.fr>
Subject:        	CLOB et JDBC (suite).
Date sent:      	Tue, 14 Aug 2001 13:32:32 +0200
Send reply to:  	java@u-strasbg.fr

Suite de mon problème de clob, avec 3 réalisations :

Soit le code suivant

  PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE
  (DATA)
VALUES (?)");

// Finalement, j'ai 3 bout de code possible.

// 1ére possibilité :
      ps.setString(1,longString);
//      marche si la String n'est pas trop longue

// 2ème possibilité :
      byte[] data = genereLongString(1000).getBytes();
      InputStream is = new ByteArrayInputStream(data);
      ps.setAsciiStream(1,is,data.length);
      is.close().
//      marche si la String n'est pas trop longue

// 3ème possibilité :
      oracle.sql.CLOB myClob = new
CLOB((OracleConnection)dbCon,genereLongString(10).getBytes());
      ps.setClob(1,(Clob)myClob );
      System.err.println( ps.execute());
//    ne marche jamais

Quand ca ne marche pas j'ai l'exception suivante :

java.sql.SQLException: ORA-01461: une valeur 'LONG' ne peut être liée que
dans une colonne de type 'LONG'

Je pense que le message d'erreur est un peu érroné et que c'est un
problème au niveau d'Oracle et donc bientôt off-topic. Mais j'aurais voulu
savoir si ca est dèjà arrivé à quelqu'un et si quelqu'un avait une idée
pour résoudre mon problème.


Pour info, ma table oracle est la suivante :
create table MATABLE
(
    DATA              CLOB                   null    ,
    ID            INTEGER                not null,
    constraint PK_MATABLE primary key (ID)
)


-------------------------------------
Laurent Forêt
Service développement
l.foret@korom.net
www.korom.net

     

From:           	Laurent Forêt <l.foret@korom.net>
To:             	"Java Strasbourg" <java@u-strasbg.fr>
Subject:        	TR: CLOB et JDBC (suite).
Date sent:      	Tue, 14 Aug 2001 13:56:40 +0200
Send reply to:  	java@u-strasbg.fr



-------------------------------------

Laurent Forêt

Service développement

l.foret@korom.net

www.korom.net



-----Message d'origine-----
De : Jean Fabien Renard [mailto:jean-fabien.renard@cgey.com]
Envoyé : mardi 14 août 2001 13:49
À : Laurent Forêt
Objet : Re: CLOB et JDBC (suite).


Je ne réponds qu'à toi car je ne peux plus envoyer de mail à la liste à
cause d'un changement d'adresse mail de ma boîte... enfin bref... passons
ce problème si tu veux en faire partagé la communauté...

sur mon projet sur lequel j'ai mis en place des CLOB et voici comment je
procède.

1: tu met un CLOB vide
PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE (DATA)
 VALUES (empty_clob())");

2: tu le récupère
Statement stmt = dbCon.createStatement();
  CLOB myClob = null;
  ResultSet rs = stmt.executeQuery("SELECT DATA FROM MATABLE  WHERE ID =
  ...
FOR UPDATE");

3: tu l'initialise
 if (rs.next()) {
  myClob = ((OracleResultSet)rs).getCLOB(1);
  myClob.putString(1, monText);
 }


chez nous ca marche.

en esperant que cela puisse t'aider.
tiens moi au courant.

Jean-Fabien




----- Original Message -----
From: "Laurent Forêt" <l.foret@korom.net>
To: "Java Strasbourg" <java@u-strasbg.fr>
Sent: Tuesday, August 14, 2001 1:32 PM
Subject: CLOB et JDBC (suite).


> Suite de mon problème de clob, avec 3 réalisations :
>
> Soit le code suivant
>
>   PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE
(DATA)
> VALUES (?)");
>
> // Finalement, j'ai 3 bout de code possible.
>
> // 1ére possibilité :
>       ps.setString(1,longString);
> //      marche si la String n'est pas trop longue
>
> // 2ème possibilité :
>       byte[] data = genereLongString(1000).getBytes();
>       InputStream is = new ByteArrayInputStream(data);
>       ps.setAsciiStream(1,is,data.length);
>       is.close().
> //      marche si la String n'est pas trop longue
>
> // 3ème possibilité :
>       oracle.sql.CLOB myClob = new
> CLOB((OracleConnection)dbCon,genereLongString(10).getBytes());
>       ps.setClob(1,(Clob)myClob );
>       System.err.println( ps.execute());
> //    ne marche jamais
>
> Quand ca ne marche pas j'ai l'exception suivante :
>
> java.sql.SQLException: ORA-01461: une valeur 'LONG' ne peut être liée
> que dans une colonne de type 'LONG'
>
> Je pense que le message d'erreur est un peu érroné et que c'est un
problème
> au niveau d'Oracle et donc bientôt off-topic. Mais j'aurais voulu savoir
si
> ca est dèjà arrivé à quelqu'un et si quelqu'un avait une idée pour
résoudre
> mon problème.
>
>
> Pour info, ma table oracle est la suivante :
> create table MATABLE
> (
>     DATA              CLOB                   null    ,
>     ID            INTEGER                not null,
>     constraint PK_MATABLE primary key (ID)
> )
>
>
> -------------------------------------
> Laurent Forêt
> Service développement
> l.foret@korom.net
> www.korom.net


     

From:           	Speh Sylvain <sylvain.speh@CLERMONT.cemagref.fr>
To:             	java@u-strasbg.fr
Subject:        	RE: CLOB et JDBC (suite).
Date sent:      	Tue, 14 Aug 2001 14:09:44 +0200
Send reply to:  	java@u-strasbg.fr

Je fais aussi un insert à vide avec un select pour verrouiller
l'enregistrement : le "FOR UPDATE" est vraiment important, sinon tu peux
pas streamer sur le pointeur du LOB. J'ai pas vu d'exemples chez Oracle où
ils inséraient le CLOB directement. Sinon, si tu n'y arrives toujours pas
avec ta solution, y'a des listes Oracle, comme oracle@cru.fr, c'est bien
réactif.


-----Message d'origine-----
De : Laurent Forêt [mailto:l.foret@korom.net]
Envoyé : mardi 14 août 2001 13:57
À : Java Strasbourg
Objet : TR: CLOB et JDBC (suite).




-------------------------------------

Laurent Forêt

Service développement

l.foret@korom.net

www.korom.net



-----Message d'origine-----
De : Jean Fabien Renard [mailto:jean-fabien.renard@cgey.com]
Envoyé : mardi 14 août 2001 13:49
À : Laurent Forêt
Objet : Re: CLOB et JDBC (suite).


Je ne réponds qu'à toi car je ne peux plus envoyer de mail à la liste à
cause d'un changement d'adresse mail de ma boîte... enfin bref... passons
ce problème si tu veux en faire partagé la communauté...

sur mon projet sur lequel j'ai mis en place des CLOB et voici comment je
procède.

1: tu met un CLOB vide
PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE (DATA)
 VALUES (empty_clob())");

2: tu le récupère
Statement stmt = dbCon.createStatement();
  CLOB myClob = null;
  ResultSet rs = stmt.executeQuery("SELECT DATA FROM MATABLE  WHERE ID =
  ...
FOR UPDATE");

3: tu l'initialise
 if (rs.next()) {
  myClob = ((OracleResultSet)rs).getCLOB(1);
  myClob.putString(1, monText);
 }


chez nous ca marche.

en esperant que cela puisse t'aider.
tiens moi au courant.

Jean-Fabien




----- Original Message -----
From: "Laurent Forêt" <l.foret@korom.net>
To: "Java Strasbourg" <java@u-strasbg.fr>
Sent: Tuesday, August 14, 2001 1:32 PM
Subject: CLOB et JDBC (suite).


> Suite de mon problème de clob, avec 3 réalisations :
>
> Soit le code suivant
>
>   PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE
(DATA)
> VALUES (?)");
>
> // Finalement, j'ai 3 bout de code possible.
>
> // 1ére possibilité :
>       ps.setString(1,longString);
> //      marche si la String n'est pas trop longue
>
> // 2ème possibilité :
>       byte[] data = genereLongString(1000).getBytes();
>       InputStream is = new ByteArrayInputStream(data);
>       ps.setAsciiStream(1,is,data.length);
>       is.close().
> //      marche si la String n'est pas trop longue
>
> // 3ème possibilité :
>       oracle.sql.CLOB myClob = new
> CLOB((OracleConnection)dbCon,genereLongString(10).getBytes());
>       ps.setClob(1,(Clob)myClob );
>       System.err.println( ps.execute());
> //    ne marche jamais
>
> Quand ca ne marche pas j'ai l'exception suivante :
>
> java.sql.SQLException: ORA-01461: une valeur 'LONG' ne peut être liée
> que dans une colonne de type 'LONG'
>
> Je pense que le message d'erreur est un peu érroné et que c'est un
problème
> au niveau d'Oracle et donc bientôt off-topic. Mais j'aurais voulu savoir
si
> ca est dèjà arrivé à quelqu'un et si quelqu'un avait une idée pour
résoudre
> mon problème.
>
>
> Pour info, ma table oracle est la suivante :
> create table MATABLE
> (
>     DATA              CLOB                   null    ,
>     ID            INTEGER                not null,
>     constraint PK_MATABLE primary key (ID)
> )
>
>
> -------------------------------------
> Laurent Forêt
> Service développement
> l.foret@korom.net
> www.korom.net

     

From:           	Laurent Forêt <l.foret@korom.net>
To:             	<java@u-strasbg.fr>
Subject:        	RE: CLOB et JDBC (suite et fin).
Date sent:      	Tue, 14 Aug 2001 14:29:06 +0200
Send reply to:  	java@u-strasbg.fr

C'est finalement la solution que j'ai choisi dont voici mon source :

      PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE
(DATA) VALUES (empty_clob())");
      ps.execute();
      Statement stmt = dbCon.createStatement();
      CLOB myClob = null;
      int maxID=-1;
      ResultSet rs = stmt.executeQuery("SELECT MAX(ID) FROM MATABLE"); if
      (rs.next()) {
        maxID = rs.getInt(1);
      }

      rs = stmt.executeQuery("SELECT DATA FROM MATABLE  WHERE ID
='"+maxID+"' FOR UPDATE");
      if (rs.next()) {
        myClob = ((OracleResultSet)rs).getCLOB(1);
        myClob.putString(1, genereLongString(10000));
      }
      dbCon.commit();

Merci a vous deux (Sylvain et Jean Fabien).


-------------------------------------
Laurent Forêt
Service développement
l.foret@korom.net
www.korom.net



> -----Message d'origine-----
> De : Speh Sylvain [mailto:sylvain.speh@CLERMONT.cemagref.fr]
> Envoyé : mardi 14 août 2001 14:10
> À : java@u-strasbg.fr
> Objet : RE: CLOB et JDBC (suite).
>
>
> Je fais aussi un insert à vide avec un select pour verrouiller
> l'enregistrement : le "FOR UPDATE" est vraiment important, sinon
> tu peux pas
> streamer sur le pointeur du LOB.
> J'ai pas vu d'exemples chez Oracle où ils inséraient le CLOB
> directement. Sinon, si tu n'y arrives toujours pas avec ta solution, y'a
> des listes Oracle, comme oracle@cru.fr, c'est bien réactif.
>
>
> -----Message d'origine-----
> De : Laurent Forêt [mailto:l.foret@korom.net]
> Envoyé : mardi 14 août 2001 13:57
> À : Java Strasbourg
> Objet : TR: CLOB et JDBC (suite).
>
>
>
>
> -------------------------------------
>
> Laurent Forêt
>
> Service développement
>
> l.foret@korom.net
>
> www.korom.net
>
>
>
> -----Message d'origine-----
> De : Jean Fabien Renard [mailto:jean-fabien.renard@cgey.com]
> Envoyé : mardi 14 août 2001 13:49
> À : Laurent Forêt
> Objet : Re: CLOB et JDBC (suite).
>
>
> Je ne réponds qu'à toi car je ne peux plus envoyer de mail à la liste à
> cause d'un changement d'adresse mail de ma boîte... enfin bref...
> passons ce problème si tu veux en faire partagé la communauté...
>
> sur mon projet sur lequel j'ai mis en place des CLOB et voici comment je
> procède.
>
> 1: tu met un CLOB vide
> PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE
> (DATA)
>  VALUES (empty_clob())");
>
> 2: tu le récupère
> Statement stmt = dbCon.createStatement();
>   CLOB myClob = null;
>   ResultSet rs = stmt.executeQuery("SELECT DATA FROM MATABLE
> WHERE ID = ...
> FOR UPDATE");
>
> 3: tu l'initialise
>  if (rs.next()) {
>   myClob = ((OracleResultSet)rs).getCLOB(1);
>   myClob.putString(1, monText);
>  }
>
>
> chez nous ca marche.
>
> en esperant que cela puisse t'aider.
> tiens moi au courant.
>
> Jean-Fabien
>
>
>
>
> ----- Original Message -----
> From: "Laurent Forêt" <l.foret@korom.net>
> To: "Java Strasbourg" <java@u-strasbg.fr>
> Sent: Tuesday, August 14, 2001 1:32 PM
> Subject: CLOB et JDBC (suite).
>
>
> > Suite de mon problème de clob, avec 3 réalisations :
> >
> > Soit le code suivant
> >
> >   PreparedStatement ps = dbCon.prepareStatement("INSERT INTO MATABLE
> (DATA)
> > VALUES (?)");
> >
> > // Finalement, j'ai 3 bout de code possible.
> >
> > // 1ére possibilité :
> >       ps.setString(1,longString);
> > //      marche si la String n'est pas trop longue
> >
> > // 2ème possibilité :
> >       byte[] data = genereLongString(1000).getBytes();
> >       InputStream is = new ByteArrayInputStream(data);
> >       ps.setAsciiStream(1,is,data.length);
> >       is.close().
> > //      marche si la String n'est pas trop longue
> >
> > // 3ème possibilité :
> >       oracle.sql.CLOB myClob = new
> > CLOB((OracleConnection)dbCon,genereLongString(10).getBytes());
> >       ps.setClob(1,(Clob)myClob );
> >       System.err.println( ps.execute());
> > //    ne marche jamais
> >
> > Quand ca ne marche pas j'ai l'exception suivante :
> >
> > java.sql.SQLException: ORA-01461: une valeur 'LONG' ne peut
> être liée que
> > dans une colonne de type 'LONG'
> >
> > Je pense que le message d'erreur est un peu érroné et que c'est un
> problème
> > au niveau d'Oracle et donc bientôt off-topic. Mais j'aurais voulu
> > savoir
> si
> > ca est dèjà arrivé à quelqu'un et si quelqu'un avait une idée pour
> résoudre
> > mon problème.
> >
> >
> > Pour info, ma table oracle est la suivante :
> > create table MATABLE
> > (
> >     DATA              CLOB                   null    ,
> >     ID            INTEGER                not null,
> >     constraint PK_MATABLE primary key (ID)
> > )
> >
> >
> > -------------------------------------
> > Laurent Forêt
> > Service développement
> > l.foret@korom.net
> > www.korom.net
>
>

C'est fini ! Retour à l'accueil de la pseudo-archive