Java:如何将CLOB插入oracle数据库

我需要将XML文件内容写入oracle数据库,其中列是CLOB数据类型。 我该怎么做?

大约有100行代码;-) 这是一个例子 。

要点:与其他JDBC驱动程序不同,Oracle中的驱动程序不支持使用ReaderInputStream作为INSERT参数。 相反,您必须SELECT CLOBFOR UPDATE然后写入ResultSet

我建议您将此代码移动到辅助方法/类中。 否则,它将污染您的其余代码。

最简单的方法就是简单地使用

 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(); } 

将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(); } } 

这段代码对我有用。 我使用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(); } 

为此,您需要进行连接结果集

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文件

你可以用下面的代码很好地做到这一点,我给你的代码插入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); 

我这样做了,它工作正常。

将clob转换为字符串:

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

试试这个,没有必要设置它的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) { } } } } 

我有类似的问题。 将我的一个表列从varchar2更改为CLOB。 我不需要更改任何java代码。 我将它保存为setString(..),因此如果您使用以下版本的ATLEAST of Oracle和jdbc驱动程序,则无需将set方法更改为setClob()etch。

我在In Oracle 11g和驱动程序ojdbc6-11.2.0.4.jar中尝试过

查看LobBasicSample以获取使用CLOB,BLOB,NLOB数据类型的示例。