PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 07/04/2017 13:52:56

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

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 ?

Michel Depiesse a écrit :

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

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.

Hors ligne

#5 10/04/2017 09:33:15

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 ?

Hors ligne

Pied de page des forums