Oracle Text 學習筆記(11G)<一> :手工建立TEXT

viadeazhu發表於2009-12-15

    根據Oracle Text Application Developer’s Guide,我們首先需要建立一個測試用的使用者,然後Grant CTXAPP這個角色給它。

    如果這個角色不存在,會報:

SQL> grant CTXAPP to haozhu;
grant CTXAPP to haozhu
      *
ERROR at line 1:
ORA-01919: role 'CTXAPP' does not exist

    那麼如何建立這個角色和其他相關的物件呢?

    從10G開始,我們只需要執行這個SQL指令碼即可:$ORACLE_HOME/ctx/admin/catctx.sql

    這個指令碼有四個輸入引數:

define pass          = "&1"
define tbs           = "&2"
define ttbs          = "&3"
define dolock        = "&4"

    這四個引數其實是傳遞給在這個指令碼里呼叫的另一個指令碼的:

@@ctxsys.sql &pass &tbs &ttbs &dolock

    再開啟ctxsys.sql就可以看到這四個引數的意思:

create user ctxsys
identified by &pass default tablespace &tbs temporary tablespace &ttbs;

begin
  if ('&dolock' = 'LOCK') then
    execute immediate
      'alter user ctxsys password expire account lock';
  end if;
end;
/

    原來,&pass是CTXSYS user的密碼,&tbs是CTXSYS user的default tablespace,&ttbs是CTXSYS user的temporary tablespace;而&dolock只要不為'LOCK',那麼CTXSYS user就不會被鎖住。

    於是,執行如下命令安裝TEXT相關user,role,objects...

SQL> @?/ctx/admin/catctx.sql mypwd DATA TEMP NOLOCK

    接著我們按照文件建立一個簡單的測試:

CREATE 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.');

   然後建立TEXT index:

SQL> CREATE INDEX idx_docs ON docs(text)
  2    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
  3    ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');
CREATE INDEX idx_docs ON docs(text)
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10700: preference does not exist: CTXSYS.DEFAULT_LEXER
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366

    我們發現在建立index的時候出錯了,原因是我們並沒有執行這個指令碼:$ORACLE_HOME/ctx/admin/defaults/drdefus.sql

於是執行之:(注意,這個指令碼需要用CTXSYS使用者執行)
SQL> conn CTXSYS/mypwd

SQL> @?/ctx/admin/defaults/drdefus.sql

    在使用SYS賦權之後,再嘗試建立index:

SQL> CREATE INDEX idx_docs ON docs(text)
  2    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
  3    ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');
CREATE INDEX idx_docs ON docs(text)
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object

    發現,雖然我們前面建立TEXT index出錯,但是實際還是建立出來了一個index,只是他的user_indexes.DOMIDX_OPSTATUS='FAILED'。

SQL> l
  1  select INDEX_TYPE,STATUS,DOMIDX_STATUS,DOMIDX_OPSTATUS
  2* from user_indexes where INDEX_NAME='IDX_DOCS'
SQL> /

INDEX_TYPE STATUS  DOMIDX_STATUS                        DOMIDX_OPSTATUS
---------- ------- ------------------------------------ ------------------
DOMAIN     VALID   VALID                                FAILED

    而且這個TEXT index是無法被使用的:
SQL> SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0;
SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0
*
ERROR at line 1:
ORA-20000: Oracle Text error:
DRG-10599: column is not indexed

    所以我們只得drop重建。

SQL> drop index IDX_DOCS;

Index dropped.

SQL> CREATE INDEX idx_docs ON docs(text)
  2    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
  3    ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');

Index created.

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.
   

    最後按照文件,我們需要grant如下許可權給當前測試使用者。

GRANT RESOURCE, CONNECT, CTXAPP TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_CLS TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DDL TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DOC TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_QUERY TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_REPORT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_THES TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO TEXT_USER;

    綜上,在11G,手工建立ORACLE TEXT只需要如下三步:

1.

login as SYS:

@?/ctx/admin/catctx.sql mypwd DATA TEMP NOLOCK

2.

login as CATSYS user,run:
conn CTXSYS/mypwd

@?/ctx/admin/defaults/drdefus.sql

3.

create user TEXT_USER identified by TEXT_USER;
GRANT RESOURCE, CONNECT, CTXAPP TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_CLS TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DDL TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DOC TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_QUERY TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_REPORT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_THES TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO TEXT_USER;

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15415488/viewspace-622482/,如需轉載,請註明出處,否則將追究法律責任。

相關文章