最新系统上线,有个已经上线的数据表中的某个字段需要将类型从varchar2修改为blog。对于数据表中要修改的字段已存在数据的情况,只能从找个中间字段中转一下。 整个操作过程,语句经过3遍修改,勉强可以使用,具体操作步骤如下:
第一次,执行脚本如下:
-- Add/modify columns
alter table tbl1 add field_new blob;
update tbl1 set field_new=field;
commit;
alter table tbl1 drop field;
-- Add/modify columns
alter table tbl1 rename column field_new to field;
当没有数据时,语句能够正确执行,但当该字段存在数据时,报错。
第二次,执行脚本如下:
从网帐找了个转换函数。函数如下:
CREATE OR REPLACE FUNCTION V2B(l_var IN varchar2) RETURN BLOB IS
c_clob CLOB := to_clob(l_var);
b_blob BLOB;
b_len number := dbms_lob.getlength(c_clob);
b_offset NUMBER := 1;
c_offset NUMBER := 1;
c_amount INTEGER := DBMS_LOB.lobmaxsize;
b_csid NUMBER := DBMS_LOB.default_csid;
lang_ctx INTEGER := DBMS_LOB.default_lang_ctx;
warning INTEGER;
BEGIN
if b_len > 0 then
DBMS_LOB.createtemporary(b_blob, TRUE);
DBMS_LOB.OPEN(b_blob, DBMS_LOB.lob_readwrite);
DBMS_LOB.convertToBlob(b_blob,
c_clob,
c_amount,
b_offset,
c_offset,
b_csid,
lang_ctx,
warning);
else
select empty_blob() into b_blob from dual;
end if;
RETURN b_blob;
END V2B;
/
-- Add/modify columns
alter table tbl1 add field_new blob;
update tbl1 set field_new=V2B(field);
commit;
alter table tbl1 drop field;
-- Add/modify columns
alter table tbl1 rename column field_new to field;
成功导入,但执行后,发现存在编码问题,原历史库保存该数据使用的UTF8编码与当前数据库默认编码不一致。第三步,加上了转换函数。
第三步,第二部内容不变,执行update时增加了convert函数,脚本如下:
update tbl1 set field_new=V2B((convert(field,'UTF8','ZHS16GBK'));
中文数据已基本完成转换,但中文标点符号,程序解析出来仍然是乱码,暂未找到处理方法,基本够用。
特此记录,有那个高手知道如何将中文标点也做转换,请告知一声,不胜感激。