- Blogzote.com - https://www.blogzote.com -

Procesar csv en oracle mejorado

Ya había escrito de la necesidad de leer un archivo csv (comma separated values o valores separados por coma) en un post anterior que titule Procesar csv en oracle pero me tope con la necesidad de leer un archivo separado por “@” (arroba) en vez de “,” (comas).

Solo modifique un poco la función a la que se le manda la cadena a procesar, el valor que separa la cadena y la posición de la columna que deseas y te regresa su valor.

Si tienes por ejemplo la cadena:

11111@22222@33333@44444@55555

Necesitas sacar de esa cadena el 3er campo, o sea, el valor “33333″, solo generas la llamada a la función:

variable := get_string_value_best (3, ’@’, ’11111@22222@33333@44444@55555’);

Aquí les dejo la función:

  --
  -- GET_STRING_VALUE_BEST
  --
  -- return the string value for a string id "p_string_id"
  -- separated by "p_string_var"
  -- in a csv string "p_string"
  -- 
  CREATE OR REPLACE FUNCTION get_string_value_best (
     p_string_id            IN      NUMBER,
     p_string_var           IN      VARCHAR2,
     p_string               IN      VARCHAR2) 
     RETURN VARCHAR2 IS
 
     v_string_value VARCHAR2(2000);
  BEGIN
 
    IF (INSTR(p_string,p_string_var) > 0) AND
       (p_string_id         > 0) THEN
       IF p_string_id = 1 THEN
          v_string_value := SUBSTR(p_string, 0, INSTR(p_string,p_string_var,1,1)-1);
       ELSE
         IF (INSTR(p_string,p_string_var,1,p_string_id-1) > 0) AND
            (INSTR(p_string,p_string_var,1,p_string_id)   > 0) THEN			
            v_string_value := SUBSTR(p_string, INSTR(p_string,p_string_var,1,p_string_id-1)+1, 
                                              (INSTR(p_string,p_string_var,1,p_string_id)-1 - 
                                               INSTR(p_string,p_string_var,1,p_string_id-1)));
         ELSIF
            (INSTR(p_string,p_string_var,1,p_string_id-1) > 0) AND
            (INSTR(p_string,p_string_var,1,p_string_id)   = 0) THEN			
            v_string_value := SUBSTR(p_string, INSTR(p_string,p_string_var,1,p_string_id-1)+1, 
                                             (LENGTH(p_string) - 
                                               INSTR(p_string,p_string_var,1,p_string_id-1)));
         END IF;
       END IF; 
    END IF;
 
    RETURN v_string_value;
 
  END get_string_value_best;