oracle全文索引之datastore

2024年最新双摄像头的实时视频拼接及目标跟踪(一)_监控视频拼接实时(1),网络相关+C C++三方库的源码分析+数据结构与算法 opencv中采用了SURF,ORB进行特征点提取,如果装的是opencv2.0版本,则可以直接用SURF,如果是3.0版本,则需要下载相应的contrib库进行安装。原理不赘述,给出其实验结果对比和分析,原始图像1SURF特征点提取网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远! 阅读详情

 

Oracle Text功能十分强大,开始学习,主要参考 yangtingkun 的blog和文档进行。

第一步先搞清楚datastore的类型。


DATASTORE的类型如下:

DIRECT_DATASTORE
MULTI_COLUMN_DATASTORE
DETAIL_DATASTORE
FILE_DATASTORE
NESTED_DATASTORE
URL_DATASTORE
USER_DATASTORE

下面就各种类型进行测试,DIRECT_DATASTORE是最简单的,默认是就是用这种类型

Oracle的全文索引不要求被索引的文章一定存储在数据库中,不过如果文章存储在数据库的一列中,那么这种情

况建立索引是最简单的。

SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(4000));

表已创建。

SQL> INSERT INTO T VALUES (1, 'This is a sample for Oracle TEXT.');

已创建 1 行。

SQL> INSERT INTO T VALUES (2, 'This is a direct database store sample');

已创建 1 行。

SQL> COMMIT;

提交完成。

对于上面提到的DIRECT DATASTORE类型,下面三种创建索引方式是等价的:

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT;

索引已创建。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'DATABASE') > 0;

ID DOCS
---------- ----------------------------------------
2 This is a direct database store sample

SQL> DROP INDEX IND_T_DOCS;

索引已丢弃。

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.DEFAULT_DATASTORE');

索引已创建。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'DATABASE') > 0;

ID DOCS
---------- ----------------------------------------
2 This is a direct database store sample

SQL> DROP INDEX IND_T_DOCS;

索引已丢弃。

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.DIRECT_DATASTORE');

索引已创建。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'DATABASE') > 0;

ID DOCS
---------- ----------------------------------------
2 This is a direct database store sample

上面给出了一个最简单的全文索引的例子。

另外,由DR$开头的4张表是系统为了支持全文索引而自动生成的,不过这4张表的用处就不再这里讨论了。

SQL> SELECT * FROM TAB;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DR$IND_T_DOCS$I TABLE
DR$IND_T_DOCS$K TABLE
DR$IND_T_DOCS$N TABLE
DR$IND_T_DOCS$R TABLE

 

继续讨论全文索引的DATASTORE属性,介绍MULTI_COLUMN_DATASTORE。

如果被索引的文章是保存在数据库中,但是内容分布在多个列中,那么可以通过建立一个MULTI_COLUMN_DATASTORE来索引完整的文章:

SQL> CREATE TABLE T (ID NUMBER, DOC1 VARCHAR2(4000), DOC2 VARCHAR2(4000), DOC3 VARCHAR2(4000));

表已创建。

SQL> INSERT INTO T VALUES (1,
2 'The first paragraph of article in doc1.',
3 'The second partments is the doc2.',
4 'The last content is in the doc3.');

已创建 1 行。

SQL> INSERT INTO T VALUES (2,
2 'This example create a multi-column datastore preference',
3 'called test_multicol on three text columns',
4 'to be concatenated and indexed.');

已创建 1 行。

SQL> COMMIT;

提交完成。

下面创建索引,由于需要建立一个多列存储的全文索引,需要将多个列的列名作为参数传给Oracle。这个过程通过建立一个PREFERENCE,并设置属性来完成。

注意,下面的代码需要由CTXSYS用户执行,这点是文档上没有明确说明的。

SQL> CONN CTXSYS/CTXSYS@YANGTK
已连接。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_MULTICOL', 'MULTI_COLUMN_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_MULTICOL', 'COLUMNS', 'DOC1, DOC2, DOC3');
4 END;
5 /

PL/SQL 过程已成功完成。

下面在建立索引的时候指定DATASTORE参数为新建的TEST_MULTICOL参数:

