Dzieje się tak, ponieważ Oracle obsługuje tylko standard wyrażeń regularnych POSIX, a nie składnię Perla, której używasz w pierwszym przykładzie.
Dokumenty Oracle:http://docs.oracle. com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#CHDJGBGG POSIX Regex Standard:http://pubs.opengroup.org/onlinepubs/007908799 /xbd/re.html
Edycja:jako Alex Poole wskazuje, że Oracle faktycznie obsługuje składnię Perl regex od czasu Oracle 10gR2. Wypróbowanie twojego przykładu na mojej lokalnej instalacji 11gR2 sugeruje, że twoja składnia jest nieprawidłowa, następujące działania działają poprawnie:
SELECT 1 FROM dual WHERE regexp_like('040', '^\d{3}$');