首页 > 解决方案 > PostgreSQL 函数返回“查询没有结果数据的目的地”

问题描述

我写了这个函数:

CREATE OR REPLACE FUNCTION select_all_sessions(rettype anyelement, dbname varchar(30))
RETURNS SETOF anyelement AS $$
        DECLARE
                sess VARCHAR;
        BEGIN
                FOR sess IN SELECT session
                            FROM dblist
                LOOP
                    IF EXISTS (SELECT *
                                FROM pg_database
                                WHERE datname = sess) THEN
                        SELECT dblink_connect('dblinktest' || sess, 'host=localhost port=5432 dbname=' || sess || ' user=postgres password=password');
                        SELECT *
                        FROM dblink('dblinktest'||sess,
                        'SELECT * FROM ' || dbname || ';');
                    END IF;
                END LOOP;
        END;
$$ LANGUAGE plpgsql;

这意味着要在一个服务器上运行,其中有多个数据库,里面有相同的表。表 dblist 包含服务器上存在的所有数据库,但其中一些可能不再存在,所以我必须在使用 dblink 之前检查它是否存在。目标是一次查询所有数据库中的表。创建函数查询有效,但是当我尝试使用该函数时,它说“查询没有结果数据的目的地。”。我是 PL/PGSQL 世界的新手,请帮助 :(

标签: sqlpostgresqlplpgsql

解决方案


尝试不dblink_connect()SELECT. 并将查询的结果添加到返回的结果中,并在末尾添加RETURN QUERY一个 final (参见“40.6.1.2.)。RETURNRETURN NEXTRETURN QUERY

CREATE OR REPLACE FUNCTION select_all_sessions(rettype anyelement, dbname varchar(30))
RETURNS SETOF anyelement AS $$
        DECLARE
                sess VARCHAR;
        BEGIN
                FOR sess IN SELECT session
                            FROM dblist
                LOOP
                    IF EXISTS (SELECT *
                                FROM pg_database
                                WHERE datname = sess) THEN
                        dblink_connect('dblinktest' || sess, 'host=localhost port=5432 dbname=' || sess || ' user=postgres password=password');
                        RETURN QUERY SELECT *
                        FROM dblink('dblinktest'||sess,
                        'SELECT * FROM ' || dbname || ';');
                    END IF;
                END LOOP;
                RETURN;
        END;
$$ LANGUAGE plpgsql;

推荐阅读