我写了这个函数:
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领域的新手,请帮助:(
答案 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;