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

Funcion con dblink sin resultado :(

Estas en el tema de Funcion con dblink sin resultado :( en el foro de PostgreSQL en Foros del Web. Hola. Tengo dos bases de datos en postgreSQL. Ambas bases de datos son idénticas, con el mismo número de tablas, y las tablas con la ...
  #1 (permalink)  
Antiguo 09/06/2008, 04:17
 
Fecha de Ingreso: noviembre-2006
Mensajes: 199
Antigüedad: 18 años
Puntos: 2
Funcion con dblink sin resultado :(

Hola. Tengo dos bases de datos en postgreSQL. Ambas bases de datos son idénticas, con el mismo número de tablas, y las tablas con la misma estructura.
Quiero hacer copias de algunas tablas y de algunos registros. Por ejemplo, de la tabla miTabla de la BD1, quiero copiar aquellos registros de código = '001' en la tabla miTabla de la BD2.

Para ello, siguiendo manuales e indicaciones, utilizo dblink, y he creado la siguiente función:

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);

//conn es Connection sobre la BD1 (la que quiero leer y de la que quiero copiar)
Statement stmt1 = conn.createStatement();
stmt1.execute("CREATE OR REPLACE FUNCTION volcadoDatos() RETURNS void AS $$"
+"DECLARE "
+" fila RECORD;"
+"BEGIN"
+" SELECT dblink_connect('dbname = BD2 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?

La llamada la hago así:

CallableStatement proc = conLec.prepareCall("{ ? = call volcadoDatos() }");

proc.execute();
proc.registerOutParameter(1, Types.OTHER);
proc.close();


Pero me muestra el siguiente mensaje de error: A CallableStatement Function was declared but no call to 'registerOutParameter (1, <some_type>)' was made.

Vamos, que estoy algo perdida, y ésto es muy importante para mi y no logro realizarlo. ¿Alguna ayuda?
Muchas gracias por adelantado!

Última edición por ferola; 09/06/2008 a las 04:19 Razón: habia errores
  #2 (permalink)  
Antiguo 09/06/2008, 04:27
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 9 meses
Puntos: 13
Respuesta: Funcion con dblink sin resultado :(

Cita:
Iniciado por ferola Ver Mensaje
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?
Yo también lo creo
Para hacer la funcion generica tendras que currar un poco más, lo que se me ocurre es generar el insert de manera dinamica, para ello mira la tabla information_schema.columns.

A parte de todo esto, lo unico que necesitas es mover datos entre tablas identicas?
Por que no exportas los datos de las tablas que quieras de BD1 y los restauras en BD2?

Salu2
  #3 (permalink)  
Antiguo 09/06/2008, 05:19
 
Fecha de Ingreso: noviembre-2006
Mensajes: 199
Antigüedad: 18 años
Puntos: 2
Respuesta: Funcion con dblink sin resultado :(

Cita:
Iniciado por seyko Ver Mensaje
Por que no exportas los datos de las tablas que quieras de BD1 y los restauras en BD2?

Salu2
Pero no quiero todos los datos de las tablas, solo los que cumplen cierta condición. Eso es lo que pretendo hacer, y he leído por foros y manuales que es con dblink.
No sé si hay otro modo más sencillo, porque es la primera vez que trabajo con dos Bases de datos simultáneamente.
Si tienes alguna sugerencia, la agradezco! :)
Un saludo.
  #4 (permalink)  
Antiguo 09/06/2008, 08:01
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 9 meses
Puntos: 13
Respuesta: Funcion con dblink sin resultado :(

Si solo lo necesitas para "copiar" datos se me ocurre ahora mismo:

- Exportar datos con condiciones, AquaDataStudio lo hace y tiene una version free. En la que hace un export de una tabla con una select y te genera los inserts que lanzarias en la otra BD.
- Generar tu estos insert con la select

Saludos
  #5 (permalink)  
Antiguo 15/06/2008, 12:40
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 2 meses
Puntos: 7
Respuesta: Funcion con dblink sin resultado :(

Sin usar dlink además...
__________________
Gracias de todas todas
-----
Linux!
  #6 (permalink)  
Antiguo 16/06/2008, 07:26
 
Fecha de Ingreso: noviembre-2006
Mensajes: 199
Antigüedad: 18 años
Puntos: 2
Respuesta: Funcion con dblink sin resultado :(

Gracias por vuestras respuestas, me pondré a "conocer" AquaDataStudio, a ver si así logro resolver el problema.
Ya os cuento :)
  #7 (permalink)  
Antiguo 18/11/2009, 08:39
 
Fecha de Ingreso: septiembre-2008
Mensajes: 15
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Funcion con dblink sin resultado :(

Hola a todos,

estoy usando la funcion dblink desde postgres para conectarme a una bd en MS sql server

select dblink_connect('sqlexpress', 'hostaddr=10.0.3.56 dbname=nombreBD user=sa password=123456');

No se si alguno de ustedes sabe como le digo a la anterior linea de codigo que la conexion no es a postgres sino a MSSQL??????

Gracias
  #8 (permalink)  
Antiguo 01/06/2010, 13:19
 
Fecha de Ingreso: septiembre-2008
Mensajes: 15
Antigüedad: 16 años, 1 mes
Puntos: 1
De acuerdo Respuesta: Funcion con dblink sin resultado :(

X si alguno le interesa la respuesta la funcion para comunicar datos de postgres a MS SQl es
dblink_tds($sql,hostMsSql,usuario,contraseña,puert o) as a(variable TEXT);

tiene la limitante con las versiones nuevas de postgres
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 12:07.