怎么创建Oracle Text用户
这篇文章主要讲解了"怎么创建Oracle Text用户",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么创建Oracle Text用户"吧!
1.创建Oracle Text用户
在创建Oracle Text索引和使用Oracle Text PL / SQL包之前,需要创建一个具有CTXAPP角色的用户。 该角色可以执行以下操作:
创建和删除Oracle Text索引首选项
使用Oracle Text PL / SQL软件包
--1.创建用户ctxdevCREATE USER ctxdev IDENTIFIED BY oracle default tablespace tbs_ctxdev;--2.授予角色给用户ctxdevGRANT RESOURCE, CONNECT, CTXAPP TO ctxdev;--3.授予CTX PL/SQL程序包的执行权限GRANT EXECUTE ON CTXSYS.CTX_CLS TO ctxdev;GRANT EXECUTE ON CTXSYS.CTX_DDL TO ctxdev;GRANT EXECUTE ON CTXSYS.CTX_DOC TO ctxdev;GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO ctxdev;GRANT EXECUTE ON CTXSYS.CTX_QUERY TO ctxdev;GRANT EXECUTE ON CTXSYS.CTX_REPORT TO ctxdev;GRANT EXECUTE ON CTXSYS.CTX_THES TO ctxdev;GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO ctxdev;--这些权限已经被授予给CTXAPP角色。 但是由于角色权限在PL/SQL过程中并不总是起作用,因此最安全的方式是将这些权限显式授予已经具有CTXAPP角色的用户。SQL> select role,privilege,table_name from role_tab_privs where role='CTXAPP' order by 2,3;ROLE PRIVILEGE TABLE_NAME-------------------- ---------------------------------------- --------------------CTXAPP DELETE DR$DICTIONARYCTXAPP EXECUTE CTX_ANLCTXAPP EXECUTE CTX_DDLCTXAPP EXECUTE CTX_ENTITYCTXAPP EXECUTE CTX_OUTPUTCTXAPP EXECUTE CTX_THESCTXAPP EXECUTE CTX_TREECTXAPP EXECUTE CTX_ULEXERCTXAPP EXECUTE DRIENTLCTXAPP EXECUTE DRITHSLCTXAPP INSERT DR$DICTIONARYCTXAPP INSERT DR$THSCTXAPP INSERT DR$THS_BTCTXAPP INSERT DR$THS_FPHRASECTXAPP INSERT DR$THS_PHRASECTXAPP SELECT DR$DICTIONARYCTXAPP UPDATE DR$DICTIONARYCTXAPP UPDATE DR$THS_PHRASE
如果数据库没有安装Oracle Text,则授予CTXAPP会报如下错误:
ORA-01919: role 'CTXAPP' does not exist
此时我们需要给数据库安装Oracle Text,测试环境是12c多租户,可以在PDB(注意要先在CDB中安装,不然下次重启数据库时,检测到CDB中没有Oracle Text,PDB会进入受限模式)中直接安装Oracle Text组件:
--方法1:执行catctx.sql脚本SQL> alter session set container=orcl;SQL> select COMP_ID,COMP_NAME,VERSION,STATUS,SCHEMA from user_registry where comp_id='CONTEXT';no rows selected--1.安装Oracle TextSQL> @?/ctx/admin/catctx.sql oracle SYSAUX TEMP NOLOCK --执行脚本+参数[ctxsys用户密码、用户默认永久sysaux、临时表空间temp、创建后用户是否锁定nolock |lock]SQL> col comp_name for a20;SQL> set linesize 200;SQL> col schema for a20;SQL> col status for a20;SQL> col version for a20;SQL> col comp_id for a20;SQL> select COMP_ID,COMP_NAME,VERSION,STATUS,SCHEMA from user_registry where comp_id='CONTEXT';COMP_ID COMP_NAME VERSION STATUS SCHEMA-------------------- -------------------- -------------------- -------------------- --------------------CONTEXT Oracle Text 12.2.0.1.0 VALID CTXSYS--2.安装默认语言首选项SQL> @?/ctx/admin/defaults/dr0defin.sql "AMERICAN";--方法2:DBCA silent install的方式--注意:在12.1.0.2或12.2.0.1中不支持通过DBCA将数据库组件(如Oracle Text)添加到单个PDB。 此功能将在18.1中添加。--语法:--非多组户环境:dbca -silent -configureDatabase -sourceDB-sysDBAUserName -sysDBAPassword ] -addDBOption ORACLE_TEXT--多租户环境:dbca -silent -configurePluggableDatabase -sourceDB -pdbName -sysDBAUserName SYS -sysDBAPassword -addDBOption ORACLE_TEXT--1.安装Oracle Textdbca -silent -configureDatabase -SourceDB lycdb -sysDBAUsername sys -sysDBAPassword oracle -addDBOption ORACLE_TEXT--2.安装默认语言首选项如果语言不是英语,则安装适当的特定于语言的默认首选项。$ORACLE_HOME/ctx/admin/defaults目录中包含为Oracle Text支持的每种语言创建特定于语言的默认首选项的脚本,例如英语(US),丹麦语(DK),荷兰语(NL),芬兰语(SF),法语 (F),德语(D),意大利语(IT),葡萄牙语(PT),西班牙语(E)和瑞典语(S)。 它们以drdefXX.sql的形式命名,其中XX是国际凭证代码。如果不知道国际凭证代码,也可以调用dr0defdp.sql(删除默认首选项)和dr0defin.sql(根据语言名称,安装首选项)一般英文用:AMERICAN,中文用SIMPLIFIED CHINESE例如,要手动安装德语默认首选项,请以CTXSYS身份登录sqlplus并运行以下语句:SQL> connect / sysdbaSQL> spool defprefs_install.logSQL> alter user ctxsys identified by ctxsys account unlock;SQL> connect ctxsys/ctxsysSQL> @?/ctx/admin/defaults/dr0defdp.sqlSQL> @?/ctx/admin/defaults/dr0defin.sql "SIMPLIFIED CHINESE";SQL> connect SYS/password as SYSDBASQL> alter user ctxsys account lock password expire;SQL> spool off
2.查询应用程序简单体验
在基本的文本查询应用程序中,用户输入查询词或短语,并期望该应用程序返回与查询最匹配的文档列表。 这样的应用程序涉及创建一个CONTEXT索引并使用CONTAINS对其进行查询。
通常,查询应用程序需要用户界面。 CONTEXT查询应用程序中提供了一个如何使用CONTEXT索引类型构建这样的查询应用程序的示例。
下面示例提供了基本的SQL语句,用于加载文本表,为文档建立索引以及查询索引。
--1.创建存放文本数据的表,并插入数据SQL> conn ctxdev/oracle@orclCREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200));INSERT INTO docs VALUES(1, 'California is a state in the US.');INSERT INTO docs VALUES(2, 'Paris is a city in France.');INSERT INTO docs VALUES(3, 'France is in Europe.');commit;--2.创建Context索引--通过在文本列上创建一个CONTEXT索引来为HTML文件建立索引,如下所示。 因为要为HTML编制索引,所以本示例使用NULL_FILTER首选项类型(不进行过滤)和HTML_SECTION_GROUP类型。 如果为PDF,Microsoft Word或其他格式的文档建立索引,请使用CTXSYS.AUTO_FILTER(默认设置)作为FILTER首选项。CREATE INDEX idx_docs ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP'); --3.查询表数据--查找包含单词France的所有文档:COLUMN text FORMAT a40;SQL> SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0; SCORE(1) ID TEXT---------- ---------- -------------------------------------------------------------------------------- 4 2 Paris is a city in France. 4 3 France is in Europe.--4.展示文档--在实际的应用程序中,可以显示所选文档并突出显示查询词。 Oracle Text使您可以使用CTX_DOC软件包标记文档。可以在SQL * Plus中使用匿名PL/SQL块演示HTML文档标记。 但是,在实际应用程序中,可以在浏览器中显示文档。此PL/SQL示例使用内存中的CTX_DOC.MARKUP版本突出显示文档3中的单词France。它分配了一个临时CLOB(字符大对象数据类型)来存储标记文本,并将其读回到标准输出。 然后在退出之前将CLOB释放:SET SERVEROUTPUT ON;DECLARE mklob CLOB; amt NUMBER := 40; line VARCHAR2(80);BEGIN CTX_DOC.MARKUP('idx_docs', '3', 'France', mklob); DBMS_LOB.READ(mklob, amt, 1, line); DBMS_OUTPUT.PUT_LINE(line); DBMS_LOB.FREETEMPORARY(mklob);END;/<<>> is in Europe.PL/SQL procedure successfully completed.--5.数据处理后同步索引--创建CONTEXT索引时,需要显式同步索引,以使用对文本表的任何插入,更新或删除来更新索引。可以使用CTX_DDL.SYNC_INDEX过程来执行此操作。--插入新数据INSERT INTO docs VALUES(4, 'Los Angeles is a city in California.');INSERT INTO docs VALUES(5, 'Mexico City is big.');commit;--提交后没能查询到新数据SQL> SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0; SCORE(1) ID TEXT---------- ---------- -------------------------------------------------------------------------------- 4 2 Paris is a city in France.--将索引与2 Mb的内存同步,然后重新运行查询: SQL> EXEC CTX_DDL.SYNC_INDEX('idx_docs', '2M');PL/SQL procedure successfully completed.--新数据可以正常查询SQL> SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0; SCORE(1) ID TEXT---------- ---------- -------------------------------------------------------------------------------- 4 2 Paris is a city in France. 4 4 Los Angeles is a city in California. 4 5 Mexico City is big.
3.目录应用程序简单体验
示例提供了基本的SQL语句,可为出售电子设备(例如相机和CD播放器)的拍卖网站创建目录索引。 每天都会添加新的库存,并且必须将项目描述,投标日期和价格一起存储。
对于混合查询,该应用程序需要良好的响应时间。 关键是确定用户经常搜索哪些列以创建合适的CTXCAT索引。 对此类索引的查询使用CATSEARCH运算符。
--1.创建一张库存表并插入数据conn ctxdev/oracle@orclCREATE TABLE auction(item_id NUMBER,title VARCHAR2(100),category_id NUMBER,price NUMBER,bid_close DATE);INSERT INTO AUCTION VALUES(1, 'NIKON CAMERA', 1, 400, '24-OCT-2002');INSERT INTO AUCTION VALUES(2, 'OLYMPUS CAMERA', 1, 300, '25-OCT-2002');INSERT INTO AUCTION VALUES(3, 'PENTAX CAMERA', 1, 200, '26-OCT-2002');INSERT INTO AUCTION VALUES(4, 'CANON CAMERA', 1, 250, '27-OCT-2002');commit;--2.确定可能要检索的条件。 在此示例中,确定所有查询都在title列中搜索商品说明,并且大多数查询都按price排序。 当使用CATSEARCH运算符时,请为文本列指定术语,并为结构化子句指定条件。--3.创建子索引以按价格排序--创建一个名为auction_set的索引集,并为price列添加一个子索引EXEC CTX_DDL.CREATE_INDEX_SET('auction_iset');EXEC CTX_DDL.ADD_INDEX('auction_iset','price');--4.创建CTXCAT索引CREATE INDEX auction_titlex ON AUCTION(title) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS ('index set auction_iset');--5.查询COLUMN title FORMAT a40;SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 'order by price')> 0;TITLE PRICE---------------------------------------- ----------PENTAX CAMERA 200CANON CAMERA 250OLYMPUS CAMERA 300NIKON CAMERA 400SQL> SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 'price <= 300')>0;TITLE PRICE---------------------------------------- ----------PENTAX CAMERA 200CANON CAMERA 250OLYMPUS CAMERA 300--6.更新表数据,CTXCAT索引会自动更新INSERT INTO AUCTION VALUES(5, 'FUJI CAMERA', 1, 350, '28-OCT-2002');INSERT INTO AUCTION VALUES(6, 'SONY CAMERA', 1, 310, '28-OCT-2002');commit;SQL> SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 'order by price')> 0;TITLE PRICE---------------------------------------- ----------PENTAX CAMERA 200CANON CAMERA 250OLYMPUS CAMERA 300SONY CAMERA 310FUJI CAMERA 350NIKON CAMERA 400
4.分类应用程序简单体验
分类应用程序的功能是根据文档内容执行某些操作。 这些操作可以包括为文档分配类别ID或将文档发送给用户。 结果是对文档进行分类。
--1.创建规则表conn ctxdev/oracle@orclCREATE TABLE queries ( query_id NUMBER, query_string VARCHAR2(80) );INSERT INTO queries VALUES (1, 'oracle');INSERT INTO queries VALUES (2, 'larry or ellison');INSERT INTO queries VALUES (3, 'oracle and text');INSERT INTO queries VALUES (4, 'market share');commit;--2.创建CTXRULE索引CREATE INDEX queryx ON queries(query_string) INDEXTYPE IS CTXSYS.CTXRULE;--3.在SELECT语句的WHERE子句中使用MATCHES运算符可将文档与查询匹配,然后对文档进行分类COLUMN query_string FORMAT a35;SELECT query_id,query_string FROM queries WHERE MATCHES(query_string, 'Oracle announced that its market share in databases increased over the last year.')>0; QUERY_ID QUERY_STRING---------- ----------------------------------- 4 market share 1 oracle
感谢各位的阅读,以上就是"怎么创建Oracle Text用户"的内容了,经过本文的学习后,相信大家对怎么创建Oracle Text用户这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!