實驗long raw 和 blob兩種資料型別遇到dblink的表現
阿新 • • 發佈:2018-12-20
首先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去構造實驗(插入的資料就是字元型),現象一樣就不再贅述。