SQL> CONN YANGTK/YANGTK@YANGTK
已连接。
SQL> CREATE INDEX IND_T_DOCS ON T (DOC1) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_MULTICOL');

索引已创建。

SQL> SELECT * FROM T WHERE CONTAINS(DOC1, 'CONTENT') > 0;

ID
----------
DOC1
---------------------------------------------------------------------------
DOC2
---------------------------------------------------------------------------
DOC3
---------------------------------------------------------------------------
1
The first paragraph of article in doc1.
The second partments is the doc2.
The last content is in the doc3.

通过查询的结果可以发现,这个多列的全文索引已经生效。

SQL> SELECT * FROM T WHERE CONTAINS(DOC2, 'CONTENT') > 0;
SELECT * FROM T WHERE CONTAINS(DOC2, 'CONTENT') > 0
*
ERROR 位于第 1 行:
ORA-20000: Oracle Text error:
DRG-10599: 列没有编制索引


SQL> CREATE INDEX IND_T_DOCS2 ON T (DOC2) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_MULTICOL');

索引已创建。

SQL> SELECT * FROM T WHERE CONTAINS(DOC2, 'CONTENT') > 0;

ID
----------
DOC1
----------------------------------------------------------------------------
DOC2
----------------------------------------------------------------------------
DOC3
----------------------------------------------------------------------------
1
The first paragraph of article in doc1.
The second partments is the doc2.
The last content is in the doc3.

通过上面的例子可以看出,对于多列的全文索引可以建立在多个列的任意一列上,但是,在查询时指定的列必须与索引时指定的列保持一致。

最后注意一点,只有索引指定的列发生修改,Oracle才会认为被索引数据发生了变化,仅仅修改其他列而没有修改索引列,即使同步索引也不会将修改同步到索引中。

SQL> DROP INDEX IND_T_DOCS2;

索引已丢弃。

SQL> SELECT * FROM CTX_USER_PENDING;

未选定行

SQL> UPDATE T SET COL3 = NULL WHERE ID = 1;
UPDATE T SET COL3 = NULL WHERE ID = 1
*
ERROR 位于第 1 行:
ORA-00904: "COL3": 无效的标识符


SQL> UPDATE T SET DOC3 = NULL WHERE ID = 1;

已更新 1 行。

SQL> SELECT * FROM CTX_USER_PENDING;

未选定行

SQL> UPDATE T SET DOC1 = NULL WHERE ID = 1;

已更新 1 行。

SQL> SELECT * FROM CTX_USER_PENDING;

PND_INDEX_NAME PND_PARTITION_NAME PND_ROWID PND_TIMEST
-------------------------- ------------------ ------------------ ----------
IND_T_DOCS AAAJXiAAMAAAAAGAAA 25-7月 -06

 

DATASTORE是FILE_DATASTORE的测试
[oracle@rhel140 ~]$ cat OUTPUT.TXT
ORACLE
oracle

[oracle@rhel140 LOG]$ cat EMPXT_000_2012_2680.LOG
SOURCE
ABC


SQL> conn myuser/myuser
Connected.
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));

Table created.

SQL> INSERT INTO T VALUES (1, 'OUTPUT.TXT');

1 row created.

SQL> commit;

Commit complete.


SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_FILE', 'PATH', '/home/oracle');
4 END;
5 /

PL/SQL procedure successfully completed.

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('DATASTORE TEST_FILE'); 2

Index created.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;

ID DOCS
---- --------------------
1 OUTPUT.TXT


需要注意的是在建立PREFERENCE的PATH属性时不能用客户端的目录和文件,一定是服务器端的目录和文件,
我用WINDOWS的目录时,在dr$index_error中就会出现下面的错误
SQL> select * from ctxsys.dr$index_error;

ERR_IDX_ID ERR_TIMES ERR_TEXTKEY
---------- --------- ------------------
ERR_TEXT
--------------------------------------------------------------------------------
1181 13-MAY-09 AAAM52AAEAAAAGkAAA
DRG-11513: unable to open or write to file /home/oracle/OUTPUT.TXT


SQL> INSERT INTO T VALUES (2, 'LOG/EMPXT_000_2012_2680.LOG');

