martes, 4 de abril de 2017

Oracle: Cómo detectar caracteres extraños o no imprimibles

Muchas veces pasa que en las cargas de datos aparecen caracteres de control como ^M o símbolos ilegibles, y no es deseable que estos queden almacenados entre los datos.
¿Cómo detectar si existen?

Es sencillo si contamos con expresiones regulares en SQL como en 10g, pero en 9i igualmente podemos crear una función que recorra cada uno de los caracteres y verifique si pertenece al juego de caracteres 'raros'.

Esta es una sencilla implementación compatible con todas las versiones de Oracle, pero puede considerarse utilizar compilación condicional para utilizar expresiones regulares cuando sea posible.


El código:
CREATE OR REPLACE FUNCTION buscar_no_imprimible(v_cadena VARCHAR2) 
RETURN BOOLEAN IS  v_ret BOOLEAN := FALSE;    
  v_iter NUMBER := 1;    
  v_ascii_min NUMBER := 33;  
  v_ascii_max NUMBER := 126;
BEGIN
  WHILE (v_iter <= LENGTH(v_cadena))
    LOOP
      IF ASCII(SUBSTR(v_cadena,v_iter,1))
      NOT BETWEEN v_ascii_min AND v_ascii_max THEN
        v_ret := TRUE;
     EXIT;   
      END IF;        
      v_iter := v_iter + 1; 
    END LOOP;    
    RETURN(v_ret);
END buscar_no_imprimible;

Esta función booleana retorna TRUE si la cadena contiene un caracter no imprimible, FALSE en caso contrario. Una rápida mirada en una tabla ASCII nos dice que el rango de caracteres válidos se encuentra entre las representaciones decimales 33 y 126.

Si se desean considerar caracteres del ASCII extendido (por ejemplo vocales con acentos), bastará ajustar el procedimiento para incluir el conjunto de caracteres deseado.


Fuente: http://oraclenotepad.blogspot.com.es/2008/03/cmo-detectar-caracteres-extraos-o-no.html

No hay comentarios:

Publicar un comentario