一。两种方法实现



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. [APIO2011]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------ A.[Apio2011]方格染色 ...

  2. Linux 脚本为什么会有#!

    我们在Linux系统终端编辑脚本时第一行通常这么写: #!/usr/bin/env python3 为什么要写这一行,起什么作用? 我们先看看不写这一行会出现什么?那么就会报下面的错误. #!/usr ...

  3. C++是跨平台的语言

    最开始学习Java时,老师就说Java是跨平台的,而c++不是,这里要纠正一下观点,c++也是跨平台的,只不过是实现跨平台的方式不同而已. 1.平台 一般我们把CPU处理器与操作系统的整体叫平台.不同 ...

  4. Elasticsearch 学习(二):安装和使用

    一.安装 安装 Elasticsearch 之前,需要先安装 Java,并配置好 Java 环境变量. 安装好 Java 环境后,进入 Elasticsearch 官网下载安装包. 解压安装包,进入解 ...

  5. Mysql 获取表的comment 字段

    查看获取表内字段注释: > show full columns from tablename; 或是  show full fields from tablename; 或是,在元数据的表里面看 ...

  6. JavaScript正则表达式模式匹配(4)——使用exec返回数组、捕获性分组和非捕获性分组、嵌套分组

    使用exec返回数组 var pattern=/^[a-z]+\s[0-9]{4}$/; var str='google 2012'; alert(pattern.exec(str)); //返回一个 ...

  7. AJAX 向后台发送带 List 集合的对象

    现有基类: public class School { int name; int address; List<Student> students = new ArrayList<S ...

  8. Linux shell查询ip归属地

    起因 有的时候写脚本需要能够在脚本中获取到ip的归属地,比如分析登录日志列出攻击者的相关信息等. 可以使用whois来查询ip的详细信息,但是whois并不是每台机器预装的,而且我想看中文的结果,所以 ...

  9. Codeforces Round #305 (Div. 2) A. Mike and Fax 暴力回文串

     A. Mike and Fax Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/548/pro ...

  10. let 和 const 命令

    let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a / ...