1 row created.

SQL> commit;

Commit complete.

SQL> exec CTX_DDL.SYNC_INDEX('IND_T_DOCS');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

no rows selected

Oracle似乎只支持在FILE_DATASTORE中设置的路径中进行搜索,即使像上面这个例子中第2条记录,文档存储在

指定路径下的子目录中,这种情况也是没有办法进行索引的。

如果将文件位置从/home/oracle/LOG挪到/home/oracle目录下,则可以进行索引:

SQL> host mv /home/oracle/LOG/EMPXT_000_2012_2680.LOG /home/oracle

SQL> UPDATE T SET DOCS = 'EMPXT_000_2012_2680.LOG' WHERE ID = 2;

1 row updated.

SQL> COMMIT;

Commit complete.

SQL> exec CTX_DDL.SYNC_INDEX('IND_T_DOCS');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

ID
----------
DOCS
--------------------------------------------------------------------------------
2
EMPXT_000_2012_2680.LOG

测试还发现,只要将文件置于/home/oracle目录下即可,即使DOCS中存储的文件位置是子目录的信息。
下面不改变文件的存储位置,只是修改保存在数据库中的文档的地址:

SQL> UPDATE T SET DOCS = 'LOG/EMPXT_000_2012_2680.LOG' WHERE ID = 2;

1 row updated.

SQL> commit;

Commit complete.

SQL> exec CTX_DDL.SYNC_INDEX('IND_T_DOCS');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

ID
----------
DOCS
--------------------------------------------------------------------------------
2
LOG/EMPXT_000_2012_2680.LOG

看yangtingkun的实验是可以在一个PATH里指定多少目录,但我试了是不行的,不知是为什么

SQL> host mv /home/oracle/EMPXT_000_2012_2680.LOG /home/oracle/LOG/EMPXT_000_2012_2680.LOG

SQL> exec CTX_DDL.DROP_PREFERENCE('TEST_FILE');

PL/SQL procedure successfully completed.

SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE')
3 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE')


SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_FILE', 'PATH', '/home/oracle;/home/oracle/LOG');
4 end;
5 /

PL/SQL procedure successfully completed.

SQL> DROP INDEX IND_T_DOCS;

Index dropped.

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE TEST_FILE');

Index created.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;

no rows selected

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

no rows selected

表ctxsys.dr$index_error的错误如下,就是找不到目录

[oracle@rhel140 LOG]$ sqlplus ctxsys/ctxsys

SQL> select * from ctxsys.dr$index_error;

ERR_IDX_ID ERR_TIMES ERR_TEXTKEY
---------- --------- ------------------
ERR_TEXT
--------------------------------------------------------------------------------
1261 14-MAY-09 AAAM6dAAEAAAAG+AAA
DRG-11513: unable to open or write to file /home/oracle;/home/oracle/LOG/OUTPUT.
TXT

1261 14-MAY-09 AAAM6dAAEAAAAG/AAA
DRG-11513: unable to open or write to file /home/oracle;/home/oracle/LOG/EMPXT_0
00_2012_2680.LOG

 

 

 

全文索引可以很方便的索引存储在INTERNET上的信息。在数据库中只需要存储需要索引的文章的URL就可以了。

由于目前讨论的是DATASTORE属性,因此这个例子只索引HTML文章,对于其他需要使用FILTER属性的文章,在以后讨论。

SQL> show user;
USER is "MYUSER"
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));

Table created.

SQL> INSERT INTO T VALUES (1, 'http://yangtingkun.itpub.net/');

1 row created.

SQL> INSERT INTO T VALUES (2, 'http://www.itpub.net/');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> exec CTX_DDL.CREATE_PREFERENCE('TEST_URL', 'URL_DATASTORE');

PL/SQL procedure successfully completed.


SQL> exec ctx_ddl.set_attribute('TEST_URL','HTTP_PROXY','172.17.61.29:8002');

PL/SQL procedure successfully completed.

SQL> exec ctx_ddl.set_attribute('TEST_URL','Timeout','300');

PL/SQL procedure successfully completed.

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE TEST_URL');

Index created.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;

