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

Java:如何将CLOB插入oracle数据库,java,oracle,insert,clob,Java,Oracle,Insert,Clob,我需要将XML文件内容写入oracle数据库,其中列为CLOB数据类型。 我该怎么做呢?最简单的方法就是简单地使用 stmt.setString(position, xml); 方法(用于可以轻松保存在Java内存中的“小”字符串),或 过时请参见下面卢卡斯·埃德的答案 大约有100行代码;-) 要点:与其他JDBC驱动程序不同,Oracle的JDBC驱动程序不支持使用Reader和InputStream作为INSERT的参数。相反,您必须选择CLOB列进行更新,然后写入结果集 我建议您将此

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

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

stmt.setString(position, xml);
方法(用于可以轻松保存在Java内存中的“小”字符串),或


过时请参见下面卢卡斯·埃德的答案

大约有100行代码;-)

要点:与其他JDBC驱动程序不同,Oracle的JDBC驱动程序不支持使用
Reader
InputStream
作为
INSERT
的参数。相反,您必须
选择
CLOB
进行更新
,然后写入
结果集

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

为此,您需要建立连接结果集

ResultSet.TYPE\u SCROLL\u敏感,ResultSet.CONCUR\u可更新

注意:在为选择行而编写的查询末尾添加短语以进行更新非常重要


按照上述代码插入将clob转换为字符串的XML文件:

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

你可以用下面的代码很好地完成它,我只给你插入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);

我已经这样做了,它工作得很好

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

试试这个,没有必要把它设为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(..),这样,如果您使用的是至少以下版本的Oracle和jdbc驱动程序,则无需将set方法更改为setClob()etch


我在Oracle11g和驱动程序ojdbc6-11.2.0.4.jar中进行了尝试。请看一下,以获取使用CLOB、BLOB、NLOB数据类型的示例

嗯,你说得对。我最近没有试过。我将用另一个选项更新我的回答这里的oracle.sql.CLOB.DURATION\u会话有什么用?@V-spring:oracle
CLOB
是一个具有生命周期的“连接”对象,其生命周期独立于对其进行实际引用的查询。据我所知,即使在执行
INSERT
/
UPDATE
之后,您也可以读取/写入实际LOB。我必须查找细节才能确定这一点……LukaseDe您认为什么是“相当小的字符串”?注意“代码> Culb.For())/代码>导致编译错误,由于<代码>未处理的异常类型SqLExcExc< /Calp> + 1对于链接是不可达的,它需要用户和password@lanthe你能接受卢卡斯·埃德斯(非常优越)吗回答以便我可以删除我的?
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();
}
  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) {


                        }
                    }  
                }
    }