一。两种方法实现



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. hihocoder 1249(2015ACM/ICPC北京)

    题意: 给你一块正方形的土地,里面有矩形的草地,要求把土地分成两份,满足以下两个条件 1.两边的绿洲,左边>=右边,差值尽可能的小 2.在满足1的情况下分给左边的土地尽快能的多 而且绿洲不会出现 ...

  2. bzoj3685普通van Emde Boas树 线段树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MBSubmit: 1932  Solved: 626[Submit][Stat ...

  3. FJOI2017 RP++

    嗯如果算得没错大概十二小时之后就是省选二试了 这次考试貌似就在我们学校 虽然机子挺旧的基本没用过 平时训练都是在专门的机房 其实貌似压力不是很大  因为一试跪了TAT  那时候还是图样 T3按照惯例是 ...

  4. [bzoj4236]JOIOJI

    来自FallDream的博客,未经允许,请勿转载,谢谢. JOIOJI桑是JOI君的叔叔.“JOIOJI”这个名字是由“J.O.I”三个字母各两个构成的. 最近,JOIOJI桑有了一个孩子.JOIOJ ...

  5. 【完整项目】使用Scrapy模拟HTTP POST,获取完美名字

    1. 背景 最近有人委托我给小孩起个名字,说名字最好符合周易五行生克理论,然后给了我个网址,说像是这个网站中的八字测名,输入名字和生辰八字等信息,会给出来这个名字的分数和对未来人生的预测.当父母的自然 ...

  6. ORACLE 启动过程

    1 STARTUP NOMOUNT 1.读取环境变量下dbs目录下的参数文件(spfile/pfile) 查找参数文件的顺序如上面列表的,读取优先级: spfilechongshi.ora > ...

  7. cisco 的六种模式(cisco 系统)

  8. 3-学习GPRS_Air202(需要知道的关于Lua的一些基本的知识)

      http://www.cnblogs.com/yangfengwu/p/8948935.html 学东西一定是打破沙锅学到底,有问题就解决问题,不要试图去回避或者放弃解决当前的问题,如果总是回避或 ...

  9. 百度音乐flac 下载

    破解百度音乐白金会员 为了给Play Music上传标签齐全的正版的mp3,本屌翻遍网络苦思冥想.现在终于被我找到了破解之法——破解百度白金会员!破解之后可以直接从百度下载正版授权的320k文件,更可 ...

  10. 剑指架构师系列-Logstash分布式系统的日志监控

    Logstash主要做由三部署组成: Collect:数据输入 Enrich:数据加工,如过滤,改写等 Transport:数据输出 下面来安装一下: wget https://download.el ...