Hay conceptos que no se acaban de tener claros en pl/sql. Uno con el que me he encontrado más de una vez es con la conversión entre caracteres y su equivalencia numérica en ASCII. ¿Para qué sirve? Podemos detectar caracteres extraños en una cadena o, por ejemplo, garantizar que dichos caracteres pertenecen a un subconjunto determinado: por ejemplo, al de los dígitos. Así, sabemos que los dígitos tienen asociados los valores entre 48 (para el 0) y 57 (para el 9) en la tabla ASCII.
De esta forma, el siguiente código comprueba que una cadena de texto es numérica. Devuelve un 1 si es así y un 0 si existe un carácter que no se encuentre entre el 0 y el 9:
create or replace function fn_es_numerico (
p_cadena in varchar2
) return number is
begin
if ascii(substr(p_cadena, 1, 1)) not between 48 and 57 then
return 0;
end if;
if length(p_cadena) <= 1 then
return 1;
end if;
return fn_es_numerico(substr(p_cadena,2));
end fn_es_numerico;
El mismo algoritmo, pero no recursivo podría ser:
create or replace function fn_es_numerico (
p_cadena in varchar2
) return number is
c char(1);
i number := 1;
begin
c := substr(p_cadena, i, 1);
while c is not null and ascii(c) between 48 and 57 loop
i := i + 1;
c := substr(p_cadena, i, 1);
end loop;
if c is null then
return 1;
end if;
--
return 0;
end fn_es_numerico;
Y, ya que estamos, repasaremos otro concepto: el forzado de errores y control de excepciones. Oracle nos permite realizar una operación y validar si se ha producido un error o no. Como conocemos la excepción producida por la conversión errónea de una cadena de caracteres a número, podemos hacer algo como lo siguiente:
create or replace function fn_es_numerico (
p_cadena in varchar2
) return number is
i number;
begin
i := to_number (p_cadena);
return 1;
exception
when others then
if sqlcode = -6502 then
return 0;
end if;
end fn_es_numerico;
Ah, como nota decir que el tercer ejemplo no es equivalente a los otros dos. El tercero valida que una cadena sea un número. Eso incluye símbolos como el separador de miles y de decimales. En cambio, si introducimos una coma (,) o un punto (.) en los dos primeros ejemplos, el resultado será que no ha validado la cadena.








Suscribirse a nuestro Twitter
Javier Jofre (12-May-2010)
Gracias a O'Reilly, podemos asistir vía online y de forma gratuita a algunos cursos sobre desarrollo en Java para Android. Próximamente (en unos días) empieza el curso de creación de un cliente twitter. Espero que lo disfrutéis.