一。两种方法实现



blob到clob的转换

CREATE OR REPLACE FUNCTION blob2clob(v_blob_in IN BLOB) RETURN CLOB IS

  v_file_clob    CLOB;
v_file_size INTEGER := dbms_lob.lobmaxsize;
v_dest_offset INTEGER := 1;
v_src_offset INTEGER := 1;
v_blob_csid NUMBER := dbms_lob.default_csid;
v_lang_context NUMBER := dbms_lob.default_lang_ctx;
v_warning INTEGER;
v_length NUMBER; BEGIN dbms_lob.createtemporary(v_file_clob, TRUE); dbms_lob.converttoclob(v_file_clob,
v_blob_in,
v_file_size,
v_dest_offset,
v_src_offset,
v_blob_csid,
v_lang_context,
v_warning); RETURN v_file_clob; EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error found'); END;
/

CREATE OR REPLACE FUNCTION blob2clob(b BLOB) RETURN CLOB IS
c CLOB;
n NUMBER;
BEGIN
IF (b IS NULL) THEN
RETURN NULL;
END IF;
IF (length(b) = 0) THEN
RETURN empty_clob();
END IF;
dbms_lob.createtemporary(c, TRUE);
n := 1;
WHILE (n + 32767 <= length(b)) LOOP
dbms_lob.writeappend(c,
32767,
utl_raw.cast_to_varchar2(dbms_lob.substr(b,
32767,
n)));
n := n + 32767;
END LOOP;
dbms_lob.writeappend(c,
length(b) - n + 1,
utl_raw.cast_to_varchar2(dbms_lob.substr(b,
length(b) - n + 1,
n)));
RETURN c;
END;

会出现错误的地方

1.如果转换的blob文件长度为0则会报错   ORA-22994: 源偏移量超出源 LOB 的结尾

2. offset是in out参数,第一次传入后会被更改,如果是loop处理。应该将其值重新初始化。否则会报错ora-22994

如下

declare
v_cl clob;
dest_offset integer := 1;
src_offset integer := 1;
lang_context integer := dbms_lob.default_lang_ctx;
warning integer;
begin
for pr in (select pr_id, cmms_log
from purchase_requisition
where dbms_lob.getlength(cmms_log) > 0) loop
dbms_lob.createtemporary(lob_loc => v_cl, cache => false);
dbms_lob.convertToClob(dest_lob => v_cl,
src_blob => pr.cmms_log,
amount => dbms_lob.lobmaxsize,
dest_offset => dest_offset,
src_offset => src_offset,
blob_csid => dbms_lob.default_csid,
lang_context => lang_context,
warning => warning);
--dbms_output.put_line(warning);
update purchase_requisition
set cmms_log_clob = v_cl
where pr_id = pr.pr_id;
end loop;
--commit;
rollback;
exception
when others then
rollback;
dbms_output.put_line('更新出错:' || sqlcode || ';' || sqlerrm);
end;

正确应该是

declare
v_cl clob;
dest_offset integer := 1;
src_offset integer := 1;
lang_context integer := dbms_lob.default_lang_ctx;
warning integer;
begin
dbms_output.put_line('开始执行');
for pr in (select pr_id, cmms_log
from purchase_requisition
where dbms_lob.getlength(cmms_log) > 0) loop
dbms_output.put_line(pr.pr_id);
dest_offset := 1;
src_offset := 1;
lang_context := dbms_lob.default_lang_ctx
dbms_lob.createtemporary(lob_loc => v_cl, cache => false);
dbms_lob.convertToClob(dest_lob => v_cl,
src_blob => pr.cmms_log,
amount => dbms_lob.lobmaxsize,
dest_offset => dest_offset,
src_offset => src_offset,
blob_csid => dbms_lob.default_csid,
lang_context => lang_context,
warning => warning);
dbms_output.put_line(warning);
update purchase_requisition
set cmms_log_clob = v_cl
where pr_id = pr.pr_id;
end loop;
commit;
exception
when others then
rollback;
dbms_output.put_line('更新出错:' || sqlcode || ';' || sqlerrm);
end;

二。clob到blob的转换

同一,将函数换成 dbms_lob.converttoblob即可

blob2clob/clob2blob研究的更多相关文章

  1. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  2. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  3. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  4. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  5. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  6. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  7. 开源Word读写组件DocX 的深入研究和问题总结

    一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...

  8. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  9. Oracle研究专题:Oracle系统安装与配置

    最近开始研究Oracle数据库,盖因公司的系统要么Oracle要么是mysql吧. 作为一个IT工作者,没有碰过Oracle是一件很匪夷所思得事情. 想到过去几年,乃至接触IT行业开始就只有玩过sql ...

随机推荐

  1. [bzoj4828][Ah/Hnoi2017]大佬

    来自FallDream的博客,未经允许,请勿转载,谢谢. 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你 ...

  2. bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5541  Solved: 2228[Submit][Sta ...

  3. URL、网址、域名

    URL (Uniform Resource Locator)统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL ...

  4. Linux允许、禁止ping包

    默认情况下Linux系统允许ping,但是在某些情况下为了安全起见,我们都把服务器设置为禁ping  临时允许ping命令可使用命令: echo 0 >/proc/sys/net/ipv4/ic ...

  5. linux上安装fastdfs+nginx+ngin-module实践并解决多个异常篇

    为什么选择Nginx Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主 ...

  6. js动态加载js css文件,可以配置文件后辍,防止浏览器缓存

    js的引用,在浏览器,或微信上访问经常会遇到文件改了,但就是没有更新的问题,使用此函数可以轻松解决缓存问题只需要把js的引用方式改为使用此函数加载即可 源码如下: /** * js动态加载js css ...

  7. Android服务——Service

    服务 Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行 ...

  8. 安卓7.1 新特性Shortcut

    介绍 Shortcut 是谷歌在API25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按. 来看下效果吧: 是不是很赞? 那么请随本文一起学习吧 更新 新建项目 在你项目下 ...

  9. Bootstrap3 栅格系统-列偏移

    使用 .col-md-offset-* 类可以将列向右侧偏移.这些类实际是通过使用 * 选择器为当前元素增加了左侧的边距(margin).例如,.col-md-offset-4 类将 .col-md- ...

  10. iOS开源加密相册Agony的实现(一)

    简介 虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制.本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目).Wi ...