今天用Oracle自带函数处理文本全角半角问题的时候,发现自带的函数居然不支持超过4000字clob大字段的处理,如果处理超过4000字的大文本的时候,Oracle会报错
这个时候呢,我想到了一个办法处理,就是用自定义函数分段处理文本,然后再组合起来返回,然后就可以处理大字段了,函数的第二个参数是可以选择是处理成全角还是处理成半角
MULTI--全角,SINGLE--半角
默认是半角
create or replace function trans_byte(p_data CLOB, p_type varchar2 default 'SINGLE') return clob deterministic is
/*大字段转全角半角函数*/
return_data clob;
base_sql clob;
data varchar2(4000);
i number:= dbms_lob.getlength(p_data);
d_size number :=1000;
trans_type varchar2(64);
begin
if(p_data is null or i = 0) then
return return_data;
end if;
trans_type :=upper(p_type);
if(i <= d_size) then
data:= p_data;
if('MULTI'= trans_type) then
select TO_MULTI_BYTE(data) into return_data from dual;
elsif('SINGLE'= trans_type) then
select TO_SINGLE_BYTE(data) into return_data from dual;
end if;
else
for loop_index in 1..ceil(i/d_size) loop
data:=dbms_lob.substr(p_data, d_size, (loop_index-1)*d_size+1);
if('MULTI'= trans_type) then
select return_data||TO_MULTI_BYTE(data) into return_data from dual;
elsif('SINGLE'= trans_type) then
select return_data||TO_SINGLE_BYTE(data) into return_data from dual;
end if;
end loop;
end if;
return return_data;
end;