Anuncios en tutorial de programación PLSQL

jueves, 9 de marzo de 2017

Las funciones PL/SQL LPAD, RPAD, REPLACE, TRANSLATE, TRIM, LTRIM y RTRIM (manejo de cadenas de caracteres II)

En este artículo encontraréis toda la información necesaria para que desde vuestros programas PLSQL podáis realizar tres operaciones básicas con las cadenas de caracteres: rellenar dicha cadena con espacios u otros caracteres, reemplazar un determinado carácter o grupo de caracteres dentro de dicha cadena, o eliminar un determinado carácter o grupo de caracteres en la mencionada cadena.

Sintaxis de las funciones PLSQL LPAD y RPAD

Las bases de datos Oracle proporcionan diferentes funciones que pueden utilizarse en bloques SQL y PLSQL para realizar estas operaciones. Las funciones de las que estamos hablando son LPAD, RPAD,

Funciones PL/SQL LPAD y RPAD


Ya hemos hablado en alguna ocasión sobre el hecho de que las bases de datos Oracle rellenan automáticamente con espacios las variables de tipo CHAR hasta completar la máxima longitud declarada de dicha variables.

No obstante esto no ocurre con las variables VARCHAR2. Por este motivo en ocasiones resultan muy útiles las funciones LPAD y RPAD, en especial si estamos escribiendo el código de algún informe, funciones que permiten poner espacios por delante (LPAD) o por detrás (RPAD) de una cadena de caracteres.

Al llamar a estas funciones deberemos especificar la longitud de la cadena a rellenan, el carácter o caracteres con que se quiere rellenar (por defecto Oracle utilizará espacios sino se especifica lo contrario).

Veamos un ejemplo de código PL/SQL
DECLARE
  l_nombr1 VARCHAR2 (20) := 'Pepe Alfredo';
  l_apell1 VARCHAR2 (15) := 'Ramírez';
  l_salar1 VARCHAR2 (10) := '100.369';
  l_nombr2 VARCHAR2 (20) := 'Antonio';
  l_apell2 VARCHAR2 (15) := 'Pas';
  l_salar2 VARCHAR2 (10) := '23.987';
BEGIN
  -- Añadimos los caracteres '/()' al principio del
  -- nombre hasta el carácter 15. 
  DBMS_OUTPUT.put_line(
    RPAD(l_nombr1, 15, '/()')
  );

  -- Añadimos los caracteres '$%&' al final del
  -- apellido hasta el carácter 20
  DBMS_OUTPUT.put_line(
    LPAD(l_apell1, 20, '$%&')
  );

  -- Justifica los campos para que aparezcan en
  -- columnas  de longitud fija
  DBMS_OUTPUT.put_line (
    RPAD (l_nombr1, 20)
    || ' '
    || RPAD (l_apell1, 15)
    || ' '
    || LPAD (l_salar1, 10)
  );
  DBMS_OUTPUT.put_line (
    RPAD (l_nombr2, 20)
    || ' '
    || RPAD (l_apell2, 15)
    || ' '
    || LPAD (l_salar2, 10)
  );

END;
/

La salida sería la siguiente:

Pepe Alfredo/()
$%&$%&$%&$%&$Ramírez
Pepe Alfredo         Ramírez            100.369
Antonio              Pas                 23.987

Funcione PL/SQL REPLACE y TRANSLATE


La base de datos Oracle proporciona también un par de funciones PLSQL que permiten de forma selectiva cambiar uno o más caracteres dentro de una cadena. Las funciones son las siguientes:
  • REPLACE: que dentro de una cadena reemplaza un conjunto de caracteres por otro.
  • TRANSLATE: que traduce o reemplaza caracteres individuales.

Sintaxis de las funciones PLSQL REPLACE y TRANSLATE

Como siempre la mejor manera de ilustrar el funcionamiento de las funciones REPLACE y TRANSLATE es con un ejemplo.
DECLARE
  l_nombre VARCHAR2 (50) := 'Pepe Alfredo Ramírez';
BEGIN
  -- Reemplaza las 'e' por el carácter '*'
  DBMS_OUTPUT.put_line (
    REPLACE (l_nombre, 'e', '*')
  );
  DBMS_OUTPUT.put_line (
    TRANSLATE (l_nombre, 'e', '*')
  );

  -- Reemplaza 're' por 'ilo'
  DBMS_OUTPUT.put_line (
   REPLACE (l_nombre, 're', 'ilo')
  );

  -- Reemplaza la 'r' por '*' y la e por '%'
  DBMS_OUTPUT.put_line (
    TRANSLATE (l_nombre, 're', '*%')
  );
END;
/

La salida de este ejemplo sería:

P*p* Alfr*do Ramír*z
P*p* Alfr*do Ramír*z
Pepe Alfilodo Ramíiloz
P%p% Alf*%do Ramí*%z

Como habréis podido observar, cuando queremos reemplazar únicamente un carácter, las funciones REPLACE y TRANSLATE funcionan de idéntica manera, solo funcionan de forma distinta cuando se utilizan para reemplazar múltiples caracteres. La función REPLACE lo que hace es buscar una cadena (segundo parámetro) dentro de otra cadena (primer parámetro) y reemplazarla por la cadena utilizada como tercer parámetro. Mientras que la función TRANSLATE lo que hace es reemplazar en la cadena principal (primer parámetro) cada aparición concreta de los caracteres incluidos en la cadena definida por el segundo parámetro, por su equivalente -según su posición dentro de la cadena- en la cadena especificada en el tercer parámetro.