no rows selected


由于公司上网需要设置代理,发现设置了proxy服务器的IP地址和port不行,必须要指定为proxy服务的机器名和port.

如果需要代理才能连到INTERNET上,可以设置URL_DATASTORE的HTTP_PROXY等属性。URL_DATASTORE还包含很多的属性

Attribute Attribute Values
timeout
Specify the timeout in seconds. The valid range is 15 to 3600 seconds. The default is 30.

maxthreads
Specify the maximum number of threads that can be running simultaneously. Use a number between

1and 1024. The default is 8.

urlsize
Specify the maximum length of URL string in bytes. Use a number between 32 and 65535. The default

is 256.

maxurls
Specify maximum size of URL buffer. Use a number between 32 and 65535. The defaults is 256.

maxdocsize
Specify the maximum document size. Use a number between 256 and 2,147,483,647 bytes (2

gigabytes). The defaults is 2,000,000.

http_proxy
Specify the host name of http proxy server. Optionally specify port number with a colon in the

form hostname:port.

ftp_proxy
Specify the host name of ftp proxy server. Optionally specify port number with a colon in the

form hostname:port.

no_proxy
Specify the domain for no proxy server. Use a comma separated string of up to 16 domain names.



最后要说明的是,Oracle中仅仅保存被索引文档的URL地址,因此,如果文档本身发生了变化,Oracle是无法知道的,也无法去同步索引,这时必须通过修改索引列也就是URL地址列的方式来通知Oracle,被索引数据已经发生了变化。

 

 

 

这篇文章继续讨论全文索引的DATASTORE属性,介绍DETAIL_DATASTORE。

 

全文索引运行将被索引的数据存储在子表的多条记录中,下面看一个简单的例子:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, AUTHER VARCHAR2(30), TITLE VARCHAR2(30));

Table created.

SQL> CREATE TABLE T1 (ID NUMBER PRIMARY KEY, FID NUMBER, SEQ NUMBER, DOCS VARCHAR2(1000),
2 CONSTRAINT FK_T1_FID FOREIGN KEY (FID) REFERENCES T(ID))
3 ;

Table created.

SQL> INSERT INTO T VALUES (1, 'YTK', 'DETAIL DATASTORE');

1 row created.

SQL> INSERT INTO T1 VALUES (1, 1, 1, 'THIS IS A DETAIL DATASTORE EXAMPLE');

1 row created.

SQL> INSERT INTO T1 VALUES (2, 1, 2, 'THE CONTEXT IS STORE IN DETAIL TABLES');

1 row created.

SQL> INSERT INTO T VALUES (2, 'YTK', 'DETAIL DATASTORE DOC');

1 row created.

SQL> INSERT INTO T1 VALUES (3, 2, 1, 'USE THE DETAIL_DATASTORE TYPE FOR TEXT');

1 row created.

SQL> INSERT INTO T1 VALUES (4, 2, 2, 'STORED DEIRECTLY IN THE DATABASE IN DETAIL TABLES');

1 row created.

SQL> INSERT INTO T1 VALUES (5, 2, 3, 'WITH INDEXED TEXT COLUMN');

1 row created.

SQL> INSERT INTO T1 VALUES (6, 2, 4, 'LOCATED IN THE MASTER TABLE');

1 row created.

SQL> commit;

Commit complete.

SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_DETAIL', 'DETAIL_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_DETAIL', 'BINARY', 'TRUE');
4 CTX_DDL.SET_ATTRIBUTE('TEST_DETAIL', 'DETAIL_TABLE', 'T1');
5 CTX_DDL.SET_ATTRIBUTE('TEST_DETAIL', 'DETAIL_KEY', 'FID');
6 CTX_DDL.SET_ATTRIBUTE('TEST_DETAIL', 'DETAIL_LINENO', 'SEQ');
7 CTX_DDL.SET_ATTRIBUTE('TEST_DETAIL', 'DETAIL_TEXT', 'DOCS');
8 END;
9 /

PL/SQL procedure successfully completed.

SQL> CREATE INDEX IND_T_DOCS ON T (TITLE) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE TEST_DETAIL');

Index created.

