Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
Et de toute façon, il est possible de faire un dblink sans dblink_connect.
Guillaume.
Hors ligne
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
Il y a des exemples sur http://docs.postgresql.fr/9.6/contrib-d … ction.html
Guillaume.
Hors ligne
Pages : 1