在 Oracle 中提取长度大于 4000 的 BLOB SQL
Extract BLOB with length greater than 4000 in Oracle SQL
我正在尝试使用以下查询提取 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)
如果可以提取大于 4000 个字符的 BLOB 值,因为 varchar2 的限制是 4000,能否请您允许。
我尝试使用 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?
您可以尝试创建函数,而不是过程。示例(摘自 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;
/
然后在您需要的任何查询中使用该函数。
我找到了一种使用 to_clob 函数
获取输出的简单方法
select to_clob(BYTES_) from ACT
我正在尝试使用以下查询提取 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)
如果可以提取大于 4000 个字符的 BLOB 值,因为 varchar2 的限制是 4000,能否请您允许。
我尝试使用 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?
您可以尝试创建函数,而不是过程。示例(摘自 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;
/
然后在您需要的任何查询中使用该函数。
我找到了一种使用 to_clob 函数
获取输出的简单方法select to_clob(BYTES_) from ACT