2 votes

CONTAINS ne fonctionne pas avec Oracle Text

J'ai un problème pour exécuter cette requête.

SELECT * FROM gob_attachment 
WHERE CONTAINS (gob_a_document, 'java') > 0

Ça me donne

ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error: 
ORA-00942: table or view does not exist

29902. 00000 -  "error in executing ODCIIndexStart() routine"
*Cause:    The execution of ODCIIndexStart routine caused an error.
*Action:   Examine the error messages produced by the indextype code and
       take appropriate action.

Après quelques recherches sur Internet, j'ai découvert que le problème pouvait se situer dans l'index, mais lorsque j'ai regardé la table et l'index, ils m'ont semblé corrects.

Créer script pour l'index ressemble à ceci

CREATE INDEX FTSI_GOB_A_DOCUMENT 
 ON GOB_ATTACHMENT (GOB_A_DOCUMENT) 
 INDEXTYPE IS CTXSYS.CONTEXT;

La seule chose qui me semble étrange est que lorsque je regarde dans Edit Table dans les propriétés de la table dans SQL Developer, je peux voir que le statut opérationnel de l'index est FAILED. Quelqu'un sait-il ce que cela signifie, peut-être les droits de la base de données ?

Cela fonctionne également lorsque j'utilise

dbms_lob.instr(gob_a_document, utl_raw.cast_to_raw('java')) > 0

au lieu de contains

Merci pour tout conseil

P.S. C'est en rapport avec ma question précédente Performances de Oracle DBMS_LOB.INSTR et CONTAINS

UPDATE

Après avoir recréé l'index et avoir joué un peu avec, j'ai découvert que je peux exécuter la requête ci-dessus, mais qu'elle ne me renvoie rien.

Si je l'essaie avec CONTAINS(gob_a_document, '%') Le résultat est de 26 lignes et je ne sais pas par quelle clé la requête les a sélectionnées (du moins je n'ai rien trouvé d'évident, je vais l'étudier davantage). Le problème pourrait venir du fait que nous utilisons Oracle 10g et que nous stockons des fichiers DOCX qui sont pris en charge à partir de la version 11.

4voto

APC Points 69630

"L'état opérationnel de l'index est FAILED"

Ok, cela signifie que votre déclaration CREATE INDEX a échoué. Tu as eu un message d'erreur ? Je suppose que la réponse est oui mais que tu l'as manqué. Donc ce que tu dois faire c'est :

  • supprimer l'indice
  • réexécutez l'instruction CREATE INDEX
  • si une erreur se produit, notez la raison et corrigez-la.

Au cas où ce ne serait pas évident, l'autre déclaration s'exécute parce qu'elle ne tente pas d'utiliser votre index CONTEXT. Elle effectue la recherche de la manière la plus difficile.


"Le truc, c'est que l'index était déjà créé dans la BD".

Non, la vraie chose était l'indice n'a pas réussi à créer correctement, d'où son statut. Vous auriez pu simplement reconstruire l'index, mais il est généralement préférable de réparer d'abord la cause sous-jacente de l'échec. C'est pourquoi je vous ai conseillé d'abandonner et de recréer. Il est évident que l'échec initial était dû à une condition ambiante qui ne s'applique plus.


"Maintenant, la requête est exécutée, mais elle ne me donne aucun résultat (0 rangée). retournés). (et je suis sûr qu'elle devrait retourner environ 100 lignes) "

Il semble donc que vous stockez des documents dans un format binaire. Quel type de documents ? Sont-ils dans un format supporté ? Cela dépend de la version d'Oracle que vous utilisez. Par exemple, Oracle Text 10g prend en charge jusqu'à Word 2003 (c'est-à-dire DOC uniquement). alors que Oracle Text 11g prend en charge Word 2007 (c.-à-d. DOCX également) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X