ORACLE TEXT DATASTORE PREFERENCE(六)

转载 2012年03月31日 14:36:01

这篇文章继续讨论全文索引的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列进行查询。

相关文章推荐

ORACLE TEXT DATASTORE PREFERENCE(三)

这篇文章继续讨论全文索引的DATASTORE属性,介绍FILE_DATASTORE。 全文索引的对象一般是篇幅较大的文章,除了保存在数据库中的情况,另外一种常见的情况是以文件...

ORACLE TEXT DATASTORE PREFERENCE(四)

这篇文章继续讨论全文索引的DATASTORE属性,介绍URL_DATASTORE。 全文索引可以很方便的索引存储在INTERNET上的信息。在数据库中只需要存储需要索引的文章的URL...

ORACLE TEXT DATASTORE PREFERENCE(五)

这篇文章继续讨论全文索引的DATASTORE属性,介绍DETAIL_DATASTORE。 全文索引运行将被索引的数据存储在子表的多条记录中,下面看一个简单的例子: ...

ORACLE TEXT DATASTORE PREFERENCE(一)

Oracle Text功能十分强大,可是文档上给出的例子总是过于简单,而且可能是为了减少篇幅,不少例子只给出了其中关键的几步,但是对于初学者而言,阅读这样的例子很难对全文索引的创建有一个清晰的了解,而...

ORACLE TEXT FILTER PREFERENCE(二)

这篇文章继续介绍全文索引的FILTER属性,介绍Oracle的INSO_FILTER属性。 Oracle的全文索引除了可以支持文本文件外,还可以支持多种文档格式,对于...

ORACLE TEXT FILTER PREFERENCE(四)

这篇文章继续介绍全文索引的FILTER属性,介绍全文索引的PROCEDURE_FILTER属性。 对于一些复杂的需求,Oracle自定义的FILTER可能并不合适,O...

Oracle各种类型的运用|char、varchar、text和nchar、nvarchar、ntext的区别

Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示 如果还为了这个纠结,就直接看看后面的解说,做决定吧。 一般如果用到中...

在11g安装oracle text组件

[sql] view plaincopy "font-family: Arial, Helvetica, sans-serif; background-color: rg...
  • halou90
  • halou90
  • 2015年10月20日 10:16
  • 347

sql中的text字段如何导入oracle

这一段时间在把SQLSERVER迁移到ORASCLE,中间遇到了一系列的问题,通过查找资料和想办法,已经基本顺利解决,后面我会针对两个数据库迁移过程中我遇到的问题,整理汇总成一个个小问题,带着实例编码...
  • zxlyx
  • zxlyx
  • 2016年03月21日 22:09
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE TEXT DATASTORE PREFERENCE(六)
举报原因:
原因补充:

(最多只允许输入30个字)