一。两种方法实现



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. JS中怎样判断undefined(比较不错的方法)

    最近做项目碰到的问题.拿出来跟大家分享一下吧. 用servlet赋值给html页面文本框值后,用alert来弹出这个值.结果显示"undefined".所以我就自然的用这个值和字符 ...

  2. jquery easyui datagrid detailview groupview添加自定义视图view

    var myview = $.extend({}, $.fn.datagrid.defaults.view, { onAfterRender: function (target) { $.fn.dat ...

  3. bootstrap的模态框

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. java获取当前系统时间

    阿里巴巴推荐 Timestamp d = new Timestamp(System.currentTimeMillis()); 唯一的好处就是除了Timestamp,没有再新建什么了

  5. http协议无状态中的 "状态" 到底指的是什么?!

    引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解了:无状态的[状态]到底指的是什么?! 找了很多资料不仅没有发现有一针见血正面回答这个问题的, ...

  6. HashMap和ConcurrentHashMap实现原理及源码分析

    HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表, ...

  7. C++框架_之Qt的信号和槽的详解

    C++_之Qt的信号和槽的详解 1.概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal ...

  8. PHP 字符串变量

    PHP 字符串变量 字符串变量用于存储并处理文本. PHP 中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量 ...

  9. MongoDB 数据库引用

    MongoDB 引用有两种: 手动引用(Manual References) DBRefs DBRefs vs 手动引用 考虑这样的一个场景,我们在不同的集合中 (address_home, addr ...

  10. Rails关闭html_safe字符串过滤

    在某些情况下我希望html的文本中包含一些换行,因为html5产生换行的方法是插入 <br />所以我可以这么写: text = "hello world!<br /> ...