मुझे ओरेकल डेटाबेस में एक XML फ़ाइल सामग्री लिखनी है जहां कॉलम CLOB डेटाटाइप का है। मैं यह कैसे करूँगा?जावा: ओरेकल डेटाबेस में CLOB को कैसे सम्मिलित करें
उत्तर
कोड के बारे में 100 लाइनों के साथ उपयोग करने के लिए है ;-) Here is an example।
मुख्य बिंदु: अन्य जेडीबीसी ड्राइवरों के विपरीत, ओरेकल से एक Reader
और InputStream
का उपयोग INSERT
के पैरामीटर के रूप में करने का समर्थन नहीं करता है। इसके बजाय, आप CLOB
स्तंभ FOR UPDATE
और फिर लिखने ResultSet
में मेरा सुझाव है कि आप एक सहायक विधि/वर्ग में इस कोड को ले जाने के SELECT
चाहिए। अन्यथा, यह आपके शेष कोड को प्रदूषित करेगा।
सबसे आसान तरीका है बस
stmt.setString(position, xml);
तरीकों ("छोटे" स्ट्रिंग्स के लिए जो आसानी से जावा स्मृति में रखा जा सकता है), या
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();
}
हम्म, आप सही हैं। मैंने हाल ही में कोशिश नहीं की। मैं वैकल्पिक –
के साथ अपनी प्रतिक्रिया अपडेट करूंगा, oracle.sql.CLOB.DURATION_SESSION का उपयोग क्या है? –
@ वी-वसंत: एक ओरेकल 'सीएलओबी 'जीवन चक्र के साथ एक" जुड़ा हुआ "वस्तु है जो वास्तविक संदर्भ बनाने वाले प्रश्नों से स्वतंत्र है। जहां तक मुझे पता है, आप 'INSERT' /' UPDATE' निष्पादित होने के बाद भी वास्तविक LOB को पढ़/लिख सकते हैं। मुझे इस बारे में सुनिश्चित करने के लिए विवरण देखना होगा, हालांकि ... –
इस उद्देश्य आप कनेक्शन परिणाम सेट
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();
}
नोट: अपनी महत्वपूर्ण है कि आप अद्यतन के लिए वाक्यांश जोड़ना पंक्ति का चयन करने के लिए लिखे गए प्रश्न के अंत में ...
टी का पालन करें वह कोड ऊपर स्ट्रिंग के लिए CLOB परिवर्तित एक्सएमएल फ़ाइल
डालने के लिए:
Clob clob=rs.getClob(2);
String str=(String)clob.getSubString(1,(int)clob.length());
System.out.println("Clob Data is : "+str);
आप बहुत अच्छी तरह से नीचे दिए गए कोड के साथ यह कर सकते हैं, मैं तुम्हें एक्सएमएल डालने के लिए सिर्फ कोड दे रहा हूँ उम्मीद यू बाकी के साथ किया जाता है अन्य चीजों के ..
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);
मैंने ऐसा किया है और यह ठीक काम कर रहा है।
स्ट्रिंग के रूप में XML सामग्री को पास कर रहा है।
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();
}
}
+1 (http://docs.oracle.com/cd/E11882_01/appdev.112/e13995/oracle/jdbc/OraclePreparedStatement.html#setStringForClob_int__java_lang_String_) – ceving
यह कोड मेरे लिए काम करता है। मैं 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();
}
+1 अद्यतन किया।[SetStringForClob] के लिए – asgs