2011年记 

目的:

遇到这种情况,mysql to oracle时 text类型转到oracle自动变为BLOB,但这些字段只需要CLOB.所以打算把BLOB转为CLOB。(在sqlplu或plsql中完成)

解决办法

例:表gw_gift 字段description BLOB

1、增加字段description1 CLOB

2、把BLOB列数据写入CLOB

update gw_gift p set p.description1=utl_raw.cast_to_varchar2(p.description) where DBMS_LOB.GETLENGTH(DESCRIPTION)>2000;

commit;

注:utl_raw.cast_to_varchar2() 转换BLOB为RAW,再转入CLOB

DBMS_LOB.GETLENGTH()取得BLOB内容的长度。因为BLOB转RAW时超过2000会报“ORA-22835:缓冲区对于BLOB到RAW转换而言太小(实际:4366,最大2000)”

当遇到BLOB值大于2000时的解决办法:

一、如果大于2000的行不多,先转换小于2000的,再手工修改大于2000的。

二、利用function函数完成

1.新建BLOB to CLOB的function

CREATE OR REPLACE FUNCTION blob_to_clob (blob_in IN BLOB) RETURN CLOB
   AS
    v_clob    CLOB;
    v_varchar VARCHAR2(32767);
    v_start PLS_INTEGER := 1;
    v_buffer PLS_INTEGER := 32767;
    tmp_num number;
    BEGIN
        DBMS_LOB.CREATETEMPORARY(v_clob, TRUE); 
        tmp_num := CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer);
        if tmp_num > 0 then --防止传入的BLOB为NULL或长度为0时引发错误
          FOR i IN 1..tmp_num
          LOOP
            v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start)); 
            DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
             v_start := v_start + v_buffer;
          END LOOP;
        end if; 
        RETURN v_clob; 
    END blob_to_clob;

2.调用blob_to_clob 来完成转换

update gs_gift p set p.description1=blob_to_clob(p.description);
 commit;

3、删除description列,修改CLOB的description1 列名为description

完成!

列:

--------------------------------

CREATE OR REPLACE FUNCTION blob_to_clob (blob_in IN BLOB) RETURN CLOB
   AS
    v_clob    CLOB;
    v_varchar VARCHAR2(32767);
    v_start PLS_INTEGER := 1;
    v_buffer PLS_INTEGER := 32767;
    tmp_num number;
    BEGIN
        DBMS_LOB.CREATETEMPORARY(v_clob, TRUE); 
        tmp_num := CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer);
        if tmp_num > 0 then --防止传入的BLOB为NULL或长度为0时引发错误
          FOR i IN 1..tmp_num
          LOOP
            v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start)); 
            DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
             v_start := v_start + v_buffer;
          END LOOP;
        end if; 
        RETURN v_clob; 
    END blob_to_clob;
commit;

--GS_AUTHORIZATIONAPPLY
ALTER   TABLE   GS_AUTHORIZATIONAPPLY   ADD   AUDITREMARK1 CLOB;--新增
update GS_AUTHORIZATIONAPPLY g set g.AUDITREMARK1=blob_to_clob(g.AUDITREMARK);--转换
commit;
alter table GS_AUTHORIZATIONAPPLY drop column AUDITREMARK;--删除
alter table GS_AUTHORIZATIONAPPLY rename column AUDITREMARK1 to AUDITREMARK;--重命名列

--GS_CUSTOMER
ALTER   TABLE   GS_CUSTOMER   ADD   INTRO1 CLOB;--新增
update GS_CUSTOMER g set g.INTRO1=blob_to_clob(g.INTRO);--转换
commit;
alter table GS_CUSTOMER drop column INTRO;--删除
alter table GS_CUSTOMER rename column INTRO1 to INTRO;--重命名列

--GS_CUSTOMERCONTACTTASK
ALTER   TABLE   GS_CUSTOMERCONTACTTASK   ADD   INTRO1 CLOB;--新增
update GS_CUSTOMERCONTACTTASK g set g.INTRO1=blob_to_clob(g.INTRO);--转换
commit;
alter table GS_CUSTOMERCONTACTTASK drop column INTRO;--删除
alter table GS_CUSTOMERCONTACTTASK rename column INTRO1 to INTRO;--重命名列

--GS_CUSTOMERVISITRECORD
ALTER   TABLE   GS_CUSTOMERVISITRECORD   ADD   INTRO1 CLOB;--新增
update GS_CUSTOMERVISITRECORD g set g.INTRO1=blob_to_clob(g.INTRO);--转换
commit;
alter table GS_CUSTOMERVISITRECORD drop column INTRO;--删除
alter table GS_CUSTOMERVISITRECORD rename column INTRO1 to INTRO;--重命名列

--GS_DIARY
ALTER   TABLE   GS_DIARY   ADD   CONTENT1 CLOB;--新增
update GS_DIARY g set g.CONTENT1=blob_to_clob(g.CONTENT);--转换
commit;
alter table GS_DIARY drop column CONTENT;--删除
alter table GS_DIARY rename column CONTENT1 to CONTENT;--重命名列

