miércoles, 12 de marzo de 2008

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'.
Mostraré 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.

Ver también:
Como eliminar acentos del español
Limpiando código DDL
Compilación condicional en 9i

No hay comentarios: