tag:blogger.com,1999:blog-6230959840389481677.post-75478137636064101102008-03-12T10:52:00.000-07:002008-04-17T08:03:34.254-07:00Cómo detectar caracteres extraños o no imprimiblesMuchas 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.<br />¿Cómo detectar si existen?<br />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'.<br />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.<br />El código:<pre><span style="color: rgb(0, 153, 0);font-family:courier new;" >CREATE OR REPLACE FUNCTION buscar_no_imprimible(v_cadena VARCHAR2) </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" >RETURN BOOLEAN IS<br /></span><span style="color: rgb(0, 153, 0);font-family:courier new;" > v_ret BOOLEAN := FALSE; </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > v_iter NUMBER := 1; </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > v_ascii_min NUMBER := 33; </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > v_ascii_max NUMBER := 126;</span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" >BEGIN</span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > WHILE (v_iter <= LENGTH(v_cadena))</span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > LOOP</span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > IF ASCII(SUBSTR(v_cadena,v_iter,1))</span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > NOT BETWEEN v_ascii_min AND v_ascii_max THEN</span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > v_ret := TRUE;<br /> EXIT; </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > END IF; </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > v_iter := v_iter + 1; </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > END LOOP; </span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" > RETURN(v_ret);</span><br /><span style="color: rgb(0, 153, 0);font-family:courier new;" >END buscar_no_imprimible;</span><br /><span style="color: rgb(0, 153, 0);font-family:Courier New;" ></span></pre>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 <a href="http://www.techonthenet.com/ascii/chart.php" target="_blank">ASCII</a> nos dice que el rango de caracteres válidos se encuentra entre las representaciones decimales 33 y 126.<br /><br />Si se desean considerar caracteres del <a href="http://www.cdrummond.qc.ca/cegep/informat/Professeurs/Alain/files/ascii.htm" target="_blank">ASCII extendido</a> (por ejemplo vocales con acentos), bastará ajustar el procedimiento para incluir el conjunto de caracteres deseado.<br /><br /><strong>Ver también:</strong><br /><a href="http://oraclenotepad.blogspot.com/2007/10/acentos-del-idioma-espaol.html" target="_blank">Como eliminar acentos del español</a><br /><a href="http://oraclenotepad.blogspot.com/2007/09/limpiando-cdigo-ddl.html">Limpiando código DDL</a><br /><a href="http://oraclenotepad.blogspot.com/2008/03/compilacin-condicional-tambin-en-9i.html">Compilación condicional en 9i</a>lferhttp://www.blogger.com/profile/00618392085702183279noreply@blogger.com