li
  当前位置:主页 > 性能优化 > 文章内容
li
通过数据库链执行TEXT操作的小bug
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:7  

通过数据库链执行TEXT操作的小bug


首先将错误重现一下:

SQL> CONN TEST/TEST@TESTDATA已连接。
SQL> CREATE TABLE T_TEXT (ID NUMBER, DOC VARCHAR2(100));

表已创建。

SQL> INSERT INTO T_TEXT VALUES (1, 'TEST REMOTE QUERY USER DATABASE LINK');

已创建 1 行。

SQL> CREATE INDEX IND_T_TEXT_DOC ON T_TEXT (DOC) INDEXTYPE IS CTXSYS.CONTEXT;

索引已创建。

SQL> SELECT * FROM T_TEXT WHERE CONTAINS(DOC, 'REMOTE') > 0;

ID DOC
---------- --------------------------------------------------------------
1 TEST REMOTE QUERY USER DATABASE LINK

SQL> CONN YANGTK/YANGTK@YTK已连接。
SQL> CREATE DATABASE LINK TESTDATA CONNECT TO TEST IDENTIFIED BY TEST USING 'TESTDATA';

数据库链接已创建。

SQL> SELECT * FROM T_TEXT@TESTDATA;

ID DOC
---------- --------------------------------------------------------------
1 TEST REMOTE QUERY USER DATABASE LINK

SQL> SELECT * FROM T_TEXT@TESTDATA WHERE CONTAINS(DOC, 'REMOTE') > 0;
SELECT * FROM T_TEXT@TESTDATA WHERE CONTAINS(DOC, 'REMOTE') > 0
*
1 行出现错误:
ORA-20000:

这里没有任何的进一步错误信息,ORA-20000还是用户自定义的错误。不过如果对通过数据库链进行的远端查询和TEXT索引结构有一定的了解,还是可以推断出错误的原因的。

SQL> DESC DR$IND_T_TEXT_DOC$I@TESTDATA名称 是否为空? 类型
------------------------------------------- -------- -------------
TOKEN_TEXT NOT NULL VARCHAR2(64)
TOKEN_TYPE NOT NULL NUMBER(3)
TOKEN_FIRST NOT NULL NUMBER(10)
TOKEN_LAST NOT NULL NUMBER(10)
TOKEN_COUNT NOT NULL NUMBER(10)
TOKEN_INFO BLOB

由于TEXT索引的记录表包含BLOB字段,而通过数据库链是无法返回远端LOB数据的,因此这个错误实际上应该是:

SQL> SELECT TOKEN_INFO FROM DR$IND_T_TEXT_DOC$I@TESTDATA;
SELECT TOKEN_INFO FROM DR$IND_T_TEXT_DOC$I@TESTDATA
*
1 行出现错误:
IXDBA.NET技术社区
ORA-22992:
无法使用从远程表选择的 LOB 定位器

知道了问题的产生,解决起来就相对简单了,由于关系的内容并不包括LOB内容,LOB内容只是由于查询,因此可以将CONTAINS操作在远端执行,而只将结果返回就可以了:

SQL> SELECT * FROM T_TEXT@TESTDATA WHERE CONTAINS@TESTDATA(DOC, 'REMOTE') > 0;

ID DOC
---------- -------------------------------------------------------------
1 TEST REMOTE QUERY USER DATABASE LINK

虽然Oracle认为这个问题不是bug,但是我认为这确实是个bug。不在于这个操作采用何种方法,关键之处在于Oracle的错误信息不全,一般用户很难判断错误的具体原因,而且很难查询到错误的产生原因。




  上一篇: 对远端表使用NVL2的bug   下一篇: oracle的执行计划居然出错!
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·对远端表使用NVL2的bug
·ORA-7445(qxuagtag)错误
·数据库链与同义词
·PUBLIC数据库链无法删除的问题(...
·调整本地时间的小bug
·远端数据库读取插入到另一个远端...
·远端数据库读取插入到另一个远端...
·能否通过数据库链传播游标
·数据库链的USING语句
·通过数据库链访问当前库
·oracle的执行计划居然出错!
·去掉DB_DOMAIN的方法
·建立支持查询重写的同名物化视图...
·物化视图查询重写的限制(一)
·物化视图查询重写的限制(二)
·物化视图日志没有清除
·物化视图日志如何避免系统时间变...
·物化视图的PCT特性(一)
·物化视图的PCT特性(二)
·物化视图导出导入可能导致物化视...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接