Monday, June 9, 2008

RE: [pgsql-es-ayuda] Duda sql bases de datos


Hola: Siguiendo vuestras indicaciones, he creado la función siguiente:

String cod = '001';
String miTabla = "elementosNaturales";
//tiene el mismo nombre y la misma estructura en la BD desde la que copio (BD1) y en la BD a la que escribo (BD2);
 

Statement stmt1 = conn.createStatement();

 

stmt1.execute("CREATE OR REPLACE FUNCTION volcadoDatos() RETURNS void AS $$"

+"DECLARE "

+" fila RECORD;"

+"BEGIN"

+" SELECT dblink_connect('dbname = bd_donde_copiar user = usuario password = 111111);"

+" FOR fila IN SELECT * FROM " + miTabla + " WHERE codigo= '" + cod+ "' LOOP"

+" SELECT dblink_exec('INSERT INTO "+ miTabla +" VALUES(fila)');"

+" END LOOP;"

+" SELECT dblink_disconnect();"

+"END;"

+"$$ LANGUAGE plpgsql;");

 

stmt1.close();

Me ejecuta todo, pero no copia nada en la tabla de BD2. Creo que el problema está en la línea:
+" SELECT dblink_exec('INSERT INTO "+ miTabla +" VALUES(fila)');"
 
Por hacer VALUES(fila) en vez de insertar campo a campo. Lo que pasa es que ambas tablas tienen la misma estructura, son totalmente idénticas, y con muchos campos. Además, ésta función la ejecutaré sobre varias tablas distintas, por lo que tiene que ser genérica. ¿Alguien sabe cómo puedo solucionarlo?
 
Muchas gracias por su ayuda, ésto es muy importante para mi y no consigo hacerlo.
Gracias otra vez.
 
Laura




> Date: Wed, 28 May 2008 12:40:25 -0400
> From: marcoantoniofrias@gmail.com
> To: lauraleyton@hotmail.es
> Subject: Re: FW: [pgsql-es-ayuda] Duda sql bases de datos
> CC: pgsql-es-ayuda@postgresql.org
>
> 2008/5/28 Laura reiva <lauraleyton@hotmail.es>:
> > Hola,
> > La base de datos original no la puedo aumentar más pues ya contiene
> > alrededor de cien tablas y debo realizar ésta "copia" con varias de ellas,
> > por lo que crear una nueva tabla en la base de datos original para cada una
> > de ellas sería muy complejo. Tendré que usar dblink, aunque no lo conozco.
> > Tengo instalado postgreSQL 8.1. ¿Podría explicarme cómo funciona el producto
> > dblink?
>
> 1ro. instalar dblink en la base de datos 1:
>
> $psql -d db1 -U usuario -f /direccion/al/archivo/dblink.sql
>
> 2do. creas una función con un contenido parecido a este:
>
> CREATE OR REPLACE FUNCTION dblink_db1_db2() RETURNS VOID AS $$
> DECLARE
> fila RECORD;
> BEGIN
>
> -- inicias la conexion
> SELECT dblink_connect('dbname=db2 user=usuario password=contrasena');
>
> -- obtienes los registros de la db1 (conexion actual) [puedes hacer
> con cursores también]
> FOR fila IN SELECT * FROM tablaAlumnos_db1 WHERE sexo = 'M' LOOP
> -- insertas en la db2. fila: es la estructura que obtiene de cada
> fila de la tabla
> -- campo1,campo2,etc: son los atributos de la tabla de la 2da base.
> SELECT dblink_exec('INSERT INTO tablaAlumnos_db2 VALUES(' ||
> fila.campo1 || ',' || fila.campo2 || ');');
> END LOOP;
>
> -- cierras la conexion
> SELECT dblink_disconnect();
>
> END;
> $$ LANGUAGE plpgsql;
>
> 3ro. ejecutas la función:
>
> SELECT dblink_db1_db2();
>
> Dale una leída a los archivos dentro de contrib/dblink/doc del código fuente.
>
> --
> Saludos y abrazos...
>
> Marco Antonio Frias Butrón
> Slackware Linux User
> Linux Registered User #356229 - http://counter.li.org/



Sigue al minuto las principales noticias de tu ciudad MSN Deportes

No comments: