Fiz um exemplo rápido sem testar muito, se puder verificar melhor por gentileza, seria isso:
Selecionar tudo
SQL> create table pessoa as
2 select 'JOSÉ ANTONIO MARIA' nome from dual union all
3 select 'MARIA JOSÉ' from dual union all
4 select 'MARIANA JOSÉ' from dual union all
5 select 'JOSÉ' from dual union all
6 select 'LUCAS' from dual union all
7 select 'MARIA' from dual;
Table created
SQL> with t as (
2 select 'JOSÉ MARIA' filtro from dual
3 ) -- fim do filtro
4 select p.nome
5 from pessoa p
6 where not exists (select 1
7 from (select regexp_substr(filtro, '\S+', 1, level) nome
8 from t
9 connect by regexp_substr(filtro, '\S+', 1, level) is not null) f
10 where regexp_instr(p.nome, '([^[:alpha:]]|^)' ||f.nome || '([^[:alpha:]]|$)') = 0);
NOME
------------------
JOSÉ ANTONIO MARIA
MARIA JOSÉ
O recurso usado é chamado de expressões regulares, tem mais informações aqui:
http://docs.oracle.com/cd/E11882_01/app ... regexp.htm
Basicamente a lógica é repartir a string do filtro em palavras separadas por espaço, tratar essas palavras como se fossem uma tabela e fazer uma pesquisa que peça por todos nomes de pessoas onde não exista (not exists) nenhuma dessas palavras
ausentes.