SQL> SELECT * FROM T WHERE CONTAINS(TITLE, 'MASTER') > 0;

ID AUTHER TITLE
---------- ------------------------------ ------------------------------
2 YTK DETAIL DATASTORE DOC


同样,建立这种类型的索引必须要创建一个PREFERENCE,并设置主子表的一些属性。BINARY属性设置在明细记录

后是否添加换行。DETAIL_TABLE属性设置子表名称。DETAIL_KEY属性设置子表的外键列。DETAIL_LINENO设置子

表中文档的顺序。DETAIL_TEXT设置为索引的字段名称。

建立好PERFERENCE,并设置属性后,创建索引就很简单了,需要注意的是,由于真正被索引的列是子表上的列,

因此选择主表中那个列作为索引列并不重要。但是选定之后,以后的查询必须指明这个列。而且,如果子表中被

索引的文档内容发生变化,也必须通过修改索引列来使Oracle认识到被索引数据发生修改。

最后说明一点,由于使用了DETAIL_DATASTORE选项,主表中的被索引列的内容并没有包含在全文索引中。

SQL> SELECT * FROM T WHERE CONTAINS(TITLE, 'DOC') > 0;

no rows selected


各参数的说明如下:
Attribute Attribute Value
binary
Specify TRUE for Oracle to add no newline character after each detail row.

Specify FALSE for Oracle to add a newline character (n) after each detail row automatically.

detail_table
Specify name of detail table (OWNER.TABLE if necessary)

detail_key
Specify name of detail table foreign key column(s)

detail_lineno
Specify name of detail table sequence column.

detail_text
Specify name of detail table text column.

 

 

 

这篇文章继续讨论全文索引的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;

提交完成。

下面需要在建立一个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列进行查询。

全网详细解决Client does not support authentication protocol requested by server;consider upgrading Mysql c 全网详细解决1251 - Client does not support authentication protocol requested by server; consider upgrading Mysql client。 阅读详情

相关推荐

C51单片机驱动ILI9341彩屏实战:从Proteus仿真到绘制自定义图案(附完整代码)

本文详细介绍了使用C51单片机驱动ILI9341彩屏的完整实战流程。内容涵盖硬件连接、8080并行接口时序模拟、寄存器初始化、屏幕方向设置以及基本图形绘制原理,并重点讲解了如何在Proteus仿真环境中搭建电路、调试代码,最终实现自定义图案的显示。文章提供了完整的代码示例,为嵌入式开发学习者和复古硬件爱好者提供了一套可行的解决方案。

rnn9storyteller的博客 511

oracle全文索引 多列,oracle全文索引之datastore_2_MULTI_COLUMN_DATASTORE

