Carlos A. García

Cadena numérica

Autor: Carlos A. García. Archivado en Oracle
Etiquetas: · · · ·
04/Sep/2008  

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.





Artículos relacionados




Deja tu comentario








* Campos obligatorios  




Sin Comentarios »