通過資料庫鏈執行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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過shell指令碼批量操作mysql資料庫指令碼MySql資料庫
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- mybatis(問題1):更改操作執行了,資料庫中卻未執行MyBatis資料庫
- 2.3 通過DBCA建立資料庫資料庫
- 通過duplicat恢復資料庫資料庫
- Jtti:如何修復Oracle資料庫執行過程的問題JttiOracle資料庫
- 資料庫text型別的長度?資料庫型別
- python 操作 PostgreSQL 資料庫,執行緒並行修改 5w 條資料,效能優化PythonSQL資料庫執行緒並行優化
- 如何實現通過JAVA遠端執行重啟tomcat操作?JavaTomcat
- Mysql資料庫是如何通過索引定位資料MySql資料庫索引
- Intellij IDEA 通過資料庫生成 POJOIntelliJIdea資料庫POJO
- [BUG反饋]資料庫備份bug資料庫
- 金融行業如何通過資料鏈DNA實現自主化、全鏈路監控?行業
- 通過svn命令實現建立版本庫下的資料夾,並且可以操作訪問
- 通過配置hibernate方言包+GBase8s jdbc實現clob、blob、text、byte大物件資料型別操作JDBC物件資料型別
- 通過SQL Server資料庫映象保護虛擬資料庫ICSQLServer資料庫
- 一個通過rms寫成的小型資料庫引擎,簡單的資料庫引擎資料庫
- Kettle資料庫資源庫連線執行示例資料庫
- [BUG反饋]onethink備份資料庫BUG資料庫
- mysql資料庫操作之------查的各種小細節MySql資料庫
- 資料庫的基本操作資料庫
- 資料庫操作資料庫
- 資料庫操作·資料庫
- Java的通過管道來實現執行緒通訊Java執行緒
- 區塊鏈vs傳統資料庫:分散式執行有何優勢?區塊鏈資料庫分散式
- 【SQL】Oracle資料庫通過job定期重建同步表資料SQLOracle資料庫
- Java的JDBC通過SSH Tunnel連線MySQL資料庫JavaJDBCMySql資料庫
- EBS:Oracle 資料庫執行慢SQLOracle資料庫SQL
- docker 安裝執行mysql資料庫DockerMySql資料庫
- 使用Spring Data JPA進行資料庫操作Spring資料庫
- Python 連線mysql資料庫進行操作PythonMySql資料庫
- 值得白嫖的資料庫常用操作語句彙總(資料庫、資料表、資料操作)資料庫
- 1.3.3. 通過SQL*Plus 連線資料庫SQL資料庫
- MySQL——通過EXPLAIN分析SQL的執行計劃MySqlAI
- 如何閱讀PG資料庫的執行計劃資料庫
- 【Falsk 使用資料庫】---- 資料庫基本操作資料庫
- 通過sysbench工具實現MySQL資料庫的效能測試MySql資料庫
- 通過 POI 將資料庫中的資料上傳至 OSS 物件儲存資料庫物件
- MySQL 資料庫操作MySql資料庫