在Oracle SQL中提取长度大于4000的BLOB

时间:2019-05-16 07:38:16

标签: oracle plsql blob concat varchar2

我正在尝试使用以下查询提取BLOB变量。

select utl_raw.cast_to_varchar2(BLOB_VAR) from Dual

但是我遇到一个错误。

ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 4060, maximum: 2000)

如果varchar2的上限为4000,请问是否可以提取大于4000个字符的BLOB值。

我尝试使用concat选项

select concat(concat(utl_raw.cast_to_varchar2(dbms_lob.substr(BYTES_,2000,1)),utl_raw.cast_to_varchar2(dbms_lob.substr(BYTES_,2000,2001))),utl_raw.cast_to_varchar2(dbms_lob.substr(BYTES_,2000,4001)))from ACT

但是我得到这个错误

01489. 00000 -  result of string concatenation is too long```

Is there any way to get a longer string value?

2 个答案:

答案 0 :(得分:0)

您可以尝试创建函数,而不是过程。示例(摘自link

create or replace function F(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 :(得分:0)

我找到了一种使用to_clob函数获取输出的简单方法

select to_clob(BYTES_) from ACT