Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Concatenar en un copy

Estas en el tema de Concatenar en un copy en el foro de PostgreSQL en Foros del Web. Què tal amigos? Tengo la siguiente inquietud y espero que me puedan ayudar. Estoy trabajando con una funcion en postgre. Uno de las instrucciones que ...
  #1 (permalink)  
Antiguo 12/11/2009, 13:06
 
Fecha de Ingreso: septiembre-2009
Mensajes: 30
Antigüedad: 14 años, 7 meses
Puntos: 0
Exclamación Concatenar en un copy

Què tal amigos? Tengo la siguiente inquietud y espero que me puedan ayudar.

Estoy trabajando con una funcion en postgre. Uno de las instrucciones que cumple, es leer un archivo de texto plano llamado archivos_cargar.txt (usando el copy) y descargarlo en una tabla la que llamaremos nombres_archivos y que contiene un solo campo. El contenido de ese archivo, no es màs que la lista de los nombres de los archivos que se encuentran en equis direccion (la llamaremos prueba) y son con los que realmente debo trabajar.

Esto lo hago, porque los archivos que llegan a esa carpeta (prueba), llegan cada cierto tiempo y con nombres distintos asì como en cantidades variadas(puede llegar 1 solo archivo asì como pueden llegar 100), por lo cual la direcciòn para leer no puede ser estàtica.

Hice un .bat que me crea un archivo (archivos_cargar.txt) donde me guarda los nombres de todos los archivos de texto que se encuentren en la carpeta cada vez que se ejecute:

Entonces necesito hacer lo siguiente:

Leer el archivo "archivos_cargar.txt", vaciar la informaciòn en la tabla archivos_cargar ( esto es bastante sencillo usando el copy) y ya una vez allì, capturar el contenido de ese campo y guardarlo en una variable, ya que como les indiquè, en ese contenido, està el nombre del archivo con el que debo trabajar. Quisiera saber entonces, como agregar el contenido de ese campo a la direcciòn de un copy.

Los ilustro un poco con lo que quiero hacer:


CREATE OR REPLACE FUNCTION buscar_nombres (integer) RETURNS integer AS
$BODY$



DECLARE

param1 ALIAS FOR $1;
i integer;
nombre_archivo VARCHAR(100);
line record;

BEGIN

i := 0;

FOR line IN select * from "archivos_cargar" LOOP

/* obtener los campos */

nombre_archivo := substr(line.line,1,20);

/*ejecutar el copy*/

BEGIN

COPY prueba from 'd:/prueba/'; ??????

Despues de "prueba/" se supone que deberìa ir el contenido del campo que leì, para que asì, el copy busque ese archivo y actue. Pero no sè còmo hacerlo.


Intentè crear una variable de la siguiente forma "RUTA='d:/prueba/';" y otra llamada "BUSCAR" que serìa la concatenaciòn de ruta y nombre_archivo,
por lo que serìa algo asì:
"BUSCAR=RUTA || nombre_archivo;"

y el copy querìa asì:

COPY prueba from BUSCAR;

Quizà es una loquera, pero fue lo que se me ocurriò y lògicamente, pues no funciona :(

Tambièn intentè esto

COPY prueba from 'd:/prueba/' || nombre_archivo;

Lògicamente tampoco funcionò :(

Y ya de verdad no se me ocurrè màs nada, no sè si debo concatenar distinto, si lo estoy haciendo mal o si hay alguna otra forma de hacerlo, ya estoy super estancado allì.

Bueno, espero haber podido explicarme bien y haber podido plasmar lo que realmente deseo hacer en esta funciòn y les agradecerè muchìsimo cualquier ayuda que puedan darme.

Muchas gracias de antemano, saludos!
  #2 (permalink)  
Antiguo 12/11/2009, 13:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Concatenar en un copy

Nunca he hecho algo parecido pero tengo varias cositas para decirte.

En windows el copy tiene una pequeña variación en su sintaxis.
COPY TABLA FROM 'D:\ARCHIVO.txt' with delimiter as ',';

imagino que en la tabla "archivos_cargar" tienes un campo llamado line de tipo string. y que contiene el nombre del archivo que deseas abrir. Me causa curiosidad que todos los archivos tengan 20 letras en el nombre de los archivos. Creo que ahí tienes un error.

Cuando concatenas la sentencia copy con una variable mediante || debes hacer una ejecución de la sentencia ya que esta es dinamica.

Debe ser algo similar a:
cadena:= 'COPY prueba from 'd:/prueba/'' || nombre_archivo;
execute cadena;


Debes tener cuidado con las comillas sencillas. Traen muchos problemas.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:56.