17

我需要将 XML 文件内容写入 oracle 数据库,其中列是 CLOB 数据类型。我将如何做到这一点?

4

10 回答 10

29

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

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();
}
于 2011-04-05T09:00:28.730 回答
11

过时请参阅下面 Lukas Eder 的回答。

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

要点:与其他 JDBC 驱动程序不同,Oracle 的驱动程序不支持使用ReaderandInputStream作为INSERT. 相反,您必须SELECTCLOB列中FOR UPDATE然后写入ResultSet

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

于 2011-04-05T09:01:09.510 回答
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();
    }
  }
于 2013-03-21T20:10:10.020 回答
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();
}
于 2014-03-11T13:26:55.157 回答
3

将 clob 转换为字符串:

Clob clob=rs.getClob(2);      
String str=(String)clob.getSubString(1,(int)clob.length());      
System.out.println("Clob Data is : "+str);
于 2011-06-20T12:37:01.293 回答
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 文件

于 2011-04-05T09:08:36.343 回答
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);

我已经这样做了,并且工作正常。

于 2011-10-25T07:29:19.770 回答
1

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

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

于 2018-04-25T15:50:17.850 回答
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) {


                        }
                    }  
                }
    }
于 2018-04-19T06:14:19.863 回答
0

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

于 2018-04-30T18:28:25.970 回答