orcle plsql 列类型 BLOB与CLOB的互转,RAW_blob转clob-程序员宅基地

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kingwenjie/article/details/80523292

智能推荐

数学建模十大算法02—插值与拟合(拉格朗日插值、三次样条插值、线性最小二乘法……)_三次插值与最小二乘法的关系-程序员宅基地

文章浏览阅读3.8k次,点赞8次,收藏57次。数据建模涉及到的插值与拟合方法。_三次插值与最小二乘法的关系

【Pytorch】model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别-程序员宅基地

文章浏览阅读1.7w次,点赞4次,收藏26次。model.train()启用 Batch Normalization 和 Dropout如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train()。model.train()是保证BN层能够用到每一批数据的均值和方差。对于Dropout,model.train()是随机取一部分网络连接来训练更新参数。model.eval()不启用 Batch Normalization 和 Dropout如果模型中有BN层(Batch Norm_model.train

用electron打包vue项目中的报错解决:_electron' 不是内部或外部命令,也不是可运行的程序 或批处理文件。-程序员宅基地

文章浏览阅读1w次。如何用electron打包vue项目,请参见我的另一篇文章:怎样用electron打包vue项目为桌面应用文件exe这里,也要提到实际项目中的问题,可能有同志的目录结构和内容有些许差别,就我刚刚遇到的问题来说,常见的问题的有几个问题,以及解决办法如下:1. 首先,一定要cd到项目的根目录(我这里是app)里面才能运行项目,再重新npm run build,不然的话很有可能出现 “ 系统找..._electron' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

poj1252 Euro Efficiency-程序员宅基地

文章浏览阅读215次。Euro EfficiencyTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 3936 Accepted: 1694DescriptionOn January 1st 2002, The Netherlands, and several other Eur_poj1252 euro efficiency

awstats CGI模式下动态生成页面缓慢的改进_awstats的页面如何修改-程序员宅基地

文章浏览阅读1.5k次。本文可以看做是 多server多站点情况下awstats日志分析 这篇文章的下篇,在使用过程中发现awstats在cgi模式下动态生成分析报告慢的问题 (尤其是有些站点每天两个多G的日志,查看起来简直是在考验人的耐性),本文分享一种改造这个缺点的思路。首先再来总结下awstats的处理过程以及查看分析结果的两种方式,来看官方版说明: Process logs: Building/updating_awstats的页面如何修改

ROS Qt5 librviz人机交互界面开发八(实现导航功能的完整显示)-全网首发_qt-ros 设置初始导航点-程序员宅基地

文章浏览阅读3.9k次,点赞14次,收藏39次。在上一篇教程我们已经实现导航的初始点和目标点的设置:ROS Qt5 librviz人机交互界面开发七(发布导航目标点和原点位置)-全网首发这一篇主要实现完整显示,在文章末尾有完整项目地址哦~一,显示效果设置初始点:设置目标点:二,核心代码如果看过前几篇博客,其实也就是添加几个图层:核心代码: //显示导航相关 void QRviz::Display_Navigate(bool......_qt-ros 设置初始导航点

随便推点

Servlet规范之应用生命周期事件_会话时间监听抛出异常-程序员宅基地

文章浏览阅读274次。Servlet规范之应用生命周期事件_会话时间监听抛出异常

mysql mssql 安装大小写,mssql 区分大小写的详细说明-程序员宅基地

文章浏览阅读120次。mssql 区分大小写的详细说明更新时间:2008年03月05日 21:41:49 作者:mssql区分大小写,没想到mysql也区分大小写。相关的文章稍后奉献给大家1.--区分大小写select*fromawherea='AbCdE'collateChinese_PRC_CS_AI--区分大小写select*fromawherea='abCdE'collate..._数据库安装时在哪里选择区分大小写和小写

git命令之git clone用法-程序员宅基地

文章浏览阅读5.2w次,点赞3次,收藏21次。2015年02月26日 13:59:11阅读数:81047转:http://blog.csdn.net/wangjia55/article/details/8818845在使用git来进行版本控制时,为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以GitURL可能以ssh://, http(s)://, git://,或是只是以一个用户名(git 会认为这是一个ssh 地址)为前辍.有些仓库可以通过不只一种协议来访问.._git clone

[STL] 标准二分算法模板 && lower_bound() upper_bound()代码解析_upper_bound模板-程序员宅基地

文章浏览阅读531次。一、摘要二分算法是经常使用的算法之一,熟练使用二分算法是一个程序员的基本素养。C++的<algorithm>头文件中存在lower_bound()和upper_bound()函数,支持在已排好序的容器中查找首个大于等于或者大于目标元素的迭代器位置。同时在有序容器类,例如set<>和map<>,中也存在类似功能的函数。熟练使用lower_bound()和upper_bound()函数可以方便地使用二分算法解决问题。本文基于< algorithm>,对lower_upper_bound模板

Codeforces Round #726 (Div. 2)-程序员宅基地

文章浏览阅读64次。文章目录Codeforces Round #726 (Div. 2)A. Arithmetic ArrayB. Bad BoyC. Challenging CliffsD. Deleting DivisorsE1. Erase and Extend (Easy Version)Codeforces Round #726 (Div. 2)A. Arithmetic Array题意:题解:代码:#include <bits/stdc++.h>#define int long long

Android Studio LayoutInspector 超时错误解决_android pad查看layout inspector异常-程序员宅基地

文章浏览阅读4.4k次。Android Studio Layout Inspector 错误处理There was a timeout error capturing the layout data from the device.The device may be too slow, the captured view may be too complex, or the view may contain animat..._android pad查看layout inspector异常

推荐文章

热门文章

相关标签