将 table 列数据类型从 blob 转换为原始

Convert table column data type from blob to raw

我有一个 table 设计的,

create table tbl ( 
  id number(5),
  data blob
);

发现第data列有 非常小的数据,可以存储在 raw(200):

所以新的 table 会是,

create table tbl ( 
  id number(5),
  data raw(200)
);

我如何才能将此 table 迁移到新设计 而不会丢失其中的数据

这个方法有点冗长,但如果您确定 data 列值的长度不超过 200,它就可以使用。

  1. Create a table to hold the contents of tbl temporarily
create table tbl_temp as select * from tbl;
Rem -- Ensure that tbl_temp contains all the contents
select * from tbl_temp;
Rem -- Double verify by subtracting the contents
select * from tbl minus select * from tbl_temp;
  1. Delete the contents in tbl
delete from tbl;
commit;
  1. Drop column data
alter table tbl drop column data;
  1. Create a column data with raw(200) type
alter table tbl add data raw(200);
  1. Select & insert from the temporary table created
insert into tbl select id, dbms_lob.substr(data,200,1) from tbl_temp;
commit;

我们正在使用 dbms_lob 包的 substr 方法,其中 returns raw 类型数据。因此,可以直接插入结果值。