utl_raw.cast_to_raw 如何处理大于4000字符
来源:网络收集 点击: 时间:2024-12-17准备测试环境
测试环境数据库是Oracle 11g,创建下面包含一个BLOG类型的表:
CREATE TABLE blob_test(id NUMBER, data BLOB)

Oracle数据类型长度限制
下面列出了Oracle常见数据类型及其在PL/SQL和SQL中的长度了限制,可以看出,在SQL中,varchar2的最大字节长度为4000,raw类型最大字节长度为2000。

重现utl_raw.cast_to_raw最大返回长度为4000限制问题
使用rpad函数构造一个长度为2001的字符串,如果utl_raw.cast_to_raw执行成功能地话,就会返回一个长度为4002的varchar2字符串,因为4002超出了varchar2的长度限制,所以就出现在错误。
insert into blob_test values(1,utl_raw.cast_to_raw(rpad(v,2001,v)))

使用匿名PL/SQL块突破4000的限制
从步骤2中的Oracle数据类型长度限制中可以知道,在PL/SQL中,varchar2的取大长度为32767,以这个长度构建一个varchar2字符串,用utl_raw.cast_to_raw转为raw类型。
declare r_data blob;begin r_data := utl_raw.cast_to_raw(rpad(v,32767,v)); insert into blob_test values(1,r_data);end;

确认上面步骤结果
执行下面SQL,可以看出插入的数据长度已经突破了4000的长度限制。

使用blob类型突破32767长度限制
在PL/SQL中,raw类型的长度限制是32767,如果要突破32767的长度限制,需要使用blob类型。下面代码将两个长度为32767的raw类型数据追加到blob变量中,然后再更新到表中。
declare
b_data blob;
r_temp raw(32767);
v_long_line varchar2(32767);
begin
v_long_line := RPAD(v, 32767,v);
r_temp := UTL_RAW.CAST_TO_RAW(v_long_line);
insert into blob_test values(2,empty_blob()) returning data into b_data;
dbms_lob.open(b_data,dbms_lob.lob_readwrite);
dbms_lob.writeappend(b_data,UTL_RAW.LENGTH(r_temp), r_temp);
dbms_lob.writeappend(b_data,UTL_RAW.LENGTH(r_temp) ,r_temp);
dbms_lob.close(LOB_LOC=b_data);
end;


本经验还会不断补充和完善,直到有一天我们发现这篇经验已无存在价值。
如果有朋友喜欢这篇经验,请为我点赞,后续还会为大家分享更多经验,有兴趣的亲们可以点击关注我。
ORACLECAST_TO_RAWUTL_RAW4000长度限制版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、文章链接:http://www.1haoku.cn/art_1227628.html