首先long raw从Oracle 10g开始就不再被建议使用,建议用blob代替。同理,long建议用clob代替。
本文从运维角度实验long raw 和 blob两种数据类型在遇到dblink时的一些差异。
1.构造实验环境
在A库jingyu用户下创建两张表:
--LONG RAW
create table T_TEST_LONGRAW(
id number,
text long raw
);
--BLOB
create table T_TEST_BLOB(
id number,
text BLOB
);
然后使用plsql工具在两张表分别插入一条相同的数据:id=1;text=某个二进制小程序。
2.通过dblink查询
在B库通过dblink访问A库的两张表:
SELECT * FROM jingyu.T_TEST_LONGRAW@ttslink;
可以正常查询。
SELECT * FROM jingyu.T_TEST_BLOB@ttslink;
ERROR:
ORA-22992: cannot use LOB locators selected from remote tables
可以看到,long raw数据类型的表可以正常查询,blob数据类型的却会报错:ORA-22992。
3.通过dblink建表
如果想在B库依据A库的两张表创建测试表:
create table T_TEST_LONGRAW as select * from jingyu.T_TEST_LONGRAW@ttslink;
ORA-00997: illegal use of LONG datatype
create table T_TEST_BLOB as SELECT * FROM jingyu.T_TEST_BLOB@ttslink;
Table created.
可以看到,和步骤2中的测试不同,long raw数据类型的表无法被创建,报错:ORA-00997。
而blob数据类型的表却可以正常创建。
4.通过导出导入方式迁移
可以通过exp/imp或者expdp/impdp来导出导入对应的表:
--exp / imp
exp \'/ as sysdba\' file=longraw.dmp tables=jingyu.t_test_longraw log=longraw.log
imp \'/ as sysdba\' file=longraw.dmp full=y log=imp_longraw.log
exp \'/ as sysdba\' file=blob.dmp tables=jingyu.t_test_blob log=blob.log
imp \'/ as sysdba\' file=blob.dmp full=y log=imp_blob.log
--expdp / impdp
expdp \'/ as sysdba\' directory=XTTS dumpfile=longraw.dmp tables=jingyu.t_test_longraw,jingyu.t_test_blob logfile=longraw.log
impdp \'/ as sysdba\' directory=XTTS dumpfile=longraw.dmp full=y logfile=impdp_longraw.log
测试两种方式都可以正常导出导入。
总结:很简单的一个小实验,只是发现二者在dblink查询和依据dblink建表时,表现完全相反,蛮有趣的,特此记录一下。
另外,如果将实验中long raw和blob分别替换为long和clob去构造实验(插入的数据就是字符型),现象一样就不再赘述。