Para fazer busca em campos com textos longos no Oracle é possível utilizar o operador “CONTAINS”, basta criar um índice do tipo CONTEXT e você poderá realizar buscas de texto nessa coluna.
Para criar o índice do tipo CONTEXT utilize o seguinte comando:
E para realizar a busca no campo, utilize:
Para demostrar como isso funciona, vamos ver um exemplo:
1- Criamos uma tabela:
2- Inserimos um registro para teste:
3- Criamos o índice na coluna:
4- Agora, podemos realizar buscas nesse campo utilizando o operador CONTAINS, por exemplo:
5- Agora, vamos inserir mais um registro para teste:
6- No entanto, quando realizamos o comando SELECT abaixo nenhum registro é retornado.
A documentação do Oracle diz o seguinte sobre esse tipo de índice:
3.3.5.1 CONTEXT Index and DML
A CONTEXT index is not transactional. When a record is deleted, the index change is immediate. That is, your own session will no longer find the record from the moment you make the change, and other users will not find the record as soon as you commit. For inserts and updates, the new information will not be visible to text searches until an index synchronization has occurred. Therefore, when you perform inserts or updates on the base table, you must explicitly synchronize the index with CTX_DDL.SYNC_INDEX.
link: http://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm
Ou seja, quando registros são inseridos ou atualizados no banco de dados utilizando o admin do portal, o índice não é automaticamente atualizado, então o resultado não aparece na busca.
Esse outro documento (http://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm#i1008452) tem um exemplo de como fazer essa sincronização:
7- Então, fazemos a sincronização:
É possível atualizar todos os índices em uma Stored Procedure e agendar um job para executar essa proc a cada uma hora, essa procedure ficaria assim:
8- Após rodar o comando, podemos repetir o comando SELECT irá trazer os resultados da linha incluída: