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

2023-11-17

昨天遇到一个问题,ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小,去找问题时候,发现是sql查询语句的to_char方法将clob类型转换成varchar类型出了问题,oracle中varchar最大的长度是4000。把clob大文本类型直接转换成varcahr类型时:在clob的长度小于4000的时候,没有超过varchar的最大值,不会出问题,一旦超过4000就会报“ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小”。

查询了相关资料后发现有两种解决方法:

①java中解决:利用流将数据读取到char[]中,然后再将char[].toString():

public String clobToString(){
Reader inReader;
try {
inReader = clob.getCharacterStream();
BufferedReader br = new BufferedReader(inReader);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {
sb.append(s);
s = br.readLine();
}
return sb.toString();
} catch (SQLException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}

②sql中解决:将bold转换成clob,再将clob转换成varchar(注:从http://blog.csdn.net/wbo112/article/details/9041575中摘取):

oracle中varchar2字段存入blob字段及blob转成varchar2
CREATE OR REPLACE FUNCTION C2B (b IN CLOB default empty_clob()) RETURN BLOB
-- typecasts BLOB to CLOB (binary conversion)
IS
   res            BLOB;
   b_len          number  := dbms_lob.getlength(b) ;
   dest_offset1   NUMBER  := 1;
   src_offset1    NUMBER  := 1;
   amount_c       INTEGER := DBMS_LOB.lobmaxsize;
   blob_csid      NUMBER  := DBMS_LOB.default_csid;
   lang_ctx       INTEGER := DBMS_LOB.default_lang_ctx;
   warning        INTEGER;
BEGIN
   if  b_len  > 0  then
   DBMS_LOB.createtemporary (res, TRUE);
   DBMS_LOB.OPEN (res, DBMS_LOB.lob_readwrite);
   DBMS_LOB.convertToBlob (res,
                           b,
                           amount_c,
                           dest_offset1,
                           src_offset1,
                           blob_csid,
                           lang_ctx,
                           warning
                          );
 else
   select   empty_blob()  into  res  from  dual ;
  end if ;
   RETURN res;                                             -- res is OPEN here
END C2B;

1,首先利用to_clob函数把varchar2字段转成 clob字段。
2  利用上面函数将clob转成blob。
说白了就是  c2b(to_clob(varchar2字段))

create or replace Function Blob_To_Varchar (Blob_In In Blob) Return clob
Is
    V_Varchar Varchar2(32767);
     V_Varchar1 Varchar2(32767);
    V_Start Pls_Integer := 1;
    V_Buffer Pls_Integer := 4000;
Begin
 
    If Dbms_Lob.Getlength(Blob_In) Is Null Then
        Return '';
    End If;
    V_Varchar1 := '';
 --return to_char(Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer));
    For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop
        --当转换出来的字符串乱码时,可尝试用注释掉的函数
        --V_Varchar := Utl_Raw.Cast_To_Varchar2(Utl_Raw.Convert(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8'));
        V_Varchar :=  Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start));
        V_Varchar1 := V_Varchar1 || V_Varchar;
    
        V_Start := V_Start + V_Buffer;
    End Loop;
    Return V_Varchar1;
End Blob_To_Varchar;
1.首先执行上面的函数,返回的是个clob
2将clob转成varchar2
说白了 就是    to_char(Blob_To_Varchar(字段))
创建二个函数 然后就可以用了,如果说实现 数据库里面大字段的批量替换还是比较方便

update DR_RPT_REPORT_DATASOURCE
set data_sql = 
c2b(to_clob((select replace(Blob_To_Varchar(data_sql),'XXX','XXX') from DR_RPT_REPORT_DATASOURCE where data_id 
='XXXX' ))) where data_id = '' ;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小 的相关文章

随机推荐

  • 【数据结构与算法】不就是数据结构

    前言 嗨喽小伙伴们你们好呀 好久不见了 我已经好久没更新博文了 之前因为实习没有时间去写博文 现在已经回归校园了 我看了本学期的课程中有数据结构这门课程 这么课程特别重要 因为之前学过一点 所以就想着深入学习一下子 毕竟这门课程对于考研和就
  • 基于卷积神经网络进行股价预测(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 CNN是一种人工神经网络 CNN的结构可以分为3层 卷积层 Convolutional Layer 主要作用是提取特征 池化层 Max Pooling Layer
  • C/C++中for循环详解,以及括号中三部分内容的含义和C++11标准for方法

    for循环语句 作用 满足循环条件 执行循环语句 语法 for 起始表达式 条件表达式 末尾循环体 循环语句 格式 for init statement condition expression statement 解析 init stat
  • C# 学习笔记

    不再是学生了 成了社畜了 公司主要技术栈是C 大一时候学C 学的很迷糊 总要重新学一下 入职已经20天了 也开始上手简单增删改查了 记录了一些C 相关的东西 只是还没有系统整理 WinForm 控件命名规范 ADO NET 连接数据库 Co
  • python与人工智能:神经网络和深度学习,卷积神经网络识别手写文字

    深度学习是用于建立 模拟人脑进行分析学习的神经网络 并模仿人脑的机制来解释数据的一种机器学习 技术 卷积神经网络是其中最火热的技术 如果要做事 想赶快入门 速度出活 请先死记住 深度学习 多层的神经网络 如果要写论文 要作报告 要闲聊 请坚
  • Python实现长短记忆神经网络(LSTM)预测经验模态分解(EMD)各模态变化的组合时间序列预测模型

    本实验使用环境为Anaconda3 Jupyter 调用Sklearn包 Keras包 请提前准备好 只提供数据格式而不提供数据 本人是代码缝合怪小白 望大牛指点 1 导包 主要包含pandas numpy 绘图包 日期格式 数学计算 py
  • 2022-2027年中国老年健康服务行业发展监测及投资战略研究报告

    报告类型 产业研究 报告格式 电子 纸介版 出品单位 华经产业研究院 本报告由华经产业研究院重磅推出 对中国老年健康服务行业的发展现状 竞争格局及市场供需形势进行了具体分析 并从行业的政策环境 经济环境 社会环境及技术环境等方面分析行业面临
  • Python配置VTK库

    方法一 安装anaconda 使用conda install安装 注意不同版本的Python对应不同的命令 适用于python3 3 6以下 install n envA c menpo vtk 7 python 3 or if you w
  • 使用IDEA实现java生成随机验证码

    package test200 checkCode 需求 定义方法实现随机产生一个5位的验证码 每位可能是数字 大写字母 小写字母 分析 定义一个方法 生成验证码返回 方法参数是位数 方法的返回值类型是String 在方法内部使用for循环
  • Flutter卡packages get解决方法(附默认插件地址及国内镜像修改)

    Flutter卡packages get解决方法 附默认插件地址及国内镜像修改 问题描述 发现原因 解决问题 本篇主要讲述Mac环境下的配置 其他操作系统的用户可相应参考 问题描述 为项目添加新的依赖包 一直卡flutter pub get
  • 吴恩达机器学习(九)Precision、Recall、F-score、TPR、FPR、TNR、FNR、AUC、Accuracy

    目录 0 前言 1 Precision Recall F score F measure 2 TPR FPR TNR FNR AUC 3 Accuracy 学习完吴恩达老师机器学习课程的机器学习系统设计 简单的做个笔记 文中部分描述属于个人
  • [转载]2014年Windows平台软件推荐:神器小工具(骨灰级)

    底层工具 If you know how to use Process Monitor competently people of both sexes will immediately find you more attractive S
  • Centos7安装supervisor详细教程

    supervisor 要安装的软件的名称 supervisord 装好supervisor软件后 supervisord用于启动supervisor服务 supervisorctl 用于管理supervisor配置文件中program和su
  • iOSApp发布状态为可供销售,但在AppStore搜索不到

    通过客服反馈 反馈官网 操作步骤 进入官网 gt 登录 gt App设置和分发 gt AppStore搜索和曝光率 gt 电话或电子邮件 App设置和分发 AppStore搜索和曝光率 电话或电子邮件 电话时 邮件时
  • python测量线长

    模块 matplotlib PIL time math win32con threading 代码 mian py from PIL import Image import matplotlib pyplot as plt from ima
  • 如何使用git 生成patch 和打入patch

    平时我们在使用git 管理项目的时候 会遇到这样一种情况 那就是客户使用git 生成patch 给到我们 那我们就需要把客户给到patch 打入到我们的project 基于这样一个场景 我把git 如何生成patch 和如何打入patch
  • discuz如何进行邮件配置

    需求 discuz能使用本站域名的邮件后缀发送邮件 思路 使用腾讯企业邮 通过DNS的MX记录绑定本站域名 最后通过腾讯企业邮小程序获取到该账号的客户端专用密码 获取到客户端专用密码后 回到discuz后台进行设置 如下 按字格式进行填写
  • 如何存储10亿的数据

    最近突然想到这么一个问题 假如有 lt 10亿的数据 每个数据不重复 同时是无序 不连续的 如何使用最小的空间来存储来这么多数据 同时又能快速的确认哪个数据有没有 直接存储10亿个数据 一个int的类型 可以最大可以表示 214748364
  • Esper

    Esper Esper 的网址是 http esper codehaus org 我们可以访问该网站首页 有几种典型的应用最需要 Esper 我摘录如下 Business process management and automation
  • ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小

    昨天遇到一个问题 ORA 22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小 去找问题时候 发现是sql查询语句的to char方法将clob类型转换成varchar类型出了问题 oracle中var