通常 BLOB 数据类型用于存储二进制对象,例如图像、视频等。但是,如果您的 BLOB 包含字符而不是二进制数据,则可以执行以下操作:
1.创建一个函数将BLOB返回到CLOB
create or replace function blob_to_char (b blob)
return clob is
v_clob clob;
n number;
v_start pls_integer := 1;
v_buffer pls_integer := 32767;
v_varchar varchar2(32767);
begin
if (b is null)
then
return null;
end if;
if (dbms_lob.getlength(b)=0)
then
return empty_clob();
end if;
dbms_lob.createtemporary(v_clob,true);
for i in 1..ceil(dbms_lob.getlength(b) / v_buffer)
loop
v_varchar := utl_raw.cast_to_varchar2(dbms_lob.substr(b, v_buffer, v_start));
dbms_lob.writeappend(v_clob, length(v_varchar), v_varchar);
v_start := v_start + v_buffer;
end loop;
RETURN v_clob;
end blob_to_char;
2.然后您可以在任何选择语句中使用该函数将您的blob恢复为字符串。显然,我假设 BLOB 实际上是一个字符串。
select column1, column2 , blob_to_char(your_blob_column) from your table ;
例子
SQL> create table t ( c1 number, c2 blob );
Table created.
SQL> insert into t values ( 1 , utl_raw.cast_to_raw('ppppppppppppppppppppppppppdoekkkkkkkkkkkkkkkkkkffj') ) ;
1 row created.
SQL> commit;
SQL> create or replace function blob_to_char
2 ( b blob)
return clob is
v_clob clob;
n number;
v_start pls_integer := 1;
v_buffer pls_integer := 32767;
v_varchar varchar2(327 3 67);
begin
if (b is null)
then
4 5 6 7 8 9 10 11 12 return null;
end if;
13 14 if (dbms_lob.getlength(b)=0)
then
return empty_clob();
15 16 17 end if;
dbms_lob.createtemporary(v_clob,true);
for i in 1..ceil(dbms_lob.getlength(b) / v_buffer)
loop
v_varchar := utl_raw.cast_to_varchar2(dbms_lob.substr(b, v_buffer, v_start));
18 19 20 21 22 dbms_lob.writeappend(v_clob, length(v_varchar), v_varchar);
v_start := v_start + v_buffer;
end loop;
RETURN v_clob;
23 24 25 26 end;
27 /
Function created.
SQL> select c1 , blob_to_char(c2) from t ;
C1
----------
BLOB_TO_CHAR(C2)
--------------------------------------------------------------------------------
1
ppppppppppppppppppppppppppdoekkkkkkkkkkkkkkkkkkffj
尽管如此,使用 BLOB 存储大量文本或字符串是一种非常糟糕的做法,因为您必须始终使用 CLOB,这正是它的用途。
更新
如果你的 BLOB 很大,尝试将输出增加
SQL> SET LONG 99999999
SQL> SELECT blob_to_char(blobcolum) from yourtable ;