oracle全文索引之datastore_6_NESTED_DATASTORE
這篇文章繼續討論全文索引的DATASTORE屬性,介紹NESTED_DATASTORE。[@more@]全文索引支援將資料儲存在多個列中或儲存在主子表中,全文索引還支援將資料儲存在巢狀表中。巢狀表的例子和主子表比較類似:
首先建立巢狀表物件,並建立巢狀表:
SQL> CREATE TYPE T_NESTED_REC AS OBJECT
2 (
3 LINE_NO NUMBER,
4 TEXT VARCHAR2(100)
5 );
6 /
型別已建立。
SQL> CREATE TYPE T_NESTED_TAB AS TABLE OF T_NESTED_REC;
2 /
型別已建立。
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, DOCS T_NESTED_TAB, OTHER VARCHAR2(1))
2 NESTED TABLE DOCS STORE AS NESTED_T;
表已建立。
插入資料一般有兩種方式,第一種使用直接將資料填入到巢狀表中的方法,當巢狀表包含的記錄不多時,採用這種方法給方便。
第二種先初始化行記錄,在一次將巢狀表的記錄增加到巢狀表中。
SQL> INSERT INTO T VALUES
2 (
3 1,
4 T_NESTED_TAB(T_NESTED_REC(1, 'THIS IS A NESTED TABLE EXAMPLE'),
5 T_NESTED_REC(2, 'THIS IS THE FIRST ROW IN TABLE')),
6 1
7 );
已建立 1 行。
SQL> INSERT INTO T VALUES (2, T_NESTED_TAB(), 1);
已建立 1 行。
SQL> INSERT INTO TABLE(SELECT DOCS FROM T WHERE ID = 2) VALUES (1, 'THIS THE SECOND WAY TO INSERT');
已建立 1 行。
SQL> INSERT INTO TABLE(SELECT DOCS FROM T WHERE ID = 2) VALUES (2, 'A ROW IN THE NESTED TABLE');
已建立 1 行。
SQL> INSERT INTO TABLE(SELECT DOCS FROM T WHERE ID = 2) VALUES (3, 'THIS GRAMMER IS VERY SPECIAL');
已建立 1 行。
SQL> COMMIT;
提交完成。
下面需要在建立一個NESTED_DATASTORE,並設定相應的引數。引數的設定和DETAIL_DATASTORE很類似。
NESTED_COLUMN 設定表中巢狀表列的列名;NESTED_TYPE設定巢狀表使用的物件名稱已經物件的使用者名稱;
NESTED_LONENO設定巢狀表中記錄的順序;NESTED_TEXT設定巢狀表中被索引列的名稱;BINARY設定是否在巢狀表
記錄後增加換行。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_NESTED', 'NESTED_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_COLUMN', 'DOCS');
4 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_TYPE', 'myuser.T_NESTED_TAB');
5 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_LINENO', 'LINE_NO');
6 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_TEXT', 'TEXT');
7 END;
8 /
PL/SQL 過程已成功完成。
在設定NESTED_TYPE時必須指定使用者名稱,否則在建立索引時會出錯如下:
DRG-12800: Attribute NESTED_TYPE must have owner name as prefix
最後就可以建立索引了,注意索引建立到OTHER列上,這是由於全文索引不能直接建立在巢狀表的所在列上。
SQL> CREATE INDEX IND_T_OTHER ON T(OTHER) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE TEST_NESTED');
索引已建立。
SQL> SELECT ID FROM T WHERE CONTAINS(OTHER, 'SECOND') > 0;
ID
----------
2
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE TEST_NESTED');
CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CONTEXT
*
ERROR 位於第 1 行:
ORA-22904: 巢狀表列的參考無效
最後需要說明的還是索引同步的問題,必須透過修改OTHER列來通知Oracle巢狀表的資料已經發生了變化。同樣的,查詢也必須對OTHER列進行查詢。
首先建立巢狀表物件,並建立巢狀表:
SQL> CREATE TYPE T_NESTED_REC AS OBJECT
2 (
3 LINE_NO NUMBER,
4 TEXT VARCHAR2(100)
5 );
6 /
型別已建立。
SQL> CREATE TYPE T_NESTED_TAB AS TABLE OF T_NESTED_REC;
2 /
型別已建立。
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, DOCS T_NESTED_TAB, OTHER VARCHAR2(1))
2 NESTED TABLE DOCS STORE AS NESTED_T;
表已建立。
插入資料一般有兩種方式,第一種使用直接將資料填入到巢狀表中的方法,當巢狀表包含的記錄不多時,採用這種方法給方便。
第二種先初始化行記錄,在一次將巢狀表的記錄增加到巢狀表中。
SQL> INSERT INTO T VALUES
2 (
3 1,
4 T_NESTED_TAB(T_NESTED_REC(1, 'THIS IS A NESTED TABLE EXAMPLE'),
5 T_NESTED_REC(2, 'THIS IS THE FIRST ROW IN TABLE')),
6 1
7 );
已建立 1 行。
SQL> INSERT INTO T VALUES (2, T_NESTED_TAB(), 1);
已建立 1 行。
SQL> INSERT INTO TABLE(SELECT DOCS FROM T WHERE ID = 2) VALUES (1, 'THIS THE SECOND WAY TO INSERT');
已建立 1 行。
SQL> INSERT INTO TABLE(SELECT DOCS FROM T WHERE ID = 2) VALUES (2, 'A ROW IN THE NESTED TABLE');
已建立 1 行。
SQL> INSERT INTO TABLE(SELECT DOCS FROM T WHERE ID = 2) VALUES (3, 'THIS GRAMMER IS VERY SPECIAL');
已建立 1 行。
SQL> COMMIT;
提交完成。
下面需要在建立一個NESTED_DATASTORE,並設定相應的引數。引數的設定和DETAIL_DATASTORE很類似。
NESTED_COLUMN 設定表中巢狀表列的列名;NESTED_TYPE設定巢狀表使用的物件名稱已經物件的使用者名稱;
NESTED_LONENO設定巢狀表中記錄的順序;NESTED_TEXT設定巢狀表中被索引列的名稱;BINARY設定是否在巢狀表
記錄後增加換行。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_NESTED', 'NESTED_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_COLUMN', 'DOCS');
4 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_TYPE', 'myuser.T_NESTED_TAB');
5 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_LINENO', 'LINE_NO');
6 CTX_DDL.SET_ATTRIBUTE('TEST_NESTED', 'NESTED_TEXT', 'TEXT');
7 END;
8 /
PL/SQL 過程已成功完成。
在設定NESTED_TYPE時必須指定使用者名稱,否則在建立索引時會出錯如下:
DRG-12800: Attribute NESTED_TYPE must have owner name as prefix
最後就可以建立索引了,注意索引建立到OTHER列上,這是由於全文索引不能直接建立在巢狀表的所在列上。
SQL> CREATE INDEX IND_T_OTHER ON T(OTHER) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE TEST_NESTED');
索引已建立。
SQL> SELECT ID FROM T WHERE CONTAINS(OTHER, 'SECOND') > 0;
ID
----------
2
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE TEST_NESTED');
CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CONTEXT
*
ERROR 位於第 1 行:
ORA-22904: 巢狀表列的參考無效
最後需要說明的還是索引同步的問題,必須透過修改OTHER列來通知Oracle巢狀表的資料已經發生了變化。同樣的,查詢也必須對OTHER列進行查詢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1022091/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle全文索引之STORAGE PREFERENCEOracle索引
- oracle全文索引之WORDLIST PREFERENCEOracle索引
- oracle全文索引之幾個關鍵表Oracle索引
- oracle全文索引之commit與DML操作Oracle索引MIT
- oracle全文索引之如何實現查詢Oracle索引
- oracle全文索引之STOPLIST_4_MULTI_STOPLISTOracle索引
- oracle全文索引之STOPLIST_3_DEFAULT_STOPLISTOracle索引
- oracle全文索引之STOPLIST_2_EMPTY_STOPLISTOracle索引
- oracle全文索引之STOPLIST_1_BASIC_STOPLISTOracle索引
- oracle全文索引之LEXER_4_MULTI_LEXEROracle索引
- oracle全文索引之LEXER_3_DEFAULT_LEXEROracle索引
- oracle全文索引之LEXER_2_CHINESE_LEXEROracle索引
- oracle全文索引之LEXER_1_BASIC_LEXEROracle索引
- oracle全文索引之FILTER_4_PROCEDURE_FILTEROracle索引Filter
- oracle全文索引之FILTER_3_FORMAT_COLUMNOracle索引FilterORM
- oracle全文索引之FILTER_1_NULL_FILTEROracle索引FilterNull
- oracle全文索引之datastore_5_detail_datastoreOracle索引ASTAI
- oracle全文索引之datastore_4_URL_DATASTOREOracle索引AST
- oracle全文索引之datastore_3_FILE_DATASTOREOracle索引AST
- oracle全文索引之datastore_1_DIRECT_DATASTOREOracle索引AST
- Oracle:全文索引Oracle索引
- oracle全文索引之配置全文檢索環境Oracle索引
- oracle 之全文索引表的分割槽交換案例Oracle索引
- oracle全文索引之About_INDEX_THEMES操作Oracle索引Index
- oracle全文索引之STOPLIST_ CTXCAT 索引_INDEX SETOracle索引Index
- oracle全文索引之datastore_2_MULTI_COLUMN_DATASTOREOracle索引AST
- Oracle的全文索引Oracle索引
- ZT oracle全文索引Oracle索引
- oracle全文索引之SECTION GROUP_6_PATH_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_5_AUTO_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_4_XML_SECTION_GROUPOracle索引XML
- oracle全文索引之SECTION GROUP_3_HTML_SECTION_GROUPOracle索引HTML
- oracle全文索引之SECTION GROUP_2_BASIC_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_1_NULL_SECTION_GROUPOracle索引Null
- oracle全文索引之FILTER_2_INSO_FILTEROracle索引Filter
- oracle 全文索引的配置Oracle索引
- MongoDB之索引(全文索引)MongoDB索引
- oracle全文索引之同步和優化索引做了什麼Oracle索引優化