oracle LOB 初探
小弟没日没夜地倒腾了两个星期oracle 7.3.4,8.0.5,8.0.6,8.1.5,对LOB也算是略知一二,特在此与各位共享,希望能起到个抛砖引玉的作用。
小弟要从7.3.4数据库(sun solaris,nls_language=english)的一个表中取数据,该表中有一long型的字段(纯文本),现要将其取到8.1.5(NT4+sp5,nls_language=siplified chinese)中,并且转成CLOB型。由于没有7.3.4的DBA权限,无法将其export,即使可以export也不行,因为要求是当7.3.4数据库的该表更新时,自动触发存储过程,适时写入8.1.5数据库。小弟水平有限,目前尚未成功。
1、建立database link将两台服务器相连——成功;
2、在8.1.5中执行create table 8.1.5 select * from 7.3.4或insert into 8.1.5 select * from 7.3.4或insert into 8.1.5 select to_lob(*) from 7.3.4——“非法操作long型”;
3、copy from 7.3.4 create 8.1.5 using select * from table_name——“非法的SQL语句”;
经过反复测试,不论你在8.1.5中存成什么类型(bfile,clob,blob,long,raw,etc)都无法将7.3.4的LONG直接取过来。
4、通过编存储过程:long(utl_raw.cast_to_varchar2)——>varchar2(dbms_lob.writeappend)——>clob——结果全是乱码,为什么?
5、通过BFILE转换:bfile(dbms_lob.loadfromfile)——>clob——结果全是乱码,为什么?bfile(dbms_lob.read)——>raw(utl_raw.cast_to_varchar2)——>varchar2(dbms_lob.writeappend)——>clob——结果正确,只可惜原系统没有电子文档,无法采用bfile型;
主要原因还是无法将7.3.4的long直接转到8.1.5中,我相信只要是在同一个数据库中,无论什么转换都可以实现。