Esta é uma má ideia. O somente maneira de validar que uma data está correta é tentar convertê-la em uma data. Se a conversão falhar, não é uma data; se for bem-sucedido, poderá ser. As datas são muito complexas para uma linguagem regular analisar.
Então, crie uma função que converta em uma data; você pode torná-lo muito mais genérico do que aqui, para que possa ser reutilizado para outros fins:
create or replace function validate_date (
PDate in varchar2
, PDateFormat in varchar2
) return date is
begin
return to_date(PDate, PDateFormat);
exception when others then
return null;
end;
Isso retorna uma data se for capaz de validar que a data e o formato de data correspondem, caso contrário, retornará NULL se houver algum erro. Sua consulta então se torna:
select 'P' from dual where validate_date('20140506', 'yyyymmdd') is not null