Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 07/04/2017 13:52:56
- Michel Depiesse
- Membre
dblink ou postgres fdw ou ?
Bonjour,
Je dois écrire une fonction qui fait un select compliqué sur 3 tables appartenant à deux bases de données.
J'avais commencé avec dblink mais...
create or replace function query_mail returns table( plein de colonnes) as $$
begin
select public.dblink_connect('...
return query select ... (un truc très compliqué)
dblink_disconnect('...
mais le disconnect ne sera jamais atteint, bien sûr.
Y a-t-il moyen de faire un dblink permanent ?
Ou vaut-il mieux utiliser un autre mécanisme que dblink ?
Merci pour votre attention,
mchl
Hors ligne
#2 07/04/2017 14:05:06
- Michel Depiesse
- Membre
Re : dblink ou postgres fdw ou ?
je joins le query à toutes fins utiles :
select
public.dblink_connect('link2contacts', 'hostaddr=x.x.x.x port=5432 dbname=contacts user=x password=xxx');
with
"qryMailPrep"
as (
select
case when "gc_To" like '%rubin%' then 'RECEIVE' else 'SENT' end as "SENT_RECEIVE",
case when "gc_To" like '%rubin%' then "gc_SenderEmailAddress" else "gc_To" end as "EMAIL",
"Mail".*
from
"Mail"
),
"tblContacts"
as (
select
*
from
dblink('link2contacts', 'select "Alpha", "ContactID", "Email1", "Email2" from "tblContacts"')
AS t ( "Alpha" varchar
,"ContactID" integer
,"Email1" varchar
,"Email2" varchar
)
),
"tblContactsSubs"
as (
select
*
from
dblink('link2contacts', 'select "ContactID", "Email1" from "tblContactsSubs"')
AS t ( "ContactID" integer
,"Email1" varchar
)
)
select
"tblContacts"."Alpha", "tblContacts"."ContactID", "qryMailPrep".*
from
"qryMailPrep" INNER JOIN "tblContacts" on "qryMailPrep"."EMAIL" = "tblContacts"."Email1"
union all
select
"tblContacts"."Alpha", "tblContacts"."ContactID", "qryMailPrep".*
from
"qryMailPrep" INNER JOIN "tblContacts" on "qryMailPrep"."EMAIL" = "tblContacts"."Email2"
union all
select
"tblContacts"."Alpha", "tblContacts"."ContactID", "qryMailPrep".*
from
"qryMailPrep" INNER JOIN ("tblContacts" INNER JOIN "tblContactsSubs"
on "tblContacts"."ContactID" = "tblContactsSubs"."ContactID")
on "qryMailPrep"."EMAIL" = "tblContactsSubs"."Email1";
SELECT dblink_disconnect('link2contacts');
Hors ligne
#3 08/04/2017 21:02:01
- dverite
- Membre
Re : dblink ou postgres fdw ou ?
mais le disconnect ne sera jamais atteint, bien sûr.
Si parce que RETURN QUERY ne termine pas l'exécution de la fonction, contrairement à RETURN tout court.
Cf la doc: http://docs.postgresql.fr/9.6/plpgsql-c … tures.html
RETURN NEXT et RETURN QUERY ne quittent pas réellement la fonction -- elles ajoutent simplement zéro ou plusieurs lignes à l'ensemble de résultats de la fonction. L'exécution continue ensuite avec l'instruction suivante de la fonction PL/pgSQL
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
#4 09/04/2017 21:46:42
- gleu
- Administrateur
Re : dblink ou postgres fdw ou ?
Et de toute façon, il est possible de faire un dblink sans dblink_connect.
Guillaume.
Hors ligne
#5 10/04/2017 09:33:15
- Michel Depiesse
- Membre
Re : dblink ou postgres fdw ou ?
Un grand merci à vous deux pour ces précisions.
@Guillaume : pourriez-vous me donner un lien avec un exemple ? car je voudrais éviter de mettre un username/password dans une fonction.
Bonne journée à vous deux
Hors ligne
#6 10/04/2017 21:23:23
- gleu
- Administrateur
Re : dblink ou postgres fdw ou ?
Il y a des exemples sur http://docs.postgresql.fr/9.6/contrib-d … ction.html
Guillaume.
Hors ligne
Pages : 1