1. 程式人生 > >實驗long raw 和 blob兩種資料型別遇到dblink的表現

實驗long raw 和 blob兩種資料型別遇到dblink的表現

首先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 [email protected];
可以正常查詢。

SELECT * FROM [email protected];
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 
[email protected]
; ORA-00997: illegal use of LONG datatype create table T_TEST_BLOB as SELECT * FROM [email protected]; 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去構造實驗(插入的資料就是字元型),現象一樣就不再贅述。