web-dev-qa-db-fra.com

PostgreSQL: La requête n'a pas de destination pour les données de résultat

J'essaie d'extraire des données de la base de données distante en utilisant dblink via une fonction, mais en obtenant une erreur "la requête n'a pas de destination pour les données de résultat". J'utilise le langage plpgsql pour faire la même chose. 

Une fonction

CREATE OR REPLACE FUNCTION fun()
  RETURNS text AS
$$
begin
select dblink_connect(
      'port=5432 dbname=test user=postgres password=****');

WITH a AS (
SELECT *
FROM dblink(
    'SELECT slno,fname,mname,lname
    FROM    remote_tbl'
     ) AS t (slno int, fname text, mname text, lname text)
)
, b AS (
INSERT INTO temptab1
SELECT slno, name
FROM   a
)
, c AS (
INSERT INTO temptab2
SELECT slno, name
FROM   a
)
INSERT INTO temptab3
SELECT slno, name
FROM   a;


select dblink_disconnect();
end;
$$ 
LANGUAGE plpgsql;

Fonction d'appel :

select fun();

Erreur : la requête n'a pas de destination pour les données de résultat

14
Meem

La procédure stockée ne renverra pas simplement le résultat du dernier SELECT. Vous devez réellement renvoyer la valeur:

CREATE OR REPLACE FUNCTION fun() RETURNS text AS $$
BEGIN
    --- ....
    RETURN(SELECT dblink_disconnect());
END
$$ LANGUAGE plpgsql;

Vous obtenez l'erreur car Postgres s'attend à ce que la fonction retourne quelque chose de type text, mais votre fonction ne renvoie rien.

31
SL2

La réponse de SL2 était juste, mais vous pouvez l'écrire rapidement:

CREATE OR REPLACE FUNCTION fun() RETURNS text AS $$
BEGIN
    --- ....
    RETURN(SELECT dblink_disconnect());
END
$$ LANGUAGE plpgsql;
1
merqlove