簡單描述執行遠端的DBMS_LOB包的一些問題。
由於LOB的定位器無法跨資料庫鏈使用,因此訪問遠端LOB對象的時候,需要調用遠端的DBMS_LOB包中的過程,但是測試發現,即使調用遠端的DBMS_LOB包中的過程,仍然可能出現問題。
SQL> CREATE TABLE T_LOB (ID NUMBER, CONTENTS CLOB);
表已建立。
SQL> DECLARE
2 V_LOB CLOB;
3 BEGIN
4 INSERT INTO T_LOB
5 VALUES (1, EMPTY_CLOB())
6 RETURN CONTENTS INTO V_LOB;
7 FOR I IN 1..100 LOOP
8 DBMS_LOB.WRITEAPPEND(V_LOB, 32767, LPAD('A', 32767, 'A'));
9 END LOOP;
10 END;
11 /
PL/SQL過程已成功完成。
SQL> COMMIT;
提交完成。
SQL> SELECT DBMS_LOB.GETLENGTH(CONTENTS) FROM T_LOB;
DBMS_LOB.GETLENGTH(CONTENTS)
----------------------------
3276700
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database10gEnterpriseEdition Release10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
----------------------------------------------------------------------------
TESTZJ
本欄目更多精彩內容:http://www.bianceng.cn/database/Oracle/
如果在遠端資料庫中,通過資料庫鏈擷取這個LOB欄位的長度,直接通過DBMS_LOB.GETLENGTH肯定是行不通的:
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
----------------------------------------------------------------------------------
TEST08
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database10gEnterpriseEdition Release10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
SQL> CREATE DATABASE LINK TESTZJ
2 CONNECT TO TEST
3 IDENTIFIED BY TEST
4 USING '172.25.13.231/TESTZJ';
Database link created.
SQL> SELECT COUNT(*) FROM T_LOB@TESTZJ;
COUNT(*)
----------
1
SQL> SELECT DBMS_LOB.GETLENGTH(CONTENTS) FROM T_LOB@TESTZJ;
SELECT DBMS_LOB.GETLENGTH(CONTENTS) FROM T_LOB@TESTZJ
*
ERROR at line 1:
ORA-22992: cannot use LOB locators selected from remote tables
嘗試調用遠端的DBMS_LOB包,但是仍然會導致錯誤的產生:
SQL> SELECT DBMS_LOB.GETLENGTH@TESTZJ(CONTENTS) FROM T_LOB@TESTZJ;
SELECT DBMS_LOB.GETLENGTH@TESTZJ(CONTENTS) FROM T_LOB@TESTZJ
*
ERROR at line 1:
ORA-22992: cannot use LOB locators selected from remote tables
按道理來說,雖然T_LOB是遠端對象,但是DBMS_LOB調用的也是遠端過程,LOB定位器的使用並沒有跨越資料庫,因此應該是可以得到結果的。