Marcos, no viste el ejemplo que hace un tiempo te mandé, con el cual podías 
almacenar los datos del Excel en la tabla, sin tantas complicaciones??

Saludos.

De: pgsql-es-ayuda-ow...@postgresql.org 
[mailto:pgsql-es-ayuda-ow...@postgresql.org] En nombre de Marcos Alberto Flores 
Valda
Enviado el: jueves, 13 de octubre de 2011 11:12
Para: pgsql-es-ayuda@postgresql.org
Asunto: [pgsql-es-ayuda] de CSV a tabla en BD

Sobre el caso de subir un archivo CSV a una tabla de la BD y para el cual pedí 
ayuda a la lista,
aca les indico como hice la función:


--f_excel (archivo bytea, tabla varchar)

DECLARE
  cant_filas      integer; --la cantidad de filas del Excel original
  cant_cols       integer; --la cantidad de columnas del Excel original
  vector                       text[]; --contiene las filas del excel
  registros                    text[]; --contiene una fila de excel separada 
por comas
  i                                numeric;--indice del for para las filas
  j                                numeric;--indice del for para las columnas
  aux                            text;-- bytea sin codificacion

  v_consulta    varchar;--consulta insert

BEGIN

    aux := (select decode(archivo::text,'base64')); --se obtiene el bytea y se 
quita la codificación

    vector := string_to_array(aux,'\\015\\012'); --descomponer el bytea en un 
vector que contenga una fila del CSV cada uno
                                                                                
                    --\\015\\012 --> ENTER o salto de linea/retorno de carro en 
el bytea

    select array_upper(vector,1) into cant_filas; --cantidad de registros del 
CSV
    for i in 1..(cant_filas-1) loop

        v_consulta := 'insert into '||tabla||' values ('; --inicio del insert

        registros := string_to_array(vector[i],';'); --descomponer cada fila 
para obtener las columnas del CSV
        select array_upper(registros,1) into cant_cols; --cantidad de columnas 
del CSV

        for j in 1..(cant_cols-1) loop

            registros[j] := (select replace(registros[j]::text,',','.')); 
--reemplazar las comas por puntos
            v_consulta := v_consulta ||''''|| registros[j] || ''','; 
--continuar con la insercion hasta la columna N-1

        end loop;

        v_consulta := v_consulta ||''''||  registros[cant_cols] || ''');'; 
--insertar la ultima columna
        execute v_consulta; --ejecutar el insert

    end loop;

    return;

END;

Antes de llamar a esta función creo una tabla temporal en la función principal 
con los campos que necesito, esta función se encarga de recibir el CSV lo 
decodifica, lo separa y lo va insertando en la tabla temporal, en la función 
principal recibo los datos de la función y trabajo con ellos posteriormente 
para insertarlos en la tabla destino como lo muestro en la siguiente parte de 
código:

v_consulta := 'creación de la tabla temporal ';
execute v_consulta;
v_resultado := (llamada a la función f_excel(CSV, tabla temporal));
v_consulta := 'selección de todos los registros de la tabla temporal';

FOR v_registros in EXECUTE(v_consulta) LOOP
.... (inserción de datos en la tabla destino)
end loop;

Se que encontrarán fallas en algunas partes y se puede optimizar el código de 
esta función por eso se las dejo para ver como podríamos mejorarla.

Saludos y gracias por los consejos.

Reply via email to