Inicio » Posts tagged 'SEPARAR CADENAS ORACLE.'

Tag Archives: SEPARAR CADENAS ORACLE.

Función SPLIT en PL/SQL

En muchos lenguajes de programación de alto nivel poseemos la función SPLIT que nos permite subdividir una cadena de caracteres en varias subcadenas que se encuentran dentro de ella divididas por un delimitador. El delimitador no es más que un carácter dentro de la cadena que sirve para bandera para saber hasta donde llega la subcadena y donde comienza otra. Los caracteres delimitadores más comunes son un espacio en blanco, una coma o un guion.

 La función como tal nos retorna un arreglo  que contiene las subcadenas que estaban separadas por el delimitador que brindamos como parámetro.En PL/SQL lamentablemente no contamos con esta función, pero lo bueno es que la podemos crear.
 
El concepto de arreglo como tal no existe como tal en PL/SQL, pero  podemos utilizar “arreglos asociativos” que son conocidos como Index-By tables. Un arreglo asociativo no es mas que una única variable que ocupa mas de una posición en memoria para almacenar los diversos datos. Este concepto es muy similar al concepto de arreglos en C/C++.
 
Para nuestro Split necesitaremos declarar un tipo para hacernos mas fácil su uso en la función y almacenar las subcadenas y poderlas retornar.
 
En mi caso utilizare lo siguiente:
 
type t_array is TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;
 
La declaración de la función la haremos dentro de un paquete al que le pondré  por nombre STRING_FNC, toda la declaración es la siguiente:
 
create or replace package STRING_FNC
IS
  – Author  : BPALACIO
  – Created : 2/9/2012 1:27:29 PM
 
 
 
  type t_array is TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;
 
  FUNCTION SPLIT(in_string VARCHAR2, delim VARCHAR2 ) return t_array;
 
END;
 
Para la Implementación de la función necesitaremos dos parámetros, la cadena como tal y el carácter delimitador, como tal la función hará un ciclo buscando el carácter delimitador y separando subcadena por subcadena las que ira depositando en nuestra variable t_array. Al final del bucle retornamos el arreglo para que lo podamos llamar desde donde se ha invocado.
 
 
CREATE OR REPLACE PACKAGE BODY STRING_FNC
 
 
IS
 
FUNCTION SPLIT (in_string VARCHAR2, delim VARCHAR2) RETURN t_array
    IS
    i number := 0;
    pos number :=0;
    lv_str varchar2(100) := in_string;
   
    strings t_array;
   
    BEGIN
      pos := instr(lv_str, delim,1,1);
     
      WHILE ( pos != 0) LOOP
        i := i + 1;
       
        strings(i) := substr(lv_str,1,pos);
        lv_str :=  substr(lv_str, pos+1,length(lv_str));
        pos := instr(lv_str, delim, 1, 1);
       
        If pos = 0 THEN
          strings (i+1) := lv_str;
         
          END IF;
         
          END LOOP;
         
          RETURN strings;
          END SPLIT;
         
END STRING_FNC;
 
 
En mi caso utilice esta función para separar los diferentes nombres y apellidos de una persona en nombre1, nombre2, apellido1, apellido2 los cuales estaban contenidos en una sola cadena y separados por espacios en blanco.
 
 
  str := CLIENT.split(NOMBRE, ‘ ‘);
   
     
        IF str.count = 0 THEN
          WORD1   := NOMBRE;
          NOMBRE1 := WORD1;
          NOMBRE2 := NULL;
       
        ELSIF str.count = 1 THEN
          WORD1   := str(1);
          NOMBRE1 := WORD1;
          NOMBRE2 := NULL;
       
        ELSIF str.count = 2 THEN
          WORD1   := str(1);
          WORD2   := str(2);
          NOMBRE1 := WORD1;
          NOMBRE2 := WORD2;
 
 
La variable str debe ser declarada del mismo tipo del arreglo que recibirá.
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.