我需要将XML文件内容写入oracle数据库,其中列是CLOB数据类型。 我该怎么做?
答案 0 :(得分:25)
最简单的方法是简单地使用
stmt.setString(position, xml);
方法(用于可以轻松保存在Java内存中的“小”字符串)或
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();
}
答案 1 :(得分:11)
OUTDATED 请参阅下面的Lukas Eder的答案。
大约有100行代码;-) Here is an example。
重点:与其他JDBC驱动程序不同,Oracle中的驱动程序不支持使用Reader
和InputStream
作为INSERT
的参数。相反,您必须SELECT
CLOB
列FOR UPDATE
,然后写入ResultSet
我建议您将此代码移动到辅助方法/类中。否则,它将污染您的其余代码。
答案 2 :(得分:4)
将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();
}
}
答案 3 :(得分:4)
这段代码对我有用。我使用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 :(得分:3)
将clob转换为字符串:
Clob clob=rs.getClob(2);
String str=(String)clob.getSubString(1,(int)clob.length());
System.out.println("Clob Data is : "+str);
答案 5 :(得分:2)
为此,您需要建立连接结果集
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();
}
注意:重要的是在查询结尾处添加用于更新的短语,以便选择行...
按照上面的代码插入XML文件
答案 6 :(得分:2)
你可以用下面的代码很好地做到这一点,我只给你一些插入xml的代码希望你完成其他的事情。
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);
我这样做了,工作正常。
答案 7 :(得分:0)
试试这个,不需要设置它的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) {
}
}
}
}
答案 8 :(得分:0)
我有类似的问题。将我的一个表列从varchar2更改为CLOB。 我不需要更改任何java代码。我将它保存为setString(..),因此如果您使用以下版本的ATLEAST of Oracle和jdbc驱动程序,则无需将set方法更改为setClob()etch。
我尝试使用In Oracle 11g和驱动程序ojdbc6-11.2.0.4.jar
答案 9 :(得分:0)
请查看LobBasicSample以获取使用CLOB,BLOB,NLOB数据类型的示例。