Uso de expresiones regulares con Oracle

Muchas veces necesito saber qué registros de una tabla tienen valores no numéricos en un campo varchar. Normalmente me hago una función en un paquete y la utilizo en la select que toque:

FUNCTION esCadenaNumerica( vCadena VARCHAR2 ) RETURN VARCHAR2 IS 
  ------------
  -- Variables
  ------------
  nTonta NUMBER;
BEGIN 
  nTonta := TO_NUMBER( vCadena );

  -- Si llego hasta aquí es que el número es válido.
  RETURN 'TRUE';
EXCEPTION
  WHEN VALUE_ERROR THEN
    -- El número no es válido.
    RETURN 'FALSE';
END;


La función devuelve un varchar para poder ser usada en una select. Esta select me daría los valores no numéricos de una columna:

SELECT VVALOR
FROM   TABLA
WHERE  NombrePaquete.esCadenaNumerica( VVALOR ) = 'FALSE'

Por supuesto, la función podría ser más rica agregándole parámetros para una máscara de conversión o para pedir también la precisión.
El caso es que me ha hecho falta buscar valores no numéricos en una tabla en un esquema en el que no tengo permiso para crear ni funciones ni procedimientos. Podría haber optado por hacer un bloque de pl/sql anónimo, pero he preferido buscar algo más directo y lo he encontrado. Las expresiones regulares están disponibles en la 10g y permiten hacer búsquedas de una manera parecida al like pero más potente. Es algo bastante más común en el mundo java pero también está disponible para los plsqleros a través de la función REGEXP_LIKE. Está bien explicado en este artículo que he encontrado: Oracle and Regular Expressions.
Por ejemplo, esta select me saca los valores de una columna que no son números enteros:

SELECT VVALOR
FROM   TABLA
WHERE  REGEXP_LIKE( VVALOR, '[^0-9]')
/

Además de permitir búsquedas, también se pueden hacer potentes replaces y substrs. Flipante. Este es un enlace en plan tip donde el autor se ha currado unas inserciones y un montón de sentencias de prueba: Oracle Regular Expressions, versión 10.2. En la wikipedia, como de costumbre, también está bien explicado: Definición de expresión regular.

Anuncios