PostgreSQL函数返回“查询没有结果数据的目的地”

时间:2019-07-24 16:39:01

标签: sql postgresql plpgsql

我写了这个函数:

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领域的新手,请帮助:(

1 个答案:

答案 0 :(得分:0)

尝试在没有dblink_connect()的情况下呼叫SELECT。并将查询的结果添加到返回的结果中,并使用RETURN QUERY,最后使用最后一个RETURN(请参阅"40.6.1.2. RETURN NEXT and RETURN 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;