继续讨论全文索引的DATASTORE属性,介绍MULTI_COLUMN_DATASTORE。如果被索引的文章是保存在数据库中,但是内容分布在多个列中,那么可以通过建立一个MULTI_COLUMN_DATASTORE来索引完整的文章:SQL> CREATE TABLE T (ID NUMBER, DOC1 VARCHAR2(4000), DOC2 VARCHAR2(4000), DOC3 VA...

weixin_42347629的博客 349

基于FME—三调篇—尖锐角及小缝隙处理

1 问题分析: 该功能实现在FME较为简单,相对ARCGIS模型构建器以及ARCGIS ENGINE,FME更适合无代码基础的人群。在三调内业数据处理要求中,尖锐角是不允许存在的。本文基于FME实现了对尖锐角的自动查询与消除以及自动处理在消除尖锐角过程中产生的缝隙,并进行了拓扑检查,实现自动化批量处理尖锐角的功能,提高工作效率。 2 总体思路: 2.1 实现功能分析: 1.找出小于指定角度的尖锐角...

qq_33315579的博客 9180

oracle全文索引之datastore_2_MULTI_COLUMN_DATASTORE

继续讨论全文索引的DATASTORE属性,介绍MULTI_COLUMN_DATASTORE。[@more@]如果被索引的文章是保存在数据库中,但是内容分布在多个列中,那么可以通过建立一个MULTI_COLUMN_DATASTOR...

ckomuo086028的博客 211

电子产品的老化测试有哪些类型?

因此,越来越多的人在寻找“已知合格的测试连接器”,即经过测试具有可靠性和有效性的测试连接器,可以在老化测试中制定优化方法。例如对于芯片来说,不同的封装有不同的老化测试座,QFP老化测试座,QFN老化测试座等。老化测试时,专用老化电路板上的元件将承受等于或高于其额定工作条件的压力,以消除任何在额定寿命之前过早失效的元件。静态老化:在此类系统中,将测试设备安装到老化板上的插座中,然后放入老化箱中,其中每隔12至24小时施加电源和高温。动态老化:在动态老化系统中,设备以老化速度设定的最大速率进行测试。

软件技术的专栏 1839

手把手教你用VSCode+MCUXpresso搭建i.MX RT1062开发环境(附RT-Thread Nano移植)

本文详细介绍了如何使用VSCode和MCUXpresso工具链搭建i.MX RT1062开发环境,包括工具链安装、工程配置、调试技巧以及RT-Thread Nano实时操作系统的移植方法。通过实战步骤和优化建议,帮助开发者快速掌握这款高性能Cortex-M7 MCU的开发流程,提升嵌入式开发效率。

weixin_27014595的博客 392

Oracl使用通配符搜索报DRG-10599: 列没有编制索引

使用通配符对某表进行查询时报如下错误 java.sql.SQLException: ORA-20000: Oracle Text error: DRG-10599: 列没有编制索引 如: select * from WFPROCESS where contains(description ,'baocuoma')>0 会报出以上错误 出现该错误后需要给该字段添加全文索引 ...

awen7916的专栏 3406

OBD诊断协议:OBDⅡ (SAE J1979) 和 OBDonUDS (SAE J1979-2) 和ZEV OBD技术架构的详细对比

摘要:文章对比了2025年最新OBD技术标准(SAEJ1979系列)的三大架构:传统OBD-II(已淘汰)、OBDonUDS(燃油/混动车)和ZEVOBD(新能源车)。核心发现:1)OBDonUDS与ZEVOBD共享UDS协议栈和DoIP通信标准,仅应用层数据(DID/DTC)不同;2)物理层统一为CAN+以太网,支持远程诊断和OTA;3)诊断工具需同时兼容J1979-2/3数据库。技术演进呈现"协议统一化、数据专用化"趋势,2027年后所有新车将强制采用新标准。

m0_56482679的博客 2388

【Oracle】通过DBlink访问别的库,使用全文索引报DR-10599的解决方法

远程链接别的数据库,使用全文索引报错问题解决

weixin_62685484的博客 1449

Couldn‘t find device with uuid 恢复LVM元数据 linux

Couldn't find device with uuid 恢复LVM元数据 linux欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使

m0_57559579的博客 7166

手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界

Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。

QQ_778132974的博客 382

oracle日期字段加索引,oracle的date类型字段不能使用索引问题一则

date字段上建立了索引,但是sql语句中使用的where条件如下:WHERE to_char(start_time,’yyyy-mm-hh hh24:mi:ss’) > ‘2009-08-01 00:00:00′ AND to_char(start_time,’yyyy-mm-hh hh24:mi:ss’) < '2009-08-31 23:59:59';因为使用了to_char函数...

weixin_35904873的博客 9223

【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆

Qwen3-Embedding:文本嵌入与重排序模型的技术解析与应用实践

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3090

oracle全文索引之datastore_6_NESTED_DATASTORE

这篇文章继续讨论全文索引的DATASTORE属性,介绍NESTED_DATASTORE。[@more@]全文索引支持将数据存储在多个列中或存储在主子表中,全文索引还支持将数据存储在嵌套表中。嵌套表的例子和主子表比较类似:首先创建...

ckomuo086028的博客 155

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

oracle全文索引之datastore_5_detail_datastore

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

ckomuo086028的博客 150

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

oracle全文索引之datastore_4_URL_DATASTORE

全文索引可以很方便的索引存储在INTERNET上的信息。在数据库中只需要存储需要索引的文章的URL就可以了。 由于目前讨论的是DATASTORE属性,因此这个例子只索引HTML文章,对于其他需要使用FILTER属性的文章,...

