- Este tópico contém 7 respostas, 2 vozes e foi atualizado pela última vez 16 anos atrás por
rwarstat.
-
AutorPosts
-
25 de novembro de 2009 às 4:02 pm #91124
rwarstat
ParticipantePessoal,
Estou tentando criar um índice do tipo CTXCAT.
Para isso executei o script ctxsys.sql que em no Oracle e dei permissão de execução para o meu usário na package CTX_DDL.Para criar o índice estou usando os seguintes comando no schema dono da tabela
beginctx_ddl.create_index_set('ix_nm_paciente');
ctx_ddl.add_index('ix_nm_paciente','nm_paciente');end;
CREATE INDEX ix_nm_paciente ON paciente(nm_paciente) INDEXTYPE IS CTXCAT PARAMETERS ('index set ix_nm_paciente');
Quando excuto o comando CREATE INDEX dá o erro
ORA-29833: indextype does not exist
[]´s
Roberto25 de novembro de 2009 às 4:48 pm #91133rwarstat
ParticipanteEstava verificnado e o tipo de índice existe, mas o meu usuário não enxerga ele. Como posso resolver isso?
[]´s
Roberto25 de novembro de 2009 às 7:53 pm #91138burga
ParticipanteTenta com essa grant
GRANT CTXAPP TO “USUARIO”;
25 de novembro de 2009 às 8:04 pm #91140rwarstat
ParticipanteContinua retornando o mesmo erro.
Havia esquecido de falar, o banco é um 10.2.0.1 rodando sobre Windows XP. Depois ele será passado para um linux.
[]´s
Roberto25 de novembro de 2009 às 8:29 pm #91142rwarstat
ParticipanteBom, executei a linha abaixo
CREATE INDEX ix_nm_paciente ON paciente(nm_paciente) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS ('index set ix_nm_paciente');Parou com o erro que o indextype não existia, mas agora ocorreu esse.
ORA-29855: ocorreu um erro na execução da rotina ODCIINDEXCREATE
ORA-20000: Erro do Oracle Text:
DRG-10700: a preferência não existe: CTXSYS.DEFAULT_DATASTORE
ORA-06512: em “CTXSYS.DRUE”, line 160
ORA-06512: em “CTXSYS.CATINDEXMETHODS”, line 97[]´s
Roberto25 de novembro de 2009 às 10:55 pm #91148rwarstat
ParticipanteVou explicar melhor o quê estou querendo fazer. É bem provável que a minha abordagem esteja errada.
Tenho uma tabela que armazena os pacientes atendidos. Nessa tabela preciso pesquisar os pacientes que contem uma determinada string e essa coluna deve ser indexada.
Se utilizar a clausula like terei um custo muito alto, pois o like não faz uso de índice.Alguém tem alguma dica de como fazer isso?
[]´s
Roberto25 de novembro de 2009 às 11:23 pm #91152burga
ParticipanteOi Roberto,
No caso da clausula like se a sua busca for por ‘string%’ ela não “mataria” o indice, agora se a sua busca pode conter qualquer palavra antes (‘%string’ ou ‘%string%’) acredito que somente com os índices CTX mesmo.
Aqui na empresa nós temos estes índices mas utilizamos o CONTEXT e não o CTXCAT. Nunca peguei este erro que você está tendo, mas aí vai um exemplo do script que utilizamos:
-- conectado como system ou sysdba
GRANT RESOURCE, CONNECT, CTXAPP TO "USUARIO";
GRANT CREATE TABLE TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_CLS TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_DDL TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_DOC TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_QUERY TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_REPORT TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_THES TO "USUARIO";
GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO "USUARIO";
ALTER USER USUARIO DEFAULT ROLE ALL;-- conectado como usuario
BEGIN
CTX_DDL.CREATE_PREFERENCE('USUARIO_lexer', 'BASIC_LEXER');
CTX_DDL.SET_ATTRIBUTE('USUARIO_lexer', 'base_letter', 'YES');
CTX_DDL.CREATE_PREFERENCE('USUARIO_wordlist', 'BASIC_WORDLIST');
CTX_DDL.SET_ATTRIBUTE('USUARIO_wordlist', 'WILDCARD_MAXTERMS', 15000);
END;
/BEGIN
CTX_DDL.CREATE_PREFERENCE('ctx_store_tbs', 'BASIC_STORAGE');
CTX_DDL.SET_ATTRIBUTE('ctx_store_tbs','I_TABLE_CLAUSE',
'tablespace USUARIO_I storage (initial 10M next 10M)');
CTX_DDL.SET_ATTRIBUTE('ctx_store_tbs', 'K_TABLE_CLAUSE',
'tablespace USUARIO_I storage (initial 10M next 10M)');
CTX_DDL.SET_ATTRIBUTE('ctx_store_tbs', 'R_TABLE_CLAUSE',
'tablespace USUARIO_I storage (initial 1M) lob (data) store as (cache)');
CTX_DDL.SET_ATTRIBUTE('ctx_store_tbs', 'N_TABLE_CLAUSE',
'tablespace USUARIO_I storage (initial 1M)');
CTX_DDL.SET_ATTRIBUTE('ctx_store_tbs', 'I_INDEX_CLAUSE',
'tablespace USUARIO_I storage (initial 1M) compress 2');
CTX_DDL.SET_ATTRIBUTE('ctx_store_tbs', 'P_TABLE_CLAUSE',
'tablespace USUARIO_I storage (initial 1M)');
END;
/CREATE INDEX "USUARIO"."PAIS_CTX_I" ON "USUARIO".PAISES (NOME)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ( 'LEXER USUARIO_lexer WORDLIST USUARIO_wordlist STORAGE ctx_store_tbs SYNC (ON COMMIT)' );Note que nos egundo procedimento eu defino a tablespace USUARIO_I a ser usada pelo indice.
25 de novembro de 2009 às 11:28 pm #91153rwarstat
ParticipanteValeu Tajiri !!!
Vou dar uma estudada nesse código que tu me passou.
Tô iniciando agora com o Oracle Text (para ser mais exato, hoje) e tá difícil.Depois posto aqui o resultado disso.
[]´s
Roberto -
AutorPosts
- Você deve fazer login para responder a este tópico.