简单描述执行远端的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定位符的使用并没有跨越数据库,因此应该是可以得到结果的。