通過資料庫鏈執行TEXT操作的小bug
通過資料庫鏈執行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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過資料庫鏈執行DML所需許可權資料庫
- 監控資料庫執行超過6s的操作資料庫
- 通過vmstat的簡單分析資料庫操作資料庫
- 小覷資料庫(SqlServer)查詢語句執行過程資料庫SQLServer
- 通過shell指令碼批量操作mysql資料庫指令碼MySql資料庫
- 11.2通過資料庫鏈呼叫10.2過程報錯資料庫
- 使用RMAN對PDB執行閃回資料庫操作資料庫
- 使用RMAN對CDB執行閃回資料庫操作資料庫
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- 資料庫open時檢查點執行的過程資料庫
- 通過資料庫檔案還原資料庫資料庫
- 通過現有的資料庫備份建立新的資料庫資料庫
- 通過資料庫鏈查詢會導致源和目標庫SCN同步資料庫
- 資料泵小bug
- mybatis(問題1):更改操作執行了,資料庫中卻未執行MyBatis資料庫
- 2.3 通過DBCA建立資料庫資料庫
- 通過duplicat恢復資料庫資料庫
- 通過資料庫鏈匯出遇到ORA-39126錯誤資料庫
- 金融行業如何通過資料鏈DNA實現自主化、全鏈路監控?行業
- Backup And Recovery User's Guide-使用閃回資料庫來回退資料庫-執行閃回資料庫操作GUIIDE資料庫
- 資料庫text型別的長度?資料庫型別
- Mysql資料庫是如何通過索引定位資料MySql資料庫索引
- 透過vmstat的簡單分析資料庫操作資料庫
- java通過jdbc連結資料庫JavaJDBC資料庫
- 【原創】通過資料字典操作刪除表的列
- 用RMAN執行DUPLICATE資料庫操作——RMAN使用者手冊資料庫
- Jtti:如何修復Oracle資料庫執行過程的問題JttiOracle資料庫
- python 操作 PostgreSQL 資料庫,執行緒並行修改 5w 條資料,效能優化PythonSQL資料庫執行緒並行優化
- 如何實現通過JAVA遠端執行重啟tomcat操作?JavaTomcat
- C#通過ODBC查詢HANA資料庫資料C#資料庫
- 對執行中的Mysql資料庫建立從庫MySql資料庫
- rman通過之前的incarnation恢復資料庫!資料庫
- 在執行OGG Extrac資料庫平臺,執行expdp,可能出現UDE-31623 bug資料庫
- 通過SQL Server資料庫映象保護虛擬資料庫ICSQLServer資料庫
- 通過binlog恢復mysql資料庫MySql資料庫
- 直接通過ADO操作Access資料庫資料庫
- 通過svn命令實現建立版本庫下的資料夾,並且可以操作訪問
- Shell指令碼中執行sql語句操作MySQL資料庫的幾個方法指令碼MySql資料庫