Isso ocorre porque o Oracle suporta apenas o padrão de expressões regulares POSIX, em vez da sintaxe Perl que você usa em seu primeiro exemplo.
Documentos Oracle:http://docs.oracle. com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#CHDJGBGG Padrão Regex POSIX:http://pubs.opengroup.org/onlinepubs/007908799 /xbd/re.html
Editar:como Alex Poole aponta que o Oracle realmente suporta a sintaxe Perl regex desde o Oracle 10gR2. Tentar seu exemplo na minha instalação local do 11gR2 sugere que sua sintaxe está errada, o seguinte funciona bem:
SELECT 1 FROM dual WHERE regexp_like('040', '^\d{3}$');