Por lo tanto la función REPLACE debe utilizarse cuando necesitemos reemplazar una secuencia de caracteres específica por otra dentro de una cadena de caracteres dada. Mientras que la función TRANSLATE se debe utilizar cuando queramos reemplazar caracteres individuales dentro de una cadena.

Funciones PL/SQL TRIM, LTRIM y RTRIM


Igual que las funciones LPAD y RPAD que añaden caracteres, existen como contrapartida las funciones TRIM, LTRIM y RTRIM que los quitan, ya sea del principio de la cadena (LTRIM) o del final (RTRIM)

Sintaxis de las funciones PLSQL LTRIM y RTRIM

Como siempre lo mejor para comprender su funcionamiento es utilizar un ejemplo:
DECLARE
  l_nombre VARCHAR2 (50) := '...Pepe.Ramírez.....';
  l_espaci VARCHAR2 (50) := '    Pepe Ramírez    ';
  l_letras VARCHAR2 (50) := '123Pepe.Ramírez34567';
BEGIN
  -- Quita puntos del final
  DBMS_OUTPUT.put_line (
    RTRIM (l_nombre, '.')
  );

  -- Quita puntos del principio
  DBMS_OUTPUT.put_line (
    LTRIM (l_nombre, '.')
  );

  -- Quita números del principio
  DBMS_OUTPUT.put_line (
    LTRIM (l_letras, '1234567890')
  );

  -- Quita números del principio y el final
  DBMS_OUTPUT.put_line (
    RTRIM (
      LTRIM (l_letras, '1234567890'),
      '1234567890')
  );
END;

La salida del ejemplo sería:

...Pepe.Ramírez
Pepe.Ramírez.....
Pepe.Ramírez34567
Pepe.Ramírez

Como podéis observar, en las funciones LTRIM y RTRIM el segundo parámetro indica los caracteres a eliminar del principio o del final de la cadena introducida como primer parámetro. Los caracteres a eliminar pueden ser solo uno o varios. Si en las funciones LTRIM y RTRIM no se especifica el segundo parámetro, entonces lo que hacen es eliminar los espacios del principio o del final. Es decir, el funcionamiento de LTRIM(l_nombre, ‘ ‘) es equivalente a LTRIM(l_nombre), y lo mismo cabe decir de RTRIM(l_nombre, ‘ ‘) y RTRIM(l_nombre).

Sintaxis de las funciones PLSQL TRIM

El funcionamiento de la función TRIM es ligeramente diferente. Veámoslo con un ejemplo:
DECLARE
  l_trim VARCHAR2(15) := '111Hola1111';
  l_espa VARCHAR2(15) := '   Adios   ';
BEGIN
  DBMS_OUTPUT.put_line (
    TRIM (LEADING '1' FROM l_trim)
  );

  DBMS_OUTPUT.put_line (
    TRIM (TRAILING '1' FROM l_trim)
  );

  DBMS_OUTPUT.put_line (
    TRIM (BOTH '1' FROM l_trim)
  );

  -- Por defecto se eliminan los caracteres de
  -- izquierda y derecha (BOTH)
  DBMS_OUTPUT.put_line (
    TRIM ('1' FROM l_trim)
  );

  -- Por defecto los caracteres que se eliminan son
  -- los espacios
  DBMS_OUTPUT.put_line (
    TRIM (l_espa)
  );
END;

La salida del ejemplo es como sigue:

Hola1111
111Hola
Hola
Hola
Adios

Notas adicionales sobre TRIM, LTRIM, RTRIM y TRANSLATE


Como podéis observar, la limitación de la función TRIM es que solo se puede especificar un único carácter a eliminar. Es decir, el siguiente código PLSQL no funcionaría: TRIM(BOTH '123456' FROM l_trim).

En el caso de que necesitemos eliminar más de un carácter deberemos utilizar las funciones LTRIM y RTRIM conjuntamente: LTRIM(RTRIM(l_trim, '123456'), '123456').

También es posible utilizar la función TRANSLATE para eliminar todos los caracteres dentro de una cadena, pero en este caso también se eliminarían los caracteres intermedios. Por ejemplo, el comando PLSQL TRANSLATE('123Hola123-123Adios123','X123','X') generaría la salida “Hola-Adios”.

Observad que el comando escrito de forma “intuitiva”, TRANSLATE('123Hola123-123Adios123','123',''), no funciona y devuelve un valor nulo (NULL). Esto ocurre porque si alguno de los argumentos que se pasa a la función TRANSLATE es NULL (o una cadena de caracteres de longitud cero), entonces dicha función devuelve el valor NULL. Por eso en el ejemplo que funciona he tenido que añadir la letra X en el segundo y tercer argumento –de manera que se reemplace por si misma-, para conseguir que el tercer parámetro no sea NULL.

Artículos relacionados: Las funciones PL/SQL CONCAT, UPPER, LOWER, INITCAP, SUBSTR e INSTR.

0 comentarios: