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: [email protected] [mailto:[email protected]] En nombre de Marcos Alberto Flores Valda Enviado el: jueves, 13 de octubre de 2011 11:12 Para: [email protected] 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.
