广

oracle数据库

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

    oracle数据库中如何处理clob字段方法介绍

    2018-05-07 10:24:42 次阅读 稿源:互联网
    广告
    全网推广平台,软文发布
    在知识库的建立的时候,用普通VARCHAR2存放文章是显然不够的,只有区区4000的字节,放不了多少字,
    而CLOB数据类型,则能最多存放8G的数据。但是这个字段处理起来有比较多的特殊性,记录一下。
    插入:
    直接写在SQL里面是不行的,一来SQL脚本有字符数限制,而来文章内容包含许多特殊字符,如换行,引号,
    之类的东西,很麻烦。网上流行通用做法是先插入一个空CLOB字段,用empty_clob()方法来创建空字段,如:
    代码如下:

    INSERT INTO T_TOPIC(TOPIC_ID,TOPIC_CONTENT) VALUES(‘0000001',empty_clob());

    然后再用SELECT TOPIC_CONTENT FROM T_TOPIC WHERE TOPIC_ID='0000001'FOR UPDATE的查询语句,
    来构造一个更新的STATEMENT,在获取到ResultSet之后,对CLOB字段进行更新。
    代码如下:

    ResultSet rs = pstm.executeQuery();
    if(rs.next()){
    oracle.sql.CLOB lob =(CLOB)rs.getClob(1);
    try {
    Writer os = lob.getCharacterOutputStream();
    os.write(dr.getField("FLD_CONTENT").asString());
    os.flush();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    这个插入和更新操作要放在事务中,即获取到Connection后要设置setAutoCommit(false);
    更新:
    更新的时候也是采用SEELCT … FOR UPDATE方式
    也要设置事务

    读取:
    代码如下:

    CLOB clob = (CLOB)rs.getClob("FLD_CONTENT");
    Reader reader = clob.getCharacterStream();
    StringBuffer sb=new StringBuffer();
    char[] cb = new char[1024];
    try {
    for(int len = reader.read(cb);len>0;len= reader.read(cb)){
    sb.append(cb,0,len);
    }
    } catch (IOException e) {
    throw new SQLException("读取文章内容失败.",e);
    }

    查询的特殊性:
    有CLOB字段的数据表,在SQL语句中不能使用DISTINCT关键字进行筛选,即便关键字不用在CLOB字段名前,
    实际上DISTINCT关键字都是对于SQL中所有字段有效。而CLOB字段是不能进行如同LIKE类似的匹配的,所以,
    不能进行去重复操作。
    两种解决办法:
    1、在SQL中调用方法转成VARCHAR2字段后,再DISTINCT,这种方式的局限显而易见。
    2、改变SQL脚本的书写方式,先查出没有CLOB字段的集合,然后在在外层用EXISTS关键字或IN关键字进行筛选。
    代码如下:

    //String sqlsel2 = "select jsonbody from db_ps_listcatalog where" +
    // " listtype ='sh11' for update";
    // String col="jsonbody";

    public boolean updateClob(String sql,String col,String buf){
    boolean flag=false;
    Statement stem=null;
    Connection conn=null;
    ResultSet rs=null;
    Writer wr = null;
    try{
    conn= dp.getConnection();
    conn.setAutoCommit(false);
    stem=conn.createStatement();
    rs = stem.executeQuery(sql);
    if (rs.next()) {
    CLOB clob = (CLOB) rs.getClob(col);
    java.lang.reflect.Method methodToInvoke = clob.getClass().getMethod(
    "getCharacterOutputStream", (Class[]) null);
    wr = (Writer) methodToInvoke.invoke(clob, (Object[]) null);
    BufferedWriter bw = new BufferedWriter(wr);
    bw.write(buf);
    bw.flush();
    bw.close();
    conn.commit();
    conn.close();
    }
    flag=true;
    } catch (Exception ex){
    try {
    conn.rollback();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    return flag;
    }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告
    广告