• ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小


    前言

    做项目的时候遇到一个报错:ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小。查找原因发现是某个字段在数据库中是clob类型。然后sql语句进行查询的时候,对该字段进行了to_char操作。由于varchar类型最大长度为4000,而clob中的内容长度高于4000。于是产生这样的问题。针对这个问题,结合自己的测试,想了以下三种解决方法,在此进行记录。

    一、进行实体映射及获取字段数据时,直接当成string处理

    比如说,我们使用jdbctemplate来进行查询的时候,封装实体对象字段,我们不将字段封为clob类型而是直接封为string类型。然后我们进行查询的时候,会发现没有问题,clob中的内容完整的封入了string字段中。

    二、对clob进行截取

    对数据库中的clob字段的内容进行截取,也可以解决这一问题,但是会造成clob中内容获取的不完整。

    比如下方 name字段是clob类型,sql写法如下:

    select to_char(substr(name,0,4000)) as name from people

    我们截取name的前4000位,这样没有超过varchar类型的最大值,所以不会报错。

    需要注意的是:如果clob中有中文会占两个字符。所以比较安全的方式就是除以2,进行截取。

    sql写法如下:

    select to_char(substr(name,0,2000)) as name from people

    三、通过java代码将clob转为string

    我们获取到一个clob类型的数据后,对其进行处理,使其转换为string类型。

    转换代码如下:

        public String ClobtoString(Clob clob){
            String reString = "";
            Reader is = null;
            try {
                is = clob.getCharacterStream();
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 得到流
            BufferedReader br = new BufferedReader(is);
            String s = null;
            try {
                s = br.readLine();
            } catch (Exception e) {
                e.printStackTrace();
            }
            StringBuffer sb = new StringBuffer();
            while (s != null) {
                // 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
                sb.append(s);
                try {
                    s = br.readLine();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            reString = sb.toString();
            return reString;
        }

    总结

    三种方式,推荐大家使用第三种。

    第三种方式正规,靠谱。

    第二种方式,如果图便捷,又对数据完整性没要求,可以使用。

    第一种方式,只在spring中的jdbcTemplate下使用没有发现问题,其他操作方式或数据库框架可能引起问题,需要大家来测试了。

  • 相关阅读:
    .NET 动态脚本语言
    webParts与Web部件
    比较JqGrid与XtraGrid
    XtraGrid滚轮翻页
    Python------继承
    Python 私有化类的属性
    Python print 输出不换行,只有空格
    Python--函数参数类型
    手推FP-growth (频繁模式增长)算法------挖掘频繁项集
    Python 返回多个值+Lambda的使用
  • 原文地址:https://www.cnblogs.com/jichi/p/10283227.html
Copyright © 2020-2023  润新知