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:
1 | 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:
1 | variable := get_string_value_best (3, ’@’, ’11111@22222@33333@44444@55555’); |
Aquí les dejo la función:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | -- -- 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; |