Duda sql bases de datos

Lists: pgsql-es-ayuda
From: Laura reiva <lauraleyton(at)hotmail(dot)es>
To: undisclosed-recipients:;
Subject: Duda sql bases de datos
Date: 2008-05-28 08:43:40
Message-ID: BLU134-W26B7C01702905B6EB347B1D6BC0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


Hola a todos,
Estoy realizando una extensión para gvSIG utilizando una Base de datos PostgreSQL, por lo tanto mi duda acerca de SQL la planteo aqui, pues quizás alguno de ustedes puedan ayudarme y no encuentro solución en ningún sitio y me tiene desesperada ésta cuestión pues soy novata tanto con gvSIG como con PostgreSQL.

Tengo dos bases de datos en postgreSQL, en cada una de ellas tengo varias tablas. Sobre la Base de datos 1 quiero hacer una consulta sobre una de sus tablas, filtrando el resultado por un campo. Es decir, quiero hacer:
SOBRE LA BASE DE DATOS 1SELECT * FROM tablaAlumnos WHERE sexo = 'M';Y las filas que me de como resultado quiero insertarlas TODAS en una nueva tabla en la BASE DE DATOS 2 llamada dicha tabla AlumnosHombres que tiene exactamente las mismas columnas, y del mismo tipo que la tabla tablaAlumnos.¿Cómo puedo hacerlo? Había pensado con la sentencia Select..Insert into; pero como son dos bases de datos no sé cómo ejecutarla.

Gracias, un saludo.
_________________________________________________________________
La vida de los famosos al desnudo en MSN Entretenimiento
http://entretenimiento.es.msn.com/


From: Laura reiva <lauraleyton(at)hotmail(dot)es>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: FW: Duda sql bases de datos
Date: 2008-05-28 09:43:42
Message-ID: BLU134-W17F2458DE71AD5427241AAD6BC0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

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? Gracias por su ayuda. Laura

> Date: Wed, 28 May 2008 06:33:34 -0300> From: silvioq(at)gmail(dot)com> To: lauraleyton(at)hotmail(dot)es> Subject: Re: [pgsql-es-ayuda] Duda sql bases de datos> > Hola Laura:> Fijate que no mandaste a la lista el correo. Quizás recibas varias> contestaciones particulares, pero ninguna será publicada.> > Tenés dos formas.> La primera es instalar el producto dblink que te permite acceder desde> una base hasta la otra.> La segunda es duplicar la tabla alumnosHombres en la base de origen y> luego "bajarla" en un servidor y "subirla" en el otro.> > una cosa así.> > psql base_origen -c "select * into hombres from alumnos where sexo = 'M'"> pg_dump base_origen -t hombres -a | psql base_destino> > No recuerdo bien los parámetros de la línea de comando, pero debe ser algo así.> Saludos,> Silvio> > El día 28 de mayo de 2008 5:43, Laura reiva <lauraleyton(at)hotmail(dot)es> escribió:> >> > Hola a todos,> > Estoy realizando una extensión para gvSIG utilizando una Base de datos> > PostgreSQL, por lo tanto mi duda acerca de SQL la planteo aqui, pues quizás> > alguno de ustedes puedan ayudarme y no encuentro solución en ningún sitio y> > me tiene desesperada ésta cuestión pues soy novata tanto con gvSIG como con> > PostgreSQL.> >> > Tengo dos bases de datos en postgreSQL, en cada una de ellas tengo varias> > tablas. Sobre la Base de datos 1 quiero hacer una consulta sobre una de sus> > tablas, filtrando el resultado por un campo. Es decir, quiero hacer:> >> > SOBRE LA BASE DE DATOS 1> > SELECT * FROM tablaAlumnos WHERE sexo = 'M';> >> > Y las filas que me de como resultado quiero insertarlas TODAS en una nueva> > tabla en la BASE DE DATOS 2 llamada dicha tabla AlumnosHombres que tiene> > exactamente las mismas columnas, y del mismo tipo que la tabla tablaAlumnos.> >> > ¿Cómo puedo hacerlo? Había pensado con la sentencia Select..Insert into;> > pero como son dos bases de datos no sé cómo ejecutarla.> >> > Gracias, un saludo.> >> > ________________________________> > Sigue los principales acontecimientos deportivos en directo. MSN Motor> > > > -- > Silvio Quadri