--gs_gift
ALTER   TABLE   gs_gift   ADD   description1 CLOB;--新增
update gs_gift g set g.description1=blob_to_clob(g.description);--转换
commit;
alter table gs_gift drop column description;--删除
alter table gs_gift rename column description1 to description;--重命名列

--gw_gift
ALTER   TABLE   gw_gift   ADD   description1 CLOB;--新增
update gw_gift g set g.description1=blob_to_clob(g.description);--转换
commit;
alter table gw_gift drop column description;--删除
alter table gw_gift rename column description1 to description;--重命名列

drop function blob_to_clob;--删除function

---------------------------------------------

orcle plsql 列类型 BLOB与CLOB的互转,RAW相关推荐

  1. oracle创建带blob字段的表,ORACLE 还有BLOB及CLOB等类型字段的表的导出导入

    当ORACLE数据库导出的时候,发现有些表有BLOB和CLOB类型字段的时候,利用一般的导出方法是无法导出的会报错,其原因是sql无法生成这两种类型字段,这个时候,最好用的方法就是plsql自带的导出 ...

  2. 达梦数据库“-2685:试图在blob或者clob列上排序或比较“

    描述 在DM8上对大字段类型列进行排序.分组等操作时,会报错-2685:试图在blob或者clob列上排序或比较. 示例演示 创建测试表并插入数据 对大字段类型列进行排序和分组操作 SQL语句如下: ...

  3. Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型

    http://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html 本文讲解了在 Spring 中处理 LOB 数据的原理和方法, ...

  4. oracle数据库的blob和clob类型,是什么意思和区别

    BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的的,或者可以直接用LOB字段代替这两个.但是为了更好的管理ORACLE数据库,通常像图 ...

  5. 5.4.1 映射Blob和Clob类型@Lob

    通常,可以在数据库中保存诸如图片,长文本类型的数据.这种类型的数据一般是保存成Blob和Clob类型. 这两种类型的数据可以通过使用@Lob属性来标注.例如CustomerEO实体增加了一个属性por ...

  6. Oracle中Blob和Clob类型的区别

    BLOB是用来存储二进制数据的,而CLOB是用来存储文字的. 1.BLOB     BLOB全称为二进制大型对象(Binary   Large   Object).它用于存储数据库中的大型二进制对象. ...

  7. mysql 读取clob数据类型_谈谈有关各数据库Blob、Clob类型字段的读取、保存更新

    经常有人谈到Blob类型字段的读写问题,我也来说两句. 最近在写一些东西,对常用数据库的数据类型.函数等作了一些比较,也写了许多了的测试代码,以下是我测试的结果: 测试数据库: MS Sql Serv ...

  8. mysql数据库clob类型数据_JDBC读写MySQL的BLOB和CLOB类型数据(带代码)

    JDBC对LOB的读写 在JDBC中提供了java.sql.Blob和java.sql.Clob两个类分别代表BLOB和CLOB数据 •BLOB(Binary Large Object):用于存储大量 ...

  9. Oracle中表列由VARCHAR2类型改成CLOB

    情景 原来表中的列定义成VARCHAR2类型,众所周知,VARCHAR2类型最大支持长度为4000.如果由于业务需要,想把此列转换为CLOB类型,在Oracle中直接通过ALTER语句转换是行不通的. ...

最新文章

  1. hdu 4263(有限制的生成树)
  2. NeHe OpenGL第二十四课:扩展
  3. 【正一专栏】老夫老妻了,你还会说我爱你吗?
  4. java 数据类型 存储_Java数据类型以及存储
  5. redhat6.下安装配置hadoop环境--单实例版本
  6. 程序员法律考试笔记(1)-民法基本规定与调整范围
  7. TortoiseSVN 菜单详解
  8. Visual Studio 2012 C# ActiveX控件开发总结
  9. java 像素级碰撞检测,» 像素级碰撞检测类
  10. python+requests进行get、post方法接口测试
  11. 测试和维修电脑软件,常用的电脑维修软件有哪些?
  12. 游戏开发之编程语言5选和游戏引擎3选
  13. Scala 安装教程
  14. web浏览器下载文件没响应不报错
  15. python四分位数_四分位数计算过程
  16. 良心!苹果启动 MacBook Pro 电池更换计划
  17. 切边压力机行业调研报告 - 市场现状分析与发展前景预测
  18. matlab分析具体问题论文,关于Matlab论文范文写作 Matlab在化探异常解释评价中应用相关论文写作资料...
  19. 20170315学习笔记-前端
  20. STM32H743内部所有SRAM的使用

热门文章

  1. C# 操作word表格合并单元格
  2. 浮点数 C语言 IEEE754
  3. 国际海运出口的操作流程是怎样的?
  4. mac下面安装破解版UltraEdit
  5. 基于工业树莓派的AGV机器小车控制系统
  6. 小米 红米NOTE5 解BL锁教程 申请BootLoader解锁教程
  7. 视频剪辑如何快速制作图文视频
  8. 融合通讯四大关键词和三个应用场景
  9. 最佳Android系统 | 运行在台式机、笔记本手提电脑的安卓Android系统
  10. 教你怎样选配电脑硬件