ckomuo086028的博客 166

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

oracle全文索引之datastore_3_FILE_DATASTORE

DATASTORE是FILE_DATASTORE的测试[oracle@rhel140 ~]$ cat OUTPUT.TXTORACLEoracle[oracle@rhel140 LOG]$ cat EMPXT_000_2012_2680.LOGSOURCEABCSQL> conn myuser/myuserConnected.SQL> CREATE

乐敏@技术驿站 620

oracle全文索引之datastore_1_DIRECT_DATASTORE

Oracle Text功能十分强大,开始学习,主要参考yangtingkun的blog和文档进行。第一步先搞清楚datastore的类型。DATASTORE的类型如下:DIRECT_DATASTOREMULTI_COLUMN_DATASTOREDETAIL_DATASTOREFILE_DATASTORENESTED_DATASTOREURL_DATA

乐敏@技术驿站 517

ORACLE TEXT DATASTORE PREFERENCE(一) 【ORACLE 全文索引】

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

cm333666的博客 215

ORACLE TEXT DATASTORE PREFERENCE(七)

这篇文章讨论全文索引DATASTORE的最后一种属性,介绍USER_DATASTORE。 Oracle功能的强大体现在很多方面,除了很多Oracle预定义好的接口以外,Oracle还提供了强大的自定义功能。USER_DATASTORE就是一个例子。如果上面几篇文章介绍的DATASTORE属性无法满足用户的要求,Oracle允许用户自定义一个过程,根据用户的需求来确定被索引的内容。

欧辰的专栏 892

ORACLE TEXT DATASTORE PREFERENCE(六)

这篇文章继续讨论全文索引的DATASTORE属性,介绍NESTED_DATASTORE。 全文索引支持将数据存储在多个列中或存储在主子表中,全文索引还支持将数据存储在嵌套表中。嵌套表的例子和主子表比较类似: 首先创建嵌套表对象,并建立嵌套表: SQL> CREATE TYPE T_NESTED_REC AS OBJECT  2 ( 3 LINE_NO NU

欧辰的专栏 802

ORACLE TEXT DATASTORE PREFERENCE(三)

这篇文章继续讨论全文索引的DATASTORE属性,介绍FILE_DATASTORE。 全文索引的对象一般是篇幅较大的文章,除了保存在数据库中的情况,另外一种常见的情况是以文件的形式保存在操作系统中。 Oracle的FILE_DATASTORE属性就可以索引这种类型的文档。这个例子主要是讨论DATASTORE属性,因此索引的文章都是文本格式的,对于其他类型需要设置FI

欧辰的专栏 1017

ORACLE TEXT DATASTORE PREFERENCE(二)

这篇文章继续讨论全文索引的DATASTORE属性,介绍MULTI_COLUMN_DATASTORE。 如果被索引的文章是保存在数据库中,但是内容分布在多个列中,那么可以通过建立一个MULTI_COLUMN_DATASTORE来索引完整的文章: SQL> CREATE TABLE T (ID NUMBER, DOC1 VARCHAR2(4000), DOC2 VARCHAR2

欧辰的专栏 1459

ORACLE TEXT DATASTORE PREFERENCE(四)

这篇文章继续讨论全文索引的DATASTORE属性,介绍URL_DATASTORE。 全文索引可以很方便的索引存储在INTERNET上的信息。在数据库中只需要存储需要索引的文章的URL就可以了。 由于目前讨论的是DATASTORE属性,因此这个例子只索引HTML文章,对于其他需要使用FILTER属性的文章,在以后讨论。 SQL> CREATE TABLE T (ID N

欧辰的专栏 914

全文索引方面

09年马上要结束了,BLOG每天更新又坚持了一年,目前文章总数1700多篇,其中纯技术文章将近1300篇。 我比较喜欢的一句话:十年磨一剑。以前提到过,坚持10年可能会比较困难,那么至少要坚持5年,到目前为止,BLOG更新已经...

ckawt40802的专栏 99
上一篇: oracle全文索引之datastore_3_FILE_DATASTORE
下一篇: oracle全文索引之FILTER
leminsky
博客等级 码龄22年 43粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值