通過資料庫鏈執行TEXT操作的小bug

yangtingkun發表於2007-09-22

通過資料庫鏈執行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 行出現錯誤:
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的錯誤資訊不全,一般使用者很難判斷錯誤的具體原因,而且很難查詢到錯誤的產生原因。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69432/,如需轉載,請註明出處,否則將追究法律責任。

相關文章