ORACLE TEXT DATASTORE PREFERENCE(六)
這篇文章繼續討論全文索引的DATASTORE屬性,介紹NESTED_DATASTORE。
全文索引支持將數據存儲在多個列中或存儲在主子表中,全文索引還支持將數據存儲在嵌套表中。嵌套表的例子和主子表比較類似:
首先創建嵌套表對象,并建立嵌套表:
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;
提交完成。
下面需要在CTXSYS用戶下建立一個NESTED_DATASTORE,并設置相應的參數。參數的設置和DETAIL_DATASTORE很類似。
NESTED_COLUMN設置表中嵌套表列的列名;NESTED_TYPE設置嵌套表使用的對象名稱已經對象的用戶名;NESTED_LONENO設置嵌套表中記錄的順序;NESTED_TEXT設置嵌套表中被索引列的名稱;BINARY設置是否在嵌套表記錄后增加換行。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已連接。
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', 'YANGTK.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 過程已成功完成。
最后就可以創建索引了,注意索引創建到OTHER列上,這時由于全文索引不能直接建立在嵌套表的所在列上。
SQL> CONN YANGTK/YANGTK@YANGTK
已連接。
SQL> CREATE INDEX IND_T_OTHER ON T(OTHER) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.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 CTXSYS.TEST_NESTED');
CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
*
ERROR 位于第 1 行:
ORA-22904: 嵌套表列的參考無效
最后需要說明的還是索引同步的問題,必須通過修改OTHER列來通知Oracle嵌套表的數據已經發生了變化。同樣的,查詢也必須對OTHER列進行查詢。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的ORACLE TEXT DATASTORE PREFERENCE(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE TEXT DATASTOR
- 下一篇: ORACLE TEXT DATASTOR