Sigue los principales acontecimientos deportivos en directo. MSN Motor
_________________________________________________________________
Tecnología, moda, motor, viajes,…suscríbete a nuestros boletines para estar siempre a la última
http://newsletters.msn.com/hm/maintenanceeses.asp?L=ES&C=ES&P=WCMaintenance&Brand=WL&RU=http%3a%2f%2fmail.live.com


From: "Marcos Saldivar" <baron(dot)rojo(dot)cuerdas(dot)de(dot)acero(at)gmail(dot)com>
To: "Laura reiva" <lauraleyton(at)hotmail(dot)es>
Cc: "Lista Postgres ES" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Duda sql bases de datos
Date: 2008-05-28 13:17:34
Message-ID: 1c4d91ab0805280617t19dc4fa2g332d5762da6c2580@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

El día 28 de mayo de 2008 4:43, Laura reiva <lauraleyton(at)hotmail(dot)es> escribió:
>
> Hola a todos,
> Estoy realizando una extensión para gvSIG utilizando una Base de datos
> PostgreSQL, por lo tanto mi duda acerca de SQL la planteo aqui, pues quizás
> alguno de ustedes puedan ayudarme y no encuentro solución en ningún sitio y
> me tiene desesperada ésta cuestión pues soy novata tanto con gvSIG como con
> PostgreSQL.
>
> Tengo dos bases de datos en postgreSQL, en cada una de ellas tengo varias
> tablas. Sobre la Base de datos 1 quiero hacer una consulta sobre una de sus
> tablas, filtrando el resultado por un campo. Es decir, quiero hacer:
>
> SOBRE LA BASE DE DATOS 1
> SELECT * FROM tablaAlumnos WHERE sexo = 'M';
>
> Y las filas que me de como resultado quiero insertarlas TODAS en una nueva
> tabla en la BASE DE DATOS 2 llamada dicha tabla AlumnosHombres que tiene
> exactamente las mismas columnas, y del mismo tipo que la tabla tablaAlumnos.
>
> ¿Cómo puedo hacerlo? Había pensado con la sentencia Select..Insert into;
> pero como son dos bases de datos no sé cómo ejecutarla.

esto lo deseas hacer solo una vez ? si es asi porque no simplificas la
vida y haces un dumb de la tabla en la db 1 y lo restauras en la db 2
???


From: "Marco Antonio Frias Butron" <marcoantoniofrias(at)gmail(dot)com>
To: "Laura reiva" <lauraleyton(at)hotmail(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: FW: Duda sql bases de datos
Date: 2008-05-28 16:40:25
Message-ID: 33e030de0805280940i514fc0e4xd9f1384f1fcec6e4@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2008/5/28 Laura reiva <lauraleyton(at)hotmail(dot)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/


From: Laura reiva <lauraleyton(at)hotmail(dot)es>
To: Marco Antonio Frias Butron <marcoantoniofrias(at)gmail(dot)com>, "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Duda sql bases de datos
Date: 2008-06-04 10:32:01
Message-ID: BLU134-W183FE594645B639F0984CED6B50@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola, gracias a todos por vuestras respuestas.
He instalado el paquete dblink sobre la base de datos en la que quiero escribir, pues desde ella accederé a la base de datos de lectura.
Todo ésto debo ejecutarlo desde mi programa Java, integrándolo en el código o bien desde un archivo externo que ejecute en el postgreSQL desde pgAdmin.

Instalando el paquete dblink, la conexión y la sentencia me queda de la siguiente forma:

SELECT dblink_connect('link_volcarDatos','host=localhost port=5432 dbname=BD1 user=postgres password=1111);

//BD1, es la base de datos de lectura.
//BD2, es la base de datos de escritura.

//miTabla_deBD2 es el nombre de la tabla de la BD2, sobre la que escribir
//tablaGlobal_deBD1 es el nombre de la tabla de BD1, sobre la que leer los datos

Select * from dblink('link_volcarDatos', 'INSERT INTO miTabla_deBD2 SELECT * FROM tablaGlobal_deBD1 WHERE cod='001' )
AS reg_resultado();

SELECT dblink_disconnect('link_volcarDatos');

No sé si ésto está bien realizado, y en caso de que si lo esté pues no sé como ejecutarlo desde Java. Mis consultas SQL siempre las hice creando Conenction, Statement, etc. Y en éste caso, no sé si debo realizarlo usando el Statement sobre la BD de lectura o de Escritura, o ninguna. Ando perdidísima, creo que se nota.

En caso de realizarlo usando una función, como me ha recomendado Marco Antonio, no sé como insertarla en mi código Java o bien, si tenerla en un archivo de texto aparte y llamarla para ejecutar desde Java.

Por favor, necesito vuestra ayuda que no consigo avanzar nada. Muchas gracias. Un saludo enorme a todos.

> Date: Wed, 28 May 2008 12:40:25 -0400> From: marcoantoniofrias(at)gmail(dot)com> To: lauraleyton(at)hotmail(dot)es> Subject: Re: FW: [pgsql-es-ayuda] Duda sql bases de datos> CC: pgsql-es-ayuda(at)postgresql(dot)org> > 2008/5/28 Laura reiva <lauraleyton(at)hotmail(dot)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/
_________________________________________________________________
Tecnología, moda, motor, viajes,…suscríbete a nuestros boletines para estar siempre a la última
Guapos y guapas, clips musicales y estrenos de cine.


From: "Marco Antonio Frias Butron" <marcoantoniofrias(at)gmail(dot)com>
To: "Laura reiva" <lauraleyton(at)hotmail(dot)es>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Duda sql bases de datos
Date: 2008-06-05 00:30:15
Message-ID: 33e030de0806041730m6636f811qce86088ca3007b00@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2008/6/4 Laura reiva <lauraleyton(at)hotmail(dot)es>:
>
> En caso de realizarlo usando una función, como me ha recomendado Marco
> Antonio, no sé como insertarla en mi código Java o bien, si tenerla en un
> archivo de texto aparte y llamarla para ejecutar desde Java.
>
> Por favor, necesito vuestra ayuda que no consigo avanzar nada. Muchas
> gracias. Un saludo enorme a todos.

Yo te aconsejo que lo tengas las sentencias que escribiste en una
función y llamas a la función utilizando la clase CallableStatement...
dale una leida a la documentación de JDBC en:

http://jdbc.postgresql.org/documentation/83/callproc.html

--
Saludos y abrazos...

Marco Antonio Frias Butrón
Slackware Linux User
Linux Registered User #356229 - http://counter.li.org/


From: Laura reiva <lauraleyton(at)hotmail(dot)es>
To: undisclosed-recipients:;
Subject: RE: Duda sql bases de datos
Date: 2008-06-09 09:04:49
Message-ID: BLU134-W3184C9900F3300E01C64A0D6B00@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

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(at)gmail(dot)com> To: lauraleyton(at)hotmail(dot)es> Subject: Re: FW: [pgsql-es-ayuda] Duda sql bases de datos> CC: pgsql-es-ayuda(at)postgresql(dot)org> > 2008/5/28 Laura reiva <lauraleyton(at)hotmail(dot)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/
_________________________________________________________________
Tecnología, moda, motor, viajes,…suscríbete a nuestros boletines para estar siempre a la última
http://newsletters.msn.com/hm/maintenanceeses.asp?L=ES&C=ES&P=WCMaintenance&Brand=WL&RU=http%3a%2f%2fmail.live.com