【问题标题】:Java: How to insert CLOB into oracle databaseJava:如何将 CLOB 插入 oracle 数据库
【发布时间】:2011-04-05 08:57:14
【问题描述】:

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

【问题讨论】:

    标签: java oracle insert clob


    【解决方案1】:

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

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

    【讨论】:

    • 嗯,你是对的。我最近没有尝试过。我会用替代方法更新我的回复
    • 这里的oracle.sql.CLOB.DURATION_SESSION有什么用?
    • @V-spring:Oracle CLOB 是一个“连接”对象,其生命周期独立于对其进行实际引用的查询。据我所知,即使在执行 INSERT / UPDATE 之后,您也可以读取/写入实际的 LOB。不过,我必须查看详细信息才能确定这一点……
    • @LukasEder 你认为什么是“相当小的字符串”?
    • 通知clob.free()由于Unhandled exception type SQLException导致编译错误
    【解决方案2】:

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

    大约 100 行代码 ;-) Here is an example.

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

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

    【讨论】:

    • 链接无法访问,需要用户名和密码
    • @lanthe 你能接受 Lukas Eders(非常棒)的回答,这样我就可以删除我的了?
    【解决方案3】:

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

    【讨论】:

    【解决方案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();
    }
    

    【讨论】:

      【解决方案5】:

      将 clob 转换为字符串:

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

      【讨论】:

        【解决方案6】:

        为此您需要制作连接结果集

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              试试这个,不用设置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) {
              
              
                                      }
                                  }  
                              }
                  }
              

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-07-16
                  • 1970-01-01
                  • 2017-12-19
                  • 2019-07-10
                  • 1970-01-01
                  • 2015-06-26
                  相关资源
                  最近更新 更多