我有一个包含blob列的表。blob数据是长度为8的char类型,我想将它转换为整个表的8位长度的varchar (通过重新定义表结构或强制转换)。但是,我不想丢失之前存储在其中的任何数据。我正在使用oracle-sql-developer。


我想永久地更改数据类型(不仅仅是select语句)。任何帮助都是非常感谢的。
发布于 2021-08-20 08:30:32
考虑到BLOB不应用于此目的,一种方法是创建一个函数将blob转换为clob (这是一个字符串)。
为了能够将字符串插入BLOB列,我需要使用utl_cast_to_raw
让我来给你展示
SQL> create table test_blob ( c1 number, c2 blob ) ;
Table created.
SQL> insert into test_blob values ( 1 , utl_cast_to_raw('AAAABBBB') ) ;
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from test_blob ;
C1
----------
C2
--------------------------------------------------------------------------------
1
4141414142424242现在,我们创建一个函数将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;
/一旦我们有了函数,让我们来检查一下
SQL> select blob_to_char(c2) from test_blob ;
BLOB_TO_CHAR(C2)
--------------------------------------------------------------------------------
AAAABBBB现在,我们添加一个新列,并使用blob源列将新列更新为varchar
SQL> alter table test_blob add c3 varchar2(8) ;
Table altered.
SQL> update test_blob set c3 = blob_to_char(c2) ;
1 row updated.
SQL> select * from test_blob ;
C1
----------
C2
--------------------------------------------------------------------------------
C3
----------------
1
4141414142424242
AAAABBBBhttps://stackoverflow.com/questions/68856073
复制相似问题