web-dev-qa-db-fra.com

Java: Comment insérer CLOB dans la base de données Oracle

J'ai besoin d'écrire un contenu de fichier XML dans la base de données Oracle où la colonne est du type de données CLOB . Comment vais-je procéder?

14
Ianthe

Avec environ 100 lignes de code ;-) Voici un exemple .

Le point principal: contrairement aux autres pilotes JDBC, celui d’Oracle ne prend pas en charge l’utilisation de Reader et InputStream en tant que paramètres d’un INSERT. Au lieu de cela, vous devez SELECT la CLOB colonne FOR UPDATE, puis écrire dans la ResultSet

Je vous suggère de déplacer ce code dans une méthode/classe d'assistance. Sinon, cela va polluer le reste de votre code.

11
Aaron Digulla

Le moyen le plus simple est d’utiliser simplement le

stmt.setString(position, xml);

méthodes (pour les "petites" chaînes qui peuvent être facilement conservées dans la mémoire Java), ou

try {
  Java.sql.Clob clob = 
    Oracle.sql.CLOB.createTemporary(
      connection, false, Oracle.sql.CLOB.DURATION_SESSION);

  clob.setString(1, xml);
  stmt.setClob(position, clob);
  stmt.execute();
}

// Important!
finally {
  clob.free();
}
22
Lukas Eder

Ce code a fonctionné pour moi. J'utilise ojdbc6-11.2.0.2.jar.

Java.sql.Connection con;
javax.xml.bind.Marshaller marshaller;

Clob xmlClob = con.createClob();
try {
  try (Writer xmlClobWriter = xmlClob.setCharacterStream(1)) {
    m.marshal(jaxbObject, xmlClobWriter);
  } // xmlClobWriter.close();
  try (PreparedStatement stmt = con.prepareStatement("INSERT INTO table (xml) values(?)")) {
    stmt.setClob(1, xmlClob);
    stmt.executeUpdate();
  }
} finally {
  xmlClob.free();
}
4
TomWolk

en passant le contenu XML sous forme de chaîne.

table1 

ID   int
XML  CLOB



import Oracle.jdbc.OraclePreparedStatement;
/*
Your Code
*/
 void insert(int id, String xml){
    try {
        String sql = "INSERT INTO table1(ID,XML) VALUES ("
                + id
                + "', ? )";
        PreparedStatement ps = conn.prepareStatement(sql);
        ((OraclePreparedStatement) ps).setStringForClob(1, xml);
        ps.execute();
        result = true;
        } catch (Exception e) {
        e.printStackTrace();
    }
  }
4
Vignesh

Pour cela, vous devez définir le résultat de la connexion. 

ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE

Connection con=null;
//initialize connection variable to connect to your database...
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String query="Select MYCLOB from TABLE_NAME for update";
con.setAutoCommit(false);
ResultSet resultset=stmt.executeQuery(query);


if(resultset.next()){
Oracle.sql.CLOB    clobnew = ((OracleResultSet) rss).getCLOB("MYCLOB");
PrintWriter pw = new PrintWriter(clobnew.getCharacterOutputStream() );
BufferedReader br = new BufferedReader( new FileReader( new File("filename.xml") ) );
String  lineIn = null;
while( ( lineIn = br.readLine() ) != null )
      pw.println( lineIn );
      pw.close();
      br.close();
}

con.setAutoCommit(true);
con.commit();
}

Remarque: il est important que vous ajoutiez la phrase à mettre à jour à la fin de la requête écrite pour sélectionner la ligne ...

Suivez le code ci-dessus pour insérer le fichier XML

2
Sangeet Menon

Vous pouvez très bien le faire avec le code ci-dessous, je vous donne juste le code pour insérer xml espérons que vous avez terminé avec le reste d’autres choses ..

import Oracle.xdb.XMLType;

//now inside the class......
// this will be to convert xml into string

File file = new File(your file path);
FileReader fileR = new FileReader(file);
fileR.read(data);
String str = new String(data);

// now to enter it into db

conn = DriverManager.getConnection(serverName, userId, password);

XMLType objXml = XMLType.createXML(conn, str);

// inside the query statement put this code

objPreparedstatmnt.setObject(your value index, objXml);

J'ai fait comme ça et ça marche bien. 

2
Shantanu

Conversion de clob en chaîne:

Clob clob=rs.getClob(2);      
String str=(String)clob.getSubString(1,(int)clob.length());      
System.out.println("Clob Data is : "+str);
2
Ramesh

Essayez ceci, il n’est pas nécessaire de définir un CLOB

  public static void main(String[] args)
        {
        try{    

                    System.out.println("Opening db");

                    Class.forName("Oracle.jdbc.driver.OracleDriver"); 
                    if(con==null)
                     con=DriverManager.getConnection("jdbc:Oracle:thin:@192.9.200.103:1521: orcl","sas","sas");  
                    if(stmt==null)
                    stmt=con.createStatement();  


                    int res=9;

                    String usersSql = "{call Esme_Insertsmscdata(?,?,?,?,?)}";
                    CallableStatement stmt = con.prepareCall(usersSql);
            // THIS THE CLOB DATA  
            stmt.setString(1,"SS¶5268771¶00058711¶04192018¶SS¶5268771¶00058712¶04192018¶SS¶5268772¶00058713¶04192018¶SS¶5268772¶00058714¶04192018¶SS¶5268773¶00058715¶04192018¶SS¶5268773¶00058716¶04192018¶SS¶5268774¶00058717¶04192018¶SS¶5268774¶00058718¶04192018¶SS¶5268775¶00058719¶04192018¶SS¶5268775¶00058720¶04192018¶");     
                    stmt.setString(2, "bcvbcvb");
                    stmt.setString(3, String.valueOf("4522"));
                    stmt.setString(4, "42.25.632.25");
                    stmt.registerOutParameter(5,OracleTypes.NUMBER);    
                    stmt.execute();
                    res=stmt.getInt(5);
                    stmt.close();

                    System.out.println(res);




                    }
                    catch(Exception e)
                    { 

                         try 
                         {
                            con.close();
                        } catch (SQLException e1) {


                        }
                    }  
                }
    }
0
wahid

Jetez un oeil sur LobBasicSample pour un exemple d'utilisation des types de données CLOB, BLOB, NLOB 

0
Nirmala

J'ai eu le même problème. Modification de l'une des colonnes de la table varchar2 en CLOB . Je n'avais pas besoin de modifier le code Java. Je l'ai gardé en tant que setString (..) seulement, donc pas besoin de changer la méthode set en tant que setClob () etch si vous utilisez les versions suivantes ATLEAST of Oracle et le pilote jdbc.

J'ai essayé dans Oracle 11g et le pilote ojdbc6-11.2.0.4.jar 

0
Mandrake