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?
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.
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();
}
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();
}
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();
}
}
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
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.
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);
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) {
}
}
}
}
Jetez un oeil sur LobBasicSample pour un exemple d'utilisation des types de données CLOB, BLOB